多态学习笔记
概念
多态是一个事物在不同时刻体现的不同形态(内存中的变化)
前提条件
1.必须存在继承关系
2.必须有方法重写
3必须存在父类引用 指向子类对象(向上转型)
格式
class Fu{}
class Zi extends Fu{}
Fu fu=new Zi();
多态中成员访问
成员变量,编译看左,运行看左,
内存中:引用父类创建对象,在堆内存中创建对象的同时,堆内存中会传入父类的成员变量;
非静态成员方法,编译看左,运行看右,
内存中:创建对象时,子类方法函数会随空间地址一并指引给父类,使用方法会在栈内存中开辟空间访问子类的方法;
静态成员方法,编译看左,运行看左。
内存中,在父类的加载的同时,父类的静态方法跟随父类加载,子类的方法随指引但是不能发生覆盖,没有发生方法的重写;
访问构造方法,先初始化父类,再初始化子类;
多态的优点
提高代码的复用性(继承)
提高代码的扩展性(父类引用指向子类,可无限创建父类对象访问子类多样的方法)
多态的缺点
不能访问子类的特有功能
如果访问子类的特有功能?
1.创建子类对象访问自己的方法
2.将父类向下转型为子类,就可以访问了(更节省内存);
Fu fu=new Zi();
Zi z=(Zi)f;
转换时之一出现ClassCastException,类转换异常:堆内存的变化,和接受的类型不匹配