方法的运行过程:栈、堆、方法区

一、代码

public class Demo {
    public static void main(String[] args) {
        Zi zi = new Zi();
        zi.show();
        zi.method();
    }
}
public class Fu {
    int num = 10;
    public void method() {
        System.out.println("父类方法");
    }
}
public class Zi extends Fu {

    int num = 20;
    @Override
    public void method() {
        super.method(); // 调用了父类方法
        System.out.println("子类方法");
    }
    public void show() {
        int num = 30;
        System.out.println(num); // 30
        System.out.println(this.num); // 20
        System.out.println(super.num); // 10
    }
}

二、运行过程

[方法区中]

.class文件

Fu.class{
	int num
	method() //父
}
Zi.class{
	[[super_class]] //指向Fu.class
}
Demo.class{
}
[在栈中]

main方法最先进栈,顺序执行main中的语句
1.语句1:Zi zi = new Zi();
首先new一个Zi类对象,对象的内容存储在堆中,栈中保存其对象地址值;

[在堆中]

new Zi():

子类构造 this
	1.父类构造 super
		int num=10
		0x method() //父,存储方法区中父类method方法的地址

	2.int num=10
	3.0x method() //子,存储方法区中子类method方法的地址
	4.0x show()//子类独有方法
[在栈中]

2.语句2:zi.show()
让show方法进栈,

show()
	int num=30;
	sout(num);//指向上一句的num
	sout(this.num);//指向堆中的子类内容(this)
	sout(super.num);//指向(super)

运行结束,释放栈内show()的空间

3.语句3:zi.method();

  • 让method方法进栈,Zi类覆盖重写了Fu类method方法,优先使用zi类的method方法,因此进栈的是zi类的method方法;
  • 由于子类method方法是调用了父类方法,因此子类method()的首句应为父类的method方法;
method() [子]
	super.method();//子类调用父类的method方法,让父类method方法进栈
	sout(“子类方法”)
method() [父]
	sout(“父类方法”)

4.依次释放栈内空间:
method() // 父
method() //子
main()

三、总结

内存图
https://www.bilibili.com/video/BV1uJ411k7wy?p=163

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值