继承和多态的内存图解

4 篇文章 0 订阅

今天被继承和多态困扰,在CSDN上找了好几个内存分配讲解,个人感觉不全吧,就把他们做了个整合。。。。(讲解的是多态的方法和成员调用和继承中的方法和变量的调用)

什么是多态
// 同一个对象,在不同时刻表现出来的不同形态

多态的前提

// 要有继承或实现关系要有方法的重写要有父类引用指向子类对象
多态的好处和弊端(记忆)
好处
// 提高程序的扩展性。定义方法时候,使用父类型作为参数,在使用的时候,使用具体的子类型参与操作
弊端
// 不能使用子类的特有成员
this和super的图解在这里插入图片描述

多态成员访问特点
成员变量 :编译看父类,运行看父类
这里提一下静态成员方法和成员变量:
静态成员变量和方法:编译运行都参考左边; 因为静态与对象无关,在编译的时候静态成员就会直接编译进入方法区的.class文件中。而类的创建是之后在堆中创建的。所以实例的化的一个类是不能使用静态成员的。静态成员,如果没有private修饰就可以直接用类名进行调用。

在这里插入图片描述老师给的解释就是,多态中成员变量没有重写。。。。
自己理解就是左编译,左运行。因为方法中存在重写。所以在方法在重写后,调用的是被重写后的方法。。。

在这里插入图片描述
下面是重写的内存图:在这里插入图片描述
总结:
是自己想复杂了。多想了。还是没有理解虚拟机的执行规则。
1,成员变量访问,(这是虚拟机默认的执行规则)
编译看左边,运行看左边。编译就是将.java文件转换成.class字节码文件。进入方法区。在运行时,去堆中找super()所创建的new Fu, 然后在里面找变量。
2,成员方法访问
编译看左边,运行看右边。编译时:先进super();去检查Animal引用的方法区中有没有eat()方法,如有没有则报错。运行时:直接去Dog方法区中找到eat();如果Dog没有,再去执行super()调用父类的eat()方法。
3:静态成员
变量和方法:编译运行都参考左边; 因为静态与对象无关。成员加静态修饰的没加private,都可以被类直接调用,所以参考的都是左边。在这里插入图片描述
希望以上能对大家的学习有帮助。有什么不足还请大家提出来。估计会不够严谨。。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值