- 多态的概述、优势、类型转换问题
- 多态综合案例
- 内部类
- 匿名内部类
- 常用API Object Objects
- 常用API Stringbuilder
- 常用API Math System BigDemical
一、多态的概述、优势、类型转换问题
1.面向对象三大特性之三:多态
多态的概述
同类型的对象,执行同一个行为,会表现出不同的行为特征
多态的形式
父类类型 对象名称 = new 子类构造器
接口类型 对象名称= new 实现类构造器
多态中成员的访问特点
方法调用:编译看左边,运行看右边
变量调用:编译看左边,运行也看左边(多态侧重行为多态)
多态的前提:有继承/实现关系,有父类引用指向子类对象,有方法重写
多态的优势
在多态形式下,右边对象可以实现解耦合,便于拓展和维护。(互相依赖没那么强)
定义方法时,使用父类作为参数,该方法就可以接受父类的一切子类对象,体现出多态的拓展性与便利。
多态会产生一个问题
多态下不能使用子类的独有功能
多态下引用数据类型的类型转换
自动类型转换:从子到父(子类对象赋值给父亲类型的变量指向)
强制类型转换:从父到子 子类 对象变量=(子类)父亲类型的变量
作用:可以解决多态下的劣势,可以实现调用子类的独有功能
注意:如果转型后的类型和对象的真实类型不是同一类型,转型后就会出现ClassCastException
强转之前使用instanceof判断当前对象的真实类型
多态的综合案例
二、内部类
1.内部类概述
一个类里面的类,外面的可以理解成宿主,里面的可以理解成寄生虫
内部类的使用场景、作用
事物内部,还有一个完整的结构需要进行描述,内部结构为外部事物提供服务。
方便访问外部类的成员
更好的封装性,protected/private修饰
2.内部类的分类:
- 静态内部类
什么是静态内部类?
static修饰,特点和使用和普通类一样
静态内部类创建对象的格式:
静态内部类的拓展知识
静态内部类可以访问静态内部类的静态成员,不可以直接访问外部类的实例成员,可以new一个对象间接访问
图片来源:https://blog.csdn.net/qq_44631615/article/details/108126134
- 成员内部类
什么是成员内部类
无static修饰,属于外部类的对象,也称实例内部类。JDK16之前,成员内部类中不能定义静态成员,JDK16开始也可以定义静态成员了
成员内部类创建对象的格式
成员内部类的访问拓展
成员内部类可以访问外部类的静态成员,也可以直接访问外部类的实例成员
图片来源:https://blog.csdn.net/qq_44631615/article/details/108126134
内部类:就是我是你的一部分,我了解你,我知道你的全部,没有你就没有我。(所以内部类对象是以外部类对象存在为前提的)
静态内部类:就是我跟你没关系,自己可以完全独立存在,但是我就借你的壳用一下,来隐藏自己。
来源:https://www.cnblogs.com/47Gamer/p/13848028.html
注意:在成员内部类中访问所在外部类对象,格式:外部类名.this
- 局部内部类
放在方法、代码块,构造器等执行体中
JDK16之后可以定义接口,抽象类,类里面可以放静态成员和实例成员
文件名:外部类$内部类.class
- 匿名内部类
本质上是一个没有名字的局部类,定义在方法中,代码块中
方便创建子类对象,简化代码编写
原本抽象类不允许创建对象,是因为有抽象方法,创建对象后重写抽象方法
匿名内部类是一个没有名字的内部类
匿名内部类写出来就会产生一个匿名内部类的对象
匿名内部类的对象类型相当于当前new的那个类型的子类类型
3.匿名内部类常见使用形式
方法回调
匿名内部类可以直接作为方法的实际参数进行传输
4.匿名内部类真实使用场景演示
给按钮绑定点击事件
GUI 图形界面化编程/桌面编程
做个按钮
绑定监听器
简化
开发中不是我们主动定义内部类,而是别人需要我们写或者我们可以写的时候才会使用
可以实现代码简化
三、常用API——Object\Objects
- Object
toString方法
equals方法
- Objects
- StringBuilder
- Math
- System
- BigDemical
Application Programming interface 应用程序编程接口
1.Object类
Object的作用
一个类要么默认Object的大类,要么间接继承了Object类,Object是java中的祖宗类
Object类的方法是一切子类可以直接使用的
toString类
父类toString存在的意义是为了被子类重写,以便返回对象的内容信息,而不是地址信息
equals的作用
直接比较两个对象的地址是否相同可以用==代替equals
equals存在的意义是为了被子类重写,以便子类自己来定义比较规则
String已经重写了equals
Objects类
Objects与Object是继承的关系,Objects是Object的子类。
增加了非空校验
2.StringBuilder
概述:是一个可变字符串类,可与i把它看成一个容器
作用:提高字符串操作效率,如拼接,修改
StringBuilder比String的性能好
案例:打印整型数组内容
3.Math
执行数学运算,没有公开构造器,私有,不能创建对象,静态方法,可以直接用类名调用
生成0-6之间的整数
最后一项随机数包0不包1,之前学的random.nextInt是个类,可以指定区间,这里的是Math下面的一个方法
4.System类
上面Arrays.toString是把任意数组的内容返回为String类型
5.bigDecimal 大数据类型