内存图解

java多态的内存图解

杀马特。学长 韩版系。学妹 提交于 2020-02-29 07:24:55
版权声明:本文为博主原创文章,未经博主允许不得转载。 图解Java多态内存分配以及多态中成员方法的特点 Person worker = new Worker(); 子类实例对象地址赋值给父类类型引用变量。多态的体现。 多态中成员方法的特点分析: 【子类有,父类没有】编译失败!!! worker.startWork(); 为什么编译不通过呢?提示:找不到符号。 因为引用变量worker是Person类型,在Person类的方法表中查找方法startWork(),找得到吗?找不到,更别提常量池解析了。编译失败。 【子类有,父类有,重写,非静态】调用子类!!! worker.say(); 子类重写父类方法,被重写的方法在子类跟父类的方法表中索引相同。 调用的时候,在父类类型的方法表中查找say方法的索引,然后把索引存到PolDemo类的常量表中(常量池解析,就是用Person类方法表中的索引项来代替常量池中的符号引用)。 因为索引相同,直接拿常量表中say方法的索引去子类方法表中调用say()方法。 所以,此时调用的是被子类重写的方法。见图中的内存分配。 【子类有,父类有,静态】调用当前引用类型变量类型中的方法。 因为静态是属于类的,由实例共享,所以只看当前引用变量所属的类中的静态方法。 多态中(父类引用指向子类对象)成员方法(非静态)有以下特点: