定义规则
- 抽象类和抽象方法必须使用abstract修饰符修饰,抽象方法不能有方法体
- 抽象类不能被实例化。即使抽象类里不包含抽象方法。
- 抽象类可以包含成员变量、方法(包括普通方法和抽象方法)、构造器、初始化块、内部类5种成分。抽象类的构造器只用于被子类调用。
- 含有抽象方法的类只能被定义为抽象类。
抽象类和接口的区别
| Abstract class | Interface |
|---|---|
| 可以有抽象方法、非抽象方法、静态方法,可以定义 public、protected和private修饰的具体方法 | 只能有抽象方法,java 8之后可以有默认方法和静态方法,所有方法都只能用public修饰 |
| 不支持多继承 | 支持多继承 |
| 可以有final, non-final, static and non-static 变量 | 所有变量都必须使用public static 和 final修饰 |
| 可以实现接口 | 不可以实现抽象类 |
| 可以继承一个类和实现多个接口 | 只能继承接口 |
总的来说,抽象类只实现部分抽象化,而接口则实现了完全抽象化。
抽象类和接口的使用场景
使用抽象类的场景:
- 联系紧密的几个类之间需要共享代码
- 各子类可能拥有许多共同的方法或成员,或者这些方法或成员需要public以外的修饰符(如protected和private)修饰
- 需要声明non-static或non-final的成员
使用接口的场景:
- 实现接口的类之间没有联系
例如许多毫无关联的类都实现了Comparable接口 和 Cloneable接口 - 需要明确声明与某一种数据类型有关的行为,但不在乎那个类或接口实现这种行为
- 需要用到多继承
复习一下java中的变量:
java变量分类图
*欢迎到作者github主页交流