抽象类
- 使用场景
- 当多个类之间有关系并且包含相同功能,但是功能主体不同,可以考虑向上抽取,只抽取功能含义,不抽取功能主体。由于功能主体不知道,故该方法是抽象的,修饰方法为abstract,包含了抽象方法的类是抽象类,也需要在类上加abstract。
- 当不想让外界创建对象时,也可修饰类为abstract。
- 抽象类的特点
- 抽象类不可以创建对象。
- 若子类没有覆盖抽象类的所有抽象方法,那么子类也是一个抽象类。
- 抽象类可以没有抽象方法,但包含抽象方法的类一定是抽象类。
- 当多个类之间有关系并且包含相同功能,但是功能主体不同,可以考虑向上抽取,只抽取功能含义,不抽取功能主体。由于功能主体不知道,故该方法是抽象的,修饰方法为abstract,包含了抽象方法的类是抽象类,也需要在类上加abstract。
接口
- 使用场景
当事物除了包含基本功能外,还有一些扩展功能,可将这些扩展功能抽象到接口中,是对外暴露的规则。
- 接口中成员的特点
1. 变量:默认是常量,被修饰为public static final。
2. 方法:默认是抽象方法,被修饰为public abstract。 - 接口在继承中的特点
接口可以被子类多实现,因为接口的方法是抽象的,没有方法体,子类调用不会产生冲突。 - 接口与抽象类的区别
1. 接口是like a,抽象类是has a,即接口提供扩展功能,是对外暴露的规则,而抽象类提供子类的基本功能。
2. 当事物之间有内在联系时用抽象类,当只是有相同的操作时用接口。
3. 子类能实现多个接口,但是只能继承一个抽象类。
4. 接口的方法都是抽象的,抽象类可以没有抽象方法。
覆盖
使用场景
- 子类继承抽象类或者实现接口。
- 当子类要重新赋予一个方法的含义时。
覆盖注意事项
- 子类覆盖父类,子类方法权限必须大于父类。
- 静态只能覆盖静态。
多态
- 多态的体现:父类引用指向子类对象。
- 多态的好处:提高了代码的扩展性。
- 多态的弊端:只能使用父类中的成员。
- 多态的前提:多个子类继承或实现,并且覆盖。
- 多态中成员在编译时期和运行时期的特点
- 成员变量:编译和运行时期都参考引用
- 成员方法:编译时期参考引用,运行时期参考对象
- 静态成员方法:编译和运行时期都参考引用
- Object类中的equals()和toString()
- boolean equals():比较的是引用数据类型的对象地址值,不能比较基础数据类型,一般进行重写。
- String toString():利用hashCode()返回对象的地址,一般进行重写。
- 成员变量:编译和运行时期都参考引用
super
- super(属性):调用父类构造函数
- super.属性:访问父类同名属性
- super.方法名():访问父类的成员函数
final
- 类:不可以被继承,弥补了继承导致破坏封装性的问题
- 属性:常量,只能赋值一次,一般与static共同修饰
- 方法:不可以被覆盖