一、多态
1. 对象的多态
1.1 向上造型
向上造型,我们也可以理解为引用类型的自动类型转换(小转大)
引用类型中父类为大,子类为小
Father f = new Son();
Father f = new Daughter();
父类的引用指向子类的对象
// 父类 引用类型变量(引用) 指向 子类的对象
Father f = new Son();
能点出来什么看引用的类型
能造型称为的类型
超类
接口
1.2 向下转型(向下造型)
向下转型,我们可以理解为引用类型的强制类型转换(大转小)
Person p = new Student(); Student s = (Student)p;
向下转型成功的条件
引用所指向的对象就是该类型
引用所指向的对象继承该类或者实现了该接口
GrandPa g = new Son();
// g(引用) 指向的类型为 Son 类型,所以可以强转为 Son 类型
Son s = (Son)g; // 引用所指向的对象就是该类型
// g(引用) 指向的类型为 Son 类型,所以可以强转为 Son 继承的 Father 类型
Father f = (Father) g; // 引用所指向的对象继承和该类或者实现类该接口
// 爷爷类
public class GrandPa { }
// 爸爸类
public class Father extends GrandPa{ }
// 儿子类
public class Son extends Father{ }
引用类型强转时,如果不符合上述的条件,会造成 ClassCastException 类型转换异常
强转之前我们应该使用 instanceof 关键字进行判断,判断引用指向的对象是否属于改类型
何时需要强转:若想访问的变量、方法在超类中没有,则需要强转
2. 行为的多态
2.1 方法的重写
重写是子类与父类的一种多态性的表现
重写是一种运行时的多态。
重写的前提是继承,向上造型之后,调用同一个方法,在运行时根据造型的类型不同调用各种类型重写之后的方法
2.2 方法的重载
重载是否是多态,网友们各执己见,这里我只是阐述下我对这个观点的说明,仅代表我自己
重载是一个类多态性的表现
重载是一种编译时的多态,根据传参时的类型不同或者数量不同来决定到底调用的那个重载的方法
二、拓展
1. 什么是面向对象
面向对象是以对象为核心来思考,解决问题的一种方式,它是 Java 核心的一种思想;
世间的万事万物我们都可以理解成一个对象,所以才有我们万物皆对象的说法。
一、简单的内存管理(JVM)
1. 堆
存储的是new出来的对象(包括实例变量、数组的元素)
垃圾:没有任何引用所指向的对象
垃圾回收器(GC)
垃圾回收器(GC)不定时到内存中清扫垃圾,回收过程是透明的(看不到的),并不一定一发现垃圾就立刻回收,通过调用System.gc()可以建议虚拟机尽快调度GC来回收
实例变量的生命周期:
创建对象时存储在堆中,对象被回收时一并被回收
内存泄漏:不再使用的对象还没有被及时的回收,严重的泄漏会导致系统的崩溃
建议:不再使用的对象应及时将引用设置为null
2. 栈
存储正在调用的方法中的局部变量(包括方法的参数)
调用方法时,会在栈中为该方法分配一块对应的栈帧,栈帧中存储局部变量(包括方法的参数),方法调用结束时,栈帧被自动清除,局部变量一并被清除
局部变量的生命周期:
调用方法时存储在栈中,方法调用结束时与栈帧一并被清除
3. 方法区
存储.class字节码文件(包括静态变量、所有方法)
方法只有一份,通过this来区分具体的访问对象
二、面向对象的三大特征
面向对象三大特征:封装,继承,多态
1. 封装
类:封装的是对象属性和行为
方法:封装的是具体的业务逻辑功能
访问控制修饰符:封装的是访问权限
2. 继承
继承是一种利用已有的类快速创建新的类的一种机制
作用:代码的复用
父类:所有子类共有的行为和属性
子类:子类所特有的属性和行为
子类继承父类后,子类具有:父类+子类
单一继承,多实现,继承是具有传递性的
3. 多态
行为的多态,对象的多态
多态的表现形式:行为的多态(重载,重写),对象的多态(向上造型,强制类型转换(instanceof)/向下转型)
面向对象的优点:易复用、易维护、易扩展,降低了系统代码的耦合度。
面向对象知识点体系: