今天被继承和多态困扰,在CSDN上找了好几个内存分配讲解,个人感觉不全吧,就把他们做了个整合。。。。(讲解的是多态的方法和成员调用和继承中的方法和变量的调用)
什么是多态
// 同一个对象,在不同时刻表现出来的不同形态
多态的前提
// 要有继承或实现关系要有方法的重写要有父类引用指向子类对象
多态的好处和弊端(记忆)
好处
// 提高程序的扩展性。定义方法时候,使用父类型作为参数,在使用的时候,使用具体的子类型参与操作
弊端
// 不能使用子类的特有成员
this和super的图解
多态成员访问特点
成员变量 :编译看父类,运行看父类
这里提一下静态成员方法和成员变量:
静态成员变量和方法:编译运行都参考左边; 因为静态与对象无关,在编译的时候静态成员就会直接编译进入方法区的.class文件中。而类的创建是之后在堆中创建的。所以实例的化的一个类是不能使用静态成员的。静态成员,如果没有private修饰就可以直接用类名进行调用。
老师给的解释就是,多态中成员变量没有重写。。。。
自己理解就是左编译,左运行。因为方法中存在重写。所以在方法在重写后,调用的是被重写后的方法。。。
下面是重写的内存图:
总结:
是自己想复杂了。多想了。还是没有理解虚拟机的执行规则。
1,成员变量访问,(这是虚拟机默认的执行规则)
编译看左边,运行看左边。编译就是将.java文件转换成.class字节码文件。进入方法区。在运行时,去堆中找super()所创建的new Fu, 然后在里面找变量。
2,成员方法访问
编译看左边,运行看右边。编译时:先进super();去检查Animal引用的方法区中有没有eat()方法,如有没有则报错。运行时:直接去Dog方法区中找到eat();如果Dog没有,再去执行super()调用父类的eat()方法。
3:静态成员
变量和方法:编译运行都参考左边; 因为静态与对象无关。成员加静态修饰的没加private,都可以被类直接调用,所以参考的都是左边。
希望以上能对大家的学习有帮助。有什么不足还请大家提出来。估计会不够严谨。。