抽象类与接口的区别&抽象类中构造方法的作用(super关键词调用父类构造方法的作用)
抽象类特点
- 抽象类中可以有普通成员方法, 抽象类中的成员方法的权限修饰符可以是任意;
抽象类中可以有main方法,但是一般不会这么做; - 抽象类中可以有抽象方法, 抽象类中的抽象方法的权限修饰符不能为private;
- 抽象类中可以没有抽象方法;
- 抽象类中可以有构造方法, 抽象类中的构造方法的权限修饰符可以是任意;
- 抽象类中可以有变量, 也可以有常量;
- 普通类中有的, 抽象类中都可以有,包括静态方法,静态变量,静态代码块,构造代码块等;
唯一不同的就是抽象类中可以定义抽象方法, 并且抽象方法权限修饰符不能为private;
抽象类不能被实例化,因为实例化才能调用方法,但是抽象方法没有方法体,调用无意义;
abstract关键字不能和哪些关键字共存
- abstract 不能和
private
共存,冲突。
抽象方法需要被实现,加了 private 的方法不能被继承,更不能被实现。 - abstract 不能和
static
共存,我无意义。
static 修饰的方法能通过类名调用,通过类名调用抽象方法无意义。 - abstract 不能和
final
共存,冲突。
抽象类需要有子类,加了 final 的类不能被继承。
抽象方法需要被实现,加了 final 的方法不能被实现。
接口特点(JDK8以前)
-
接口中的所有方法默认是 “public abstract” 修饰的, 不能更改;
-
接口中的所有变量默认是 “public static final” 修饰的, 不能更改;
在java中,我们经常将常用的常量定义在接口中以便使用;例如在接口中定义常用的http响应码;访问方式:“接口名.常量名”
; -
接口中不能有任何代码块;
- 关于JDK8后的接口的特点,见我的另一篇博客:JDK8中接口的变化
类和接口的继承与实现规则
- 具体类能继承具体类;只能单继承;
- 具体类能继承抽象类;只能单继承; 具体类必须实现抽象类中所有的抽象方法;
- 抽象类能继承具体类(所有的类都继承子Object,包括抽象类,Object是一个具体类);只能单继承;
- 抽象类能实现接口;可以多实现;不必实现接口中的抽象方法;
- 具体类能实现接口;可以多实现;必须实现接口中所有的抽象方法;
- 接口能继承接口;可以多继承;
- 如果具体类实现了接口a,接口a继承了接口b,那么具体类必须实现接口a和接口b中所有的抽象方法。
抽象类中构造方法的作用(super关键词调用父类构造方法的作用)
- 这里说的不只是抽象类中构造方法的作用,
而是 “super关键词调用父类构造方法的作用”。
- 注意: 父类的构造器中,也会默认调用爷爷类的构造方法( super(); )…
最终会调用Object类的无参构造。 Object类中没有成员变量,因此不会有Object类的变量被继承下来。