抽象类和接口
抽象类
- 被abstract修饰的方法为抽象方法,只能声明,不能有具体实现,具体实现在子类中
- 一个类中只要有一个abstract方法就得声明为抽象类
- 抽象类不能被创建实例,会编译错误
- 可以将一个不包含抽象方法的类声明为抽象类,这样做是为了阻止类的具体实例的创建
abstract class Basic {
abstract void unimplemented();
}
-
抽象类的子类必须为所有抽象方法提供具体实现。如果不这么做,新的子类就必须也要声明为抽象类,同时方法也要声明为抽象方法
abstract class Basic2 extends Basic { int f() { return 111; } abstract void g() { // unimplemented() still not implemented } }
抽象类中的抽象方法默认为public权限,且只能使用public 和 protected 修饰抽象方法,provate被禁止(因为provate方法也不能被继承呀)
接口
由于一个类只能实现一个抽象方法,故出现了接口,一个类可以实现多个接口
接口的创建
Java8之前和之后的接口有些许变化。
共性
- 接口的默认权限是public,且只能是public
- 接口不允许存在对象属性,可以有静态属性。在声明时就初始化好的变量默认是 static & final 的。字段必须被初始化,可以使用非常量表达式初始化
- 接口也能继承父接口,且和类继承不一样的是,一个接口可以继承多个接口
Java8之前
public interface PureInterface {
int value = 1; // 必须被初始化,否则编译错误
int m1();
void m2();
double m3();
}
- 接口只允许抽象方法
- 接口中的方法不能有具体实现,都是抽象方法
Java8之后
-
提供了默认方法:使用default修饰,为接口方法的实现提供了默认实现
public interface DefaultInterface { default void defaultFunc() { System.out.println("默认方法"); } }
支持接口中的静态方法
实现多个接口
- 多个接口中有相同的方法名和相同的参数列表,会编译报错。不过可以Override这个方法,重写之后新方法覆盖了接口。
- 不同接口中有相同的方法名和不同的参数列表(重载),可以使用(Java8新特性)