抽象类:
(1)抽象类中的成员变量可以是变量,即没有抽象类特有的修饰符(public final abtract);
也可以是常量,也就是可以被public final abstract修饰的变量。
既然可以存在变量和常量,那么我们就必须手动添加public final。
(2)有构造函数。
1、像普通类一样,抽象类可以拥有构造方法,用于父类成员变量的初始化;无參构造会对本类私有属性进行默认初始化,因为它里面什么形参也没有,所以不赋一个具体的值;而有参构造则会对本类私有属性进行显性初始化,意思就是把形参的值赋给私有属性。
2、抽象类的构造函数之所以是用于子类访问父类数据的初始化,我个人觉得是因为子类一旦继承父类,就会首先访问父类,对父类进行初始化,因为构造方法是分配内存的实现,那么,子类如何才能更方便地分配内存呢?很显然,就是调用父类的构造方法来分配父类部分的内存,然后再调用自己的构造方法来分配子类拓展的内存。否则,如果子类完全从头开始自己分配内存,那么继承父类又有什么优点呢?因为子类有一部分是和父类完全一样的,有必要自己再从头开始分配内存吗?既然父类已经有现成的方法了,那么为什么不直接调用来分配父类部分的内存呢?所以就要先对父类进行初始化,对父类中的私有属性和我们不知道的一些参数进行初始化。
(3)抽象类中的成员方法一定要被子类全部复写,强迫子类一定要去复写父类。
(4)抽象类只能被子类单继承。
(5)抽象类的成员方法可以有方法体。
接口:
(1)接口类中的成员变量全部都是被public static final修饰的常量,所以如果我们没有添加,那么它会自动帮我们添加。
所以,接口中的常量我们可以直接利用 类名.成员变量来调用。
(2)无构造函数。
1、有一个规则就是,接口不能实例化,所以也就相当于没有构造方法,也就相当于没有为父类分配内存,也就相当于不能对父类进行初始化。
2、那父类没有构造方法的话,那么子类构造方法里面的super()指向的是谁呢?我们都知道,所有父类的父类都叫做Object类,所以super()指向的当然是Object类。
(3)接口可以被子类多实现。
1941

被折叠的 条评论
为什么被折叠?



