21. 抽象类和接口的区别
21. 抽象类和接口的区别
语法层面上:
- 抽象类的关键字是abstract,接口是interface
- 抽象类里面成员变量可以是任意类型,接口里面只能是static final,必初始化。
- 抽象类里成员方法可以是abstract或者是实际的实现类,Java8前,接口里方法必须是abstract,8后,默认方法为default 静态方法static
- 抽象类里可以定义构造器,接口里不能定义构造器,不能实例化。
- 抽象类里变量和方法的访问修饰符可以说任意的,接口里方法默认是public ,变量默认是 public static final
- 抽象类只能被一个类继承,接口可以被多个类实现 (单继承多实现)
- 抽象类支持静态代码块和静态方法,接口中支持静态方法,不支持静态代码块
设计层面是:
- 抽象类是对一种事物的抽象,也就是对类的抽象。而接口是对行为的抽象。抽象类
包括属性和行为,而接口是对行为进行抽象。
- 抽象类是进行一种模板的设计,而接口是一种规范的设计
抽象类示例:
abstract class Animal {protected String name;public Animal(String name) {this.name = name;}abstract void makeSound(); // 抽象方法public void sleep() { // 具体方法System.out.println(name + " is sleeping");}
}class Dog extends Animal {public Dog(String name) {super(name);}@Overridevoid makeSound() {System.out.println(name + ": Woof!");}
}
接口示例:
interface Flyable {void fly(); // 抽象方法default void floatOnWater() { // 默认方法(Java 8+)System.out.println("Floating...");}static boolean isAquatic() { // 静态方法(Java 8+)return false;}
}class Bird implements Flyable {@Overridepublic void fly() {System.out.println("Bird is flying");}
}