相同点:
-
二者都不能实例化
-
都是引用类型
-
都可以包含抽象方法
-
区别 | 抽象类 | 接口 |
---|---|---|
多继承 | 子类只能继承一个抽象类(继承关系是单继承) | 子类可以实现多个接口(接口与接口之间可以进行多继承) |
成员 | 抽象类中可以有实例成员、类成员、抽象方法 | 接口中只能有抽象方法和常量,在JDK8.0之后可以有Static和default方法 |
实现 | 子类使用extends继承抽象类 | 子类使用implements实现接口 |
成员变量修饰符 | 抽象类中既可以定义常量也可以定义变量 | 接口中只能定义常量(使用public static final修饰) |
子类实现 | 子类在实现抽象方法时不允许缩小访问权限 | 子类在实现接口中的抽象放大时必须指定为public |
构造方法 | 抽象类中可以有构造方法 | 接口中不能定义构造方法 |
最高层 | 类的最高层是Object | 接口没有最高层 |
抽象类:使用static修饰的类
抽象类不一定有抽象方法,有抽象方法的一定是抽象类
抽象类不能被实例化的原因:
应为抽象类中有抽象方法,抽象方法没有方法体,抽象类不是完整的类,因此不能实例化。
static 和final不能一起使用。
子类必须实现抽象类中所有的抽象方法,否则子类就要定义为抽象类
面向对象的设计原则
-
摘取代码中变化的行为,形成接口
-
多用组合,少用继承
-
针对接口编程,不依赖于具体实现
-