Day14-面向对象高级二多态
进阶二多态
多态概念
什么是多态
- 多态是在 继承/实现 情况下的一种现象,表现为:对象多态、行为多态
具体的代码体现
- 同种引用可以指向不同的对象(父类指向子类)
- 不同的对象的同名函数实现的功能不同(重写方法)

多态的前提
- 有 继承/实现 关系;存在父类引用子类对象;存在方法重写。
注意事项
- 多态是对象、行为的多态。Java中的属性(成员变量)不谈多态。
使用多态的好处
- 在多态形式下,右边对象是解耦合的,更利于拓展和维护。
- 定义方法时,使用父亲类型的形参,可以接收一切子对象,拓展性更强,更便利。
多态的一个问题
- 多态下不能使用子类独有的功能
类型转化
- 自动类型转换:父类 变量名 = new 子类 ();
- 强制类型转换:子类 变量名 = (子类)父类变量名
强制类型转换问题
- (变量名name) instanceof (类名class)
- 合法格式:父类变量名 instanceof 子类名
- 步骤一:若name与class无父子关系,拒绝编译。
- 步骤二:否则进入编译,判断name指向的实际对象是否属于class或class的子类,是则返回true,否则返回false。
final
认识final
- final关键字是最终的意思,可以修饰 类、方法、变量。
- 修饰类:最终类,特点是无法被继承(断子绝孙)。
- 修饰方法:最终方法,特点是不能被重写。
- 修饰变量:该变量只能被赋值一次。
final修饰变量的注意
- final修饰基本类型的变量,变量存储的数据不能被改变
- final修饰引用类型的变量,变量存储的地址不能被改变,但地址所指向对象的内容是可以改变的。
常量
- 使用了static final修饰的成员变量称之为常量。
- 作用:用于记录系统的配置信息
- 命名规范:全大写字母、多个单词之间用下划线连接
使用常量记录系统配置信息的优势、执行原理
- 增强代码的可读性、可维护性。
- 程序编译后,常会被“宏替换”:出现常量的地方全部会被替换成其记住的字面量,这样可以保证使用常量和直接使用字面量的行能是一样的。
抽象类
认识抽象类
- abstract修饰的;抽象方法只有签名,不能写方法体。
- 注意事项
- 包含抽象方法的类必须是抽象类。
- 一个类若继承抽象类,必须重写完父类的所有抽象方法,否则该类也必须是抽象类。
- 最主要的特点:抽象类不能创建对象,仅作为一种特殊的父类,让子类继承并实现。
使用抽象类的好处
- 父类知道每个子类都要做某个行为,但各个子类的具体实现不一样,就将父类定义成抽象方法,子类重写实现,是多态的思想。
抽象类的常见应用场景:模板方法设计模式
- 解决方法中存在重复代码问题。
接口
认识接口
- Java提供了一个关键字interface,用这个关键字我们可以定义出一个特殊的结构:接口。

- 注意:接口不能创建对象;接口是用来被类实现(implements)的,实现接口的类称为实现类。

- 一个类可以实现多个接口(接口可以理解成干爹),实现类实现多个接口(多继承),必须重写完全部接口的全部抽象方法,否则实现类需要定义成抽象类。
接口的好处(重要)
- 弥补了类单继承的不足,一个类同时可以实现多个接口。
- 让程序可以面向接口编程,这样程序员就可以灵活方便得切换各种业务实现。
- 例如我想要在不同场景下用不同的实现,就分别用两个实现类重写不同功能即可。
- 通过implements接口,可以显性地知道该实现类的功能,从而方便使用。
JDK8开始接口的拓展
- 新增三种形式的方法。
- 默认方法:使用default修饰,使用实现类的对象调用。
- 静态方法: static修饰,必须用当前接口名调用。
- 私有方法:private修饰,jdk9开始才有的,只能在接口内部被调用。

- 新增方法的好处:增强了接口的能力,更便于项目的扩展和维护。
接口的其他细节
- 一个接口继承多个接口,如果多个接口中存在方法签名冲突,则此时不支持多继承。
- 一个类实现多个接口,如果多个接口中存在方法签名冲突,则此时不支持多实现。
- 一个类继承了父类,又同时实现了接口,父类中和接口中有同名的默认方法,实现类会优先用父类的。
- 一个类实现了多个接口,多个接口中存在同名的默认方法,可以不冲突,这个类重写该方法即可。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 宫本贩剑的博客!