面向对象高级部分—多态
认识多态
对象多态,对象既可以指向老师对象,也可以指向学生对象。
注意事项:
成员变量不谈多态,编译看左边,运行看左边
成员变量编译的是父类People,所以编译的是左边的People,运行也看左边(输出的People的成员变量值)
代码示例
对象多态和行为多态的输出结果,编译看左边,运行看右边
编译看左边(People),运行结果看右边(new的Teacher()类和Student()类)
使用多态的好处
优点代码示例
希望所有学生和老师一起参加比赛,多累的
弊端
无法直接调用子类的独有功能
多态下的类型转换问题
解决上一节中多态的弊端—无法调用子类特有方法
强制转换前报错
正常情况下父类无法转为子类,不能用子类构造父类的对象,会报错,如下:
强制转换的方法
强制类型转换方法
alt+回车键,点击红框进行强制转换
强制转换结果如下
强制转换存在的问题
instanceof关键字
instanceof关键字使用语法:p-对象名,Student—需要进行判断的类名
强制转换前进行当前对象的真实类型判断,再进行强制转换,避免出现强制转换的类型报错,代码示例如下:
总结
final
认识final
变量存储的地址不能改变,但地址所指向对象的内容可以改变
代码示例
工具类一般会加上final
1)修饰变量:只能赋值一次
修饰成员变量
修饰成员变量(静态成员变量)
补充知识:常量详解
static final 修饰的成员变量被称为常量
代码示例
抽象类
认识抽象类
代码示例
错误示例
有方法体会报错
抽象类的注意事项、特点
1)不能创建对象
(因为抽象类的方法没有方法体,无法访问抽象类的方法)
2)作为一个特殊的父类,给子类用
总结
使用抽象类的好处
每个子类都要重写父类的方法
代码示例
抽象类的常见场景:模板方法设计模式
解决了什么问题
减少重复代码
代码示例
使用final关键字
模板方法中使用final关键字,防止被重写
接口
接口概述
认识接口
接口中不能有构造器和创造对象。
1)成员常量(成员名最好大写)
2)成员方法
成员方法不能有方法体
接口的基本使用
接口支持实现多个接口,类只能继承一个类。
代码示例
接口的好处
1)弥补类的继承不足,子类继承父类的同时,还能实现多个接口。
A要重写接口的所有方法。
总结
接口的综合案例
接口的其他细节:JDK8开始,接口中新增的三种方法
原来的接口中只能定义一些常量和成员抽象方法,有了这三个新增方法后,接口内的方法可以有方法体了。
1、默认方法使用default修饰
2、私有方法,必须使用private修饰
接口外部不能直接访问
接口内部方法可以直接访问
3、静态方法:必须使用static修饰,默认会被public修饰
总结
接口的其他细节:接口的多继承、使用接口的注意事项
接口的多继承
接口的注意事项(了解)
1)被继承的接口中,存在方法名冲突,则不支持多继承
2)方法名冲突,优先使用父类
继承放在接口实现前面
3)一个类实现了多个接口,若多个接口中存在同名的默认方法,可以不冲突,这个类重写方法即可