抽象类
应用场景:
某个父类只是限定其子类应该包含怎样的方法,但不需要准确知道这些子类如何实现这些方法
抽象类存在的意义:
- 为其子类提供一个公共类型(父类引用指向子类对象)
- 封装子类中的重复内容(成员变量和方法)
- 限制子类的设计随意性,在一定程度上避免了无意义父类的实例化
声明语法:
abstract class <类名>{
成员变量;
方法(){方法体};
abstract 方法();
}
特点:
- 抽象类不允许被实例化,只能作为其他类的父类
- 当类中存在抽象方法,则必须声明为抽象类,但抽象类中可以没有抽象方法
- 一个类继承抽象类后,必须实现其所有抽象方法,否则也是抽象类
- abstract方法不能用private和static修饰,抽象类不能同时用final和abstract修饰
接口
某几个类不具有相同特征,但具有相同能力,接口可以用来规定一些行为规范
- 接口中抽象方法可以不写abstract关键字,修饰符默认为public
- 当类实现接口时,需要去实现接口中的所有抽象方法,否则需要该类设置为抽象类
- 接口中的常量默认为public static final修饰的,必须进行实例化
- 默认方法(default修饰,默认修饰符为public可缺省)、静态方法(static修饰)(都可以有方法体,可以不用实现),调用默认方法:接口名.super.method();静态方法可以通过接口名调用
- 向上转型:接口名 对象名称= new 实现了接口的类名();功能与抽象类类似
- 当一个类继承的多个接口中有同名的默认方法时,需要重写方法,当继承的父类中也有同名的方法时,则不用进行重写。
- 在接口中,子接口可继承多个父接口
- 接口在单继承时,可继承父接口的常量,抽象方法,默认方法,不可继承静态方法;在多继承时只继承抽象方法,常量和默认方法无法确定使用哪个,在继承类中也有相同常量名时也无法分辨。
比较: