一、多态:事物的多种状态,polymorphic网络
对象的多态性:同一个对象,可能具备不一样的名称,同一个对象,有不一样的类型的引用指向它。
本质:同一个物体有不一样的名称和描述。 狗 :狗 动物
类型的多态性:同一个类型,可能具备不一样的子类实现,同一个类型引用,有不一样的对象实现,
本质:同一个名字和描述,能够在不一样场景下有不一样的真实实现。
动物: 狗 猫 猪ide
二、多态的前提spa
子类继承父类 方法的重写 父类的引用指向子类的对象code
class Test { public static void main(String[] args) { Person p = new P1();//父类的引用指向子类的对象 p.run(); } } class Person { public void run(){ System.out.println("走走走"); } } class P1 extends Person //继承 { public void run(){//方法的重写 System.out.println("跑起来"); } }
三、多态中成员变量的访问特色对象
编译看左边,运行看左边(编译时看父类是否有该变量的定义,运行时获取到的是父类的结果)blog
在子类对象中有一块区域是super区域,存放继承父类的变量和方法,容易理解,变量a的类型是Fu类型,继承
所以a.age能够看作是supper.age,因此输出就是Fu.age变量。编译
四、多态中成员方法的访问特色event
编译看左边,运行看右边(编译时看父类是否认义该方法,运行时运行子类重写的方法)class
动态绑定
在JVM执行到方法时,会根据这个方法所属变量类型标识符找到该方法的全限定名(包名+类名),
这里所属变量类型是父类,可是只知道所属变量类型还不可以的,由于没法肯定方法的具体位置(非静态
方法确定是在堆中),就没法压到栈中执行,所以必须根据父类变量建立的实际对象肯定方法的具体位置
(在堆中寻找),这种在程序执行过程当中,经过动态建立的方法表来定位方法的方式,称为动态绑定。
五、多态中静态方法的访问特色
编译看左边,运行看左边(编译时看父类是否认义该方法,运行时运行父类的方法)
缘由:方法属于类,和父类的方法不属于重写关系
静态变量:存储在类的字节码中的变量,被全部对象所共享,不随着对象的变化而变化,
都有相同的值,因此称为静态变量
静态方法:只会根据引用所属的父类,来决定运行的内容,运行内容,不会随着子类的变化而变化,
都是引用所属的父类的方法实现,因此称为静态方法。
public class Test { public static void main(String[] args) { Fu f = new Zi(); System.out.println(f.age); f.run(); f.show(); } } class Fu{ int age=10; public void run() { System.out.println("run run run"); } public static void show() { System.out.println("show show show"); } } class Zi extends Fu{ int age=5; public void run() { System.out.println("go go go"); } public static void show() { System.out.println("show time"); } }
六、向上向下转型
当想要访问子类中的属性或子类特有的方法时,须要向下转型
这里有一个instanceof方法,能够进行一次判断
格式:子类类型 引用名称 = (子类类型)父类类型的引用;
eg: Zi z = (Zi)f;
本质:恢复子类本来的访问范围
七、多态的好处
一、提升了代码的可扩展性
二、在方法的参数列表中,能够定义父类类型的引用,未来调用的时候,全部的子类类型的对象,
均可以做为方法的实际参数。
三、不在方法的参数列表中,就在普通的方法体中,使用父类的类型指向子类的对象,
也能提升代码的可扩展性。对象的来源很是普遍,不只仅是new出来的,(还多是经过反射获取的,
经过文件读取的,还多是网络传递的,在写代码的编译阶段,没法知道对象具体的子类类型的)
须要使用父类类型的引用,操做不知道的子类类型的对象。