多态、内部类、常用APIヾ◍°∇°◍ノ゙
面向对象三大特征之三:多态
什么是多态?
同类型的对象,执行同一个行为,会表现出不同的行为特征。
多态的概述,多态的形式
多态中成员访问特点
方法调用:编译看左边,运行看右边。
变量调用:编译看左边,运行也看左边。(多态侧重行为多态)
多态的前提
有继承/实现关系;
有父类引用指向子类对象;
有方法重写。
多态的好处
优势
在多态形式下,右边对象可以实现解耦合,便于扩展和维护。
(举例:玩具车为父类 有很多子类,车轮/电池。如果电池或车轮坏了,换一个安上去就好)
定义方法的时候,使用父类型作为参数,该方法就可以接收这父类的一切子类对象,体现出多态的扩展性与便利。
多态下会产生的一个问题:
多态下不能使用子类的独有功能
多态下引用数据类型的类型转换
自动类型转换(从子到父):子类对象赋值给父类类型的变量指向。
强制类型转换吗(从父到子)
此时必须进行强制类型转换:子类 对象变量 = (子类)父类类型的变量
作用:可以解决多态下的劣势,可以实现调用子类独有的功能。
注意: 如果转型后的类型和对象真实类型不是同一种类型,那么在转换的时候就会出现ClassCastException
Java建议强转转换前使用instanceof判断当前对象的真实类型,再进行强制转换
当在方法里面看不到是什么对象的时候,就很有用处了
1. 引用数据类型的类型转换,有几种方式?
自动类型转换、强制类型转换。
2. 强制类型转换能解决什么问题?强制类型转换需要注意什么。
可以转换成真正的子类类型,从而调用子类独有功能。
有继承关系/实现的2个类型就可以进行强制转换,编译无问题。
运行时,如果发现强制转换后的类型不是对象真实类型则报错。
类型转换异常:ClassCastException
内部类
内部类就是定义在一个类里面的类,里面的类可以理解成(寄生),外部类可以理解成(宿主)。
内部类概述
外部类不能用private修饰。
内部类的使用场景、作用
当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么整个内部的完整结构可以选择使用内部类来设计。
内部类通常可以方便访问外部类的成员,包括私有的成员。
内部类提供了更好的封装性,内部类本身就可以用private protectecd等修饰,封装性可以做更多控制。
内部类之一:静态内部类[了解]
什么是静态内部类?
有static修饰,属于外部类本身。
它的特点和使用与普通类是完全一样的,类有的成分它都有,只是位置在别人里面而已。
静态内部类的使用场景、特点、访问总结。
如果一个类中包含了一个完整的成分,如汽车类中的发动机类。
特点、使用与普通类是一样的,类有的成分它都有,只是位置在别人里面而已。
可以直接访问外部类的静态成员,不能直接访问外部类的实例成员。
注意:开发中实际上用的还是比较少。
内部类之二:成员内部类[了解]
什么是成员内部类?
无static修饰,属于外部类的对象。
JDK16之前,成员内部类中不能定义静态成员,JDK 16开始也可以定义静态成员了。
内部类之三:局部内部类[了解]
局部内部类 (鸡肋语法,了解即可)
局部内部类放在方法、代码块、构造器等执行体中。
局部内部类的类文件名为: 外部类$N内部类.class。
内部类之四:匿名内部类概述[重点]
匿名内部类:
本质上是一个没有名字的局部内部类,定义在方法中、代码块中、等。
作用:方便创建子类对象,最终目的为了简化代码编写。
特点总结:
匿名内部类是一个没有名字的内部类。
匿名内部类写出来就会产生一个匿名内部类的对象。
匿名内部类的对象类型相当于是当前new的那个的类型的子类类型。
匿名内部类常见使用形式
匿名内部类真实使用场景演示
常用API
Object
Object类的作用:
Object类的方法是一切子类对象都可以直接使用的,所以我们要学习Object类的方法。
一个类要么默认继承了Object类,要么间接继承了Object类,Object类是Java中的祖宗类。
toString方法
toString存在的意义
父类toString()方法存在的意义就是为了被子类重写,以便返回对象的内容信息,而不是地址信息!!
Object的toString方法的作用是什么?
让子类重写,以便返回子类对象的内容。
equals方法
Object的equals方法的作用是什么?
默认是与另一个对象比较地址是否一样
让子类重写,以便比较2个子类对象的内容是否相同。
Objects
StringBuilder
StringBuilder是一个可变的字符串类,我们可以把它看成是一个对象容器。
作用:提高字符串的操作效率,如拼接、修改等。
1、为什么拼接、反转字符串建议使用StringBuilder?
String :内容是不可变的、拼接字符串性能差。
StringBuilder:内容是可变的、拼接字符串性能好、代码优雅。
定义字符串使用String
拼接、修改等操作字符串使用StringBuilder
Math
Math类
包含执行基本数字运算的方法,Math类没有提供公开的构造器。
如何使用类中的成员呢?看类的成员是否都是静态的,如果是,通过类名就可以直接调用
System
BigDecimal
BigDecimal的作用是什么?
解决浮点型运算精度失真问题。
BigDecimal的对象如何获取?
BigDecimal b1 = BigDecimal.valueOf(0.1);