Java基础十五(抽象类、接口)

抽象类

在我们定义一些子类的是发现其中有相同行为那么可以将这些相同的行为抽取出到父类有一个问题就是,这些行为只能由具体的子类去实现,但是放到父类中,不符合基本逻辑,我们不能以偏概全 ,所以父类当中中的这个函数就不能具体实现,不能有具体的函数体 ,所以讲该函数定义为抽象函数,函数具体如何实现 由子类决定,重写决定 。那么,具有抽象函数的类 就称之为抽象类

当定义了抽象函数的类也必须被abstract关键字修饰,被abstract关键字修饰的类是抽象类。

抽象类的特点

  1. 抽象类和抽象方法都需要被abstract修饰。抽象方法一定要定义在抽象类中。
  2. 抽象类不可以创建对象,原因:调用抽象方法没有意义。
  3. 只有覆盖了抽象类中所有的抽象方法后,其子类才可以实例化。否则该子类还是一个抽象类。
  4. 一个子类继承自抽象类时,如果没有完全重写抽象函数,那么这个类也必须是抽象的
  5. 之所以继承,更多的是在思想,是面对共性类型操作会更简单

扩展

  • 抽象类一定是父类? 是的,因为是不断抽取而来的。
  • 抽象类一定要有抽象函数? 可以没有,但是这样抽象类存在的意义仅仅是不让该类创建对象。
  • 抽象类是否有构造函数? 有,虽然不能给自己的对象初始化,但是可以给子类的对象初始化 。

抽象类与一般类的异同点:

  1. 相同:

    它们都是用来描述事物的
    它们之间都可以定义属性和行为
    
  2. 不同:

    一般类可以具体的描述事物,抽象类描述事物的信息不具体
    抽象类中可以多定义一个成员:抽象函数
    一般类可以创建对象,抽象类不能创建对象
    

抽象关键字abstract不可以与那些关键字共存

  1. final:final修饰的类时无法被继承的,而abstract修饰的类必须有子类。final修饰的方法无法被覆盖,而abstract修饰的方法必须由子类去实现
  2. static:静态修饰的方法属于类的,它在静态方法区中,和对象没有关系了,而抽象方法没有方法体,通过类名调用它没有任何意义
  3. private:私有的方法是无法被继承的,也不存在覆盖,而abstract和private一起修饰方法,abstract要子类去实现这个方法,而private修饰,子类根本无法得到父类的这个方法,互相矛盾

接口

接口的由来
如果抽象类中的方法全是抽象的,那么这个抽象类就可以用接口来表述,接口就是一个特殊的抽象类。

接口的定义
定义普通的类或者抽象类可以使用class关键字,定义接口必须interface关键字完成,即用interface代替class,此时类和接口之间只能是实现关系,并且接口此时已经不能在当做类去看待了

interface class Demo
{
        abstract void show1();
        abstract void show2();
}

接口中成员的特点

  1. 接口中可以定义变量,但是变量必须有固定的修饰符修饰,public static final 所以接口中的变量也称之为常量。
  2. 接口中可以定义方法,方法也有固定的修饰符,public abstract
  3. 接口中的成员都是公共的。
  4. 接口不可以创建对象。
  5. 子类必须覆盖掉接口中所有的抽象方法后,子类才可以实例化。否则子类是一个抽象类

接口解决多继承的弊端
多继承弊端:多继承时,当多个父类中有相同功能时,子类调用会产生不确定性。其实核心原因就是在于多继承父类中功能有主体,而导致调用运行时,不确定运行哪个主体内容(二义性)。
接口将多继承这种机制在java中通过多实现完成了,为什么多实现就解决了呢?
因为接口中的功能都没有方法体,由子类来明确

接口:1.为类添加功能 2.作为一种中间传递(规范 规约)

1、类与接口之间多实现关系:给类多加功能,子类必须和接口产生关系,类与类的关系是继承,类与接口之间的关系是 实现。通过关键字 implements

2、类继承类同时实现接口
子类通过继承父类扩展功能,通过继承扩展的功能都是子类应该具备的基础功能(先天有的)。如果子类想要继续扩展其他类中的功能呢?这时通过实现接口来完成(后天添加的)接口的出现避免了单继承的局限性。父类中定义的事物的基本功能。接口中定义的事物的扩展功能。

3、接口多继承
多个接口之间可以使用extends进行继承,只保留函数声明,并未指定具体执行,所以不会产生二义性

4、在开发中如果多个接口中存在相同方法,这时若有个类实现了这些接口,那么就要实现接口中的方法,由于接口中的方法是抽象方法,子类实现后也不会发生调用的不确定性

接口在开发中的好处

  1. 接口的出现扩展了功能。
  2. 接口其实就是暴漏出来的规则。
  3. 接口的出现降低了耦合性,即设备与设备之间实现了解耦。
    接口的出现方便后期使用和维护,一方是在使用接口(如电脑),一方在实现接口(插在插口上的设备)。例如:笔记本使用这个规则(接口),电脑外围设备实现这个规则(接口)
接口和抽象类的区别

相同点:

都位于继承的顶端,用于被其他实现或继承;
都不能实例化(不能创建对象);
都包含抽象方法,其子类都必须覆写这些抽象方法;

区别:

抽象类为部分方法提供实现,避免子类重复实现这些方法,提供代码重用性;接口只能 包含抽象方法;
一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口;(接口弥补了Java的 单继承)

二者的选用:

优先选用接口,尽量少用抽象类;
需要定义子类的行为,又要为子类提供共性功能时才选用抽象类

发布了70 篇原创文章 · 获赞 56 · 访问量 1995

猜你喜欢

转载自blog.csdn.net/qq_43624033/article/details/103425054