Java继承的内存分配

今天,复习的是继承的内存分配。我们知道,Java中内存可以初略分为堆、栈、方法区。

package sort;
class Person{
	public int age;
	public String name;
	public Person(){
		System.out.println("父类");
		say();
	}
	public void say(){
		System.out.println("有人说话。");
	}
}
class Student extends Person{
	public String school;
	public Student(){
		System.out.println("子类");
	}
	public void say(){
		System.out.println("学生"+name+age);
	}
}
public class ExtendsDemo
{
    public static void main(String[] args) {
		Student s = new Student();
		s.age=20;
		s.name="tom";
		s.say();
	}
}

上面是一个简单的继承例子,输出的结果是:

父类
学生null0
子类
学生tom20

可以先画个内存图:


可以简易理解成父类的空间是一个小圆,被子类的大圆包住了,所以当我们从子类找一个变量,是先从大圈圈找,找到了就返回,如果大圈圈没有,那就到小圈圈里找。

这个程序执行的基本流程是:

1.虚拟机加载Test类,提取类信息到方法区;

2.通过保存在方法去的字节码,虚拟机开始执行main方法,main函数入栈;

3.执行Student s = new Student();给student实例对象分配堆空间。又因为实现自己要先实现父类,所以,虚拟机加载person类到方法区,并在堆中为父类成员变量在子类空间中初始化。然后加载student类到方法区,为子类的成员变量分配空间并初始化。

4.接下来两条语句为成员变量赋值,由于nameage是从父类继承而来,会被保存在子类父对象中,所以就根据引用变量s持有的引用找到堆中的对象(子类对象),然后给nameage赋值。

5.调用say()方法,通过引用变量s持有的引用找到堆中的实例对象,通过实例对象持有的本类在方法区的引用,找到本类的类型信息,定位到say()方法。say()方法入栈。开始执行say()方法中的字节码。

6.say()方法执行完毕,say方法出栈,程序回到main方法,main方法执行完毕出栈,主线程消亡,虚拟机实例消亡,程序结束。

  总结:相同的方法会被重写,变量没有重写之说,如果子类声明了跟父类一样的变量,那意味着子类将有两个相同名称的变量。一个存放在子类实例对象中,一个存放在父类子对象中。父类的private变量,也会被继承并且初始化在子类父对象中,只不过对外不可见。

当出现多态情况的时候,调的具体是哪个函数又需要匹配了。

  


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值