// NoAbstractMethodClass obj = new NoAbstractMethodClass();
复制代码
2. 抽象类可以继承非抽象类吗?
可以。抽象类可以继承普通类,此时需实现普通类中的所有抽象方法(若有),或自身声明为抽象类。
class SuperClass { // 普通类
public void method() {}
}
abstract class SubAbstractClass extends SuperClass { // 抽象类继承普通类
public abstract void abstractMethod(); // 新增抽象方法
}
复制代码
3. 抽象类 vs 接口(interface):如何选择?
维度抽象类(abstract class)接口(interface)关系“is-a”(子类是父类的一种,如Circle is a Shape)“has-a”(类具备某种能力,如Bird has Flyable)方法实现可包含抽象方法和非抽象方法(具体实现)Java 8前只能有抽象方法,之后可含默认方法(default)、静态方法变量可包含任意变量(静态/实例、final/非final)只能包含public static final常量继承单继承(一个子类只能继承一个抽象类)多实现(一个类可实现多个接口)构造器有构造器(供子类调用)无构造器选择原则:若需定义“模板类”(包含共性实现+部分抽象方法),用抽象类;若需定义“能力规范”(纯抽象或多默认方法),用接口。
结语