一、面向对象三大特征之三:多态
1. 多态的概述,多态的形式
什么是多态?
- 同类型的对象,执行同一个行为,会表现出不同的行为特征
多态的常见形式
父类类型 对象名称 = new 子类构造器;
接口 对象名称 = new 实现类构造器;
多态中成员访问特点
- 方法调用:编译看左边,运行看右边
- 变量调用:编译看左边,运行也看左边(多态侧重行为多态)
多态的前提:
- 有继承/实现关系;有父类引用指向子类对象;有方法重写
2.多态的优势
- 在多态形式下,右边对象可以实现解耦合,便于扩展和维护
Animal a = new Tortoise();
a.run(); //后续业务行为随对象而变,后续代码无需修改
- 定义方法时,使用父类型作为参数,该方法就可以接收这父类的一切子类对象,体现出多态的扩展性和便利。
多态会产生一个问题:多态下不能使用子类的独有功能
3.多态下引用数据类型的类型转换
自动类型转换(从子到父):子类对象赋值给父类类型的变量指向。
强制类型转换(从父到子):
- 此时必须进行强制类型转换:子类 对象变量 = (子类)父类类型的变量
- 作用:可以解决多态下的劣势,可以实现调用子类独有的功能。
- 注意:如果转型后的类型和对象真实类型不是同一种类型,那么在转换时会出现
ClassCastException
Java建议强转前使用instanceof
判断当前对象的真实类型,再强转。
4.多态的综合案例
二、内部类
1. 内部类概述
- 内部类是定义在一个类里面的类,里面的类可以理解为(寄生),外部类可以理解为(宿主)
- 内部类的使用场景、作用:
当一个事务的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么整个内部的完整结构可以选择使用内部类来设计
内部类通常可以方便访问外部类的成员,包括私有成员
内部类提供了更好的封装性,内部类本身就可以用private protected 等修饰,封装性可以做更多控制。 - 内部类的分类:
静态内部类、成员内部类、局部内部类、匿名内部类
2. 内部类之一:静态内部类
有static修饰,属于外部类本身
3. 内部类之二:成员内部类
无static修饰,属于外部类的对象
4. 内部类之三:局部内部类
放在方法、代码块、构造器等执行体中
5. 内部类之四:匿名内部类概述
- 本质上是一个没有名字的局部内部类,定义在方法中、代码块中等
- 作用:方便创建子类对象,最终目的为了简化代码编写
格式:
new 类|抽象类名|或者接口名(){
重写方法;
}
特点总结:
- 匿名内部类是一个没有名字的内部类
- 匿名内部类写出来就会产生一个匿名内部类的对象
- 匿名内部类的对象类型就相当于当前new的那个类型的子类类型
6. 匿名内部类常见使用形式
匿名内部类可以作为方法的实际参数进行传输
7. 匿名内部类真实使用场景演示
开发中不是我们主动去定义匿名内部类的,而是别人需要我们写或者我们可以写的时候才会使用。
匿名内部类的代码可以实现代码进一步简化
三、常用API(应用程序编程接口)
- Object
作用:
- 一个类要么默认继承了Object类,要么间接继承了Object类,Object类是Java中的祖宗类
- Object类的方法是一切子类都可以直接使用的,所以我们要学习Object类的方法。
(1) toString方法
开发中直接输出对象,默认输出对象的地址是没有意义的
开发中输出对象变量,更多时候希望看到对象的内容数据
toString存在的意义:父类toString()方法存在的意义就是为了被子类重写,以便返回对象的内容信息,而不是地址信息。
(2) equals方法
-
Objects
Objects类与Object还是继承关系
官方在进行字符串比较时,没有对象自己的equals方法,而是选择了Objects的equals方法来比较两个对象。
Objects 的 equals 方法比较的结果是一样的,但是更安全。 -
StringBuilder
StringBuilder是一个可变的字符串类,可以把它看成是一个对象容器
作用:提高字符串的操作效率,如拼接、修改等
-
Math
包含执行基本数字运算的方法,Math类没有提供公开的构造器
-
System
System功能是通用的,都是直接用类名调用,System不能被实例化
-
BigDecimal
用于解决浮点型运算精度失真的问题
BigDecimal a1 = BigDecimal.valueOf(a);