多态:有多种形态。
前提:有上下级关系(继承,接口)。
父类引用指向子类对象:
格式: 父类名称 对象名 = new 子类名称();
子类:
父类:
此时运行的时子类Zi的method。
这种情况下方法的优先级和普通继承的一样,先找子类的方法,若子类没有该方法,就去父类里找并运行。
多态下成员变量的访问
访问方法与普通的继承一样,但因为多态的格式与普通继承不同,要注意以下事项:
首先回顾继承的成员变量访问方法:
假设有如下子类:
如下父类
直接访问
此时时访问父类的成员变量(因为等号左边为父类)
间接访问
调用showNum()方法,如果子类没有override此方法,且此方法存在于父类中,此时就是在调用父类方法并通过父类方法访问父类成员变量,若已在子类中override,则此时调用的是子类方法且访问的是子类成员变量。
多态下成员方法的访问
访问方法也与普通的继承一样。
成员变量和成员方法访问规则口诀:
如下图,出现报错。
若调用的方法父类中存在,再运行看右边:
右边是子类,所以先运行子类方法,子类没有该方法再运行父类。
多态的好处
多态对象的向上转型 Method lookup
父类
子类
主方法
多态对象的向下转型
在刚才向上转型的代码主方法:
格式和强制转换值类型一样
因为之前new的是Cat类型而不是Dog类型。
instanceof
如何知道一个父类引用对象,本来是什么子类。
该keyword的使用 会返回一个boolean type
在上面的代码例子基础上
这样编译器会自动选择正确的那条语句。
因此向下转型一定要加上instanceof判断 来避免异常。