特征和区别
【抽象类】
成员变量(无要求,可以有private)
- 和普通类一样,没有特殊的要求
- 也就是说可以有private的成员变量,不能被子类直接访问
那么子类想访问抽象类的私有成员变量并赋值时,只能通过两种办法:一个是通过公有的get/set方法,另一个就是通过调用父类构造方法super()来实现私有变量的初始化。
构造方法(一定有)
- 虽然自带无参构造方法,但是自己无法new对象
- 子类new对象的时候,子类构造器第一行默认调用super(),即使父类是抽象类
- 作用:当需要给通用的变量初始化赋值时,子类可以通过super()调用抽象类无参构造来实现
成员方法(抽象类可以没有抽象方法,但反过来不行)
- 如果有类中有抽象方法,那么这个类必须定义为抽象类
- 但是定义一个抽象类的时候,里面可以不放抽象方法
- 抽象方法不能用private,static,final修饰
abstract修饰符(不能与private,static,final一起使用)
- private修饰的方法不能被子类访问,但是抽象方法还需要子类重写,互相矛盾
- static修饰的方法可以通过类直接调用,但是抽象方法没有实体,调用也没有任何作用
- final修饰的方法不能重写,但是抽象方法必须要重写,互相矛盾
【接口】
成员变量(只能是常量)
- 必须是public static final
构造方法(没有)
- 也不能自定义构造方法,否则编译出错
成员方法(java8支持default,java9支持private)
-
默认public abstract 修饰,但是可以省略,注意没有写方法体的花括号{}
例如:public abstract void show(); 或是 void show(); -
java8之后可以有默认方法default,注意一定要有方法体{}
例如:default void show() {方法体}
作用:实现类可以直接调用,或是重写后调用 -
java9之后可以有私有方法,注意一定要有方法体{}
例如:private void show() {方法体}
作用:接口中对外暴露的方法,就是default方法需要一些接口内部处理的时候,可以考虑接口私有方法
【区别】
- 接口不能有构造方法,抽象类可以有
- 在接口中凡是变量必须是public static final,而在抽象类中没有要求
- 接口可以被多实现,而抽象类只能被单继承
- 接口可以继承多个接口,而抽象类只能继承单个类
参考文章
https://www.liangzl.com/get-article-detail-9892.html
https://blog.csdn.net/YuanMxy/article/details/74389953
https://blog.csdn.net/JW614718/article/details/88410215