java 静态方法内存_Android-Java-静态变量与静态方法&普通变量与普通方法(内存图 完整版)...

描述Student对象:

packageandroid.java.oop12;//描述Student对象实体

public classStudent {privateString name;private intage;protected static String country = "CN";privateStudent() {}public Student(String name, intage) {/*** 通过拿到对象引用的地址(9998#==this),去操作 堆区内存的 name属性 age属性*/

this.name =name;this.age =age;

}public voidshowValue() {/*** 通过拿到对象引用的地址(9998#==this),去操作 堆区内存的 name属性 age属性*/System.out.println("name:" + this.name + " age:" +age);

}public static voidprintlnCountry() {/*** 通过类名就可用拿到 ---> 方法区(共享数据区) --> 中的 静态区 里面的 --> 静态数据 ,都是共享的*/System.out.println("country:" +Student.country);

System.out.println("country:" +country);

}

}

main测试方法:

packageandroid.java.oop12;public classTestDemo {public static voidmain(String[] args) {/*** 实例化Student对象 new Student("张三", 89);

* 拿到实例化对象引用的地址 Student student == 9998#*/Student student= new Student("张三", 89);/*** 通过拿到对象引用的地址(9998#==this),去调用showValue()方法*/student.showValue();/*** 直接调用 静态区 共享的 printlnCountry() 方法*/Student.printlnCountry();

}

}

执行结果:

5965e482ecd705e1050a6a36baf8b5dc.png

以上案例对应的内存图:

0749229b47d5798462978fddb7ffb136.png

1. 执行 java TestDemo

cbaaf23473cf95ed82f6e53ea90ed8cd.png  是给JVM发送指令,和JVM说:把这个 TestDemo.class 去执行;

2.JVM就去执行 TestDemo.class 文件里面的字节码,首先第一步 是把 TestDemo.class字节码加载进内存;

36cd2209a90436c94c9ad89e59f47f3e.png

3.第二步,会把TestDemo 静态数据 分配到 静态区里面去;

7692e05f61c1c8a1df068c135636d874.png

4.第三步,main方法进栈,是直接把静态区里面的 TestDemo --> main 方法拿过来进栈运行;

5.第四步,new Student("张三", 89);

6.第五步,注意:非常重要的点 要记住 ,那就是在 new Student("张三", 89); 的时候才把,Student.class加载进内存中的---> 存放区;

196ba30d2a279a2cb5fad132b6c14428.png

7.第六步,分配Student静态数据到--->静态区;

3582de991fbbec6f602a4fb30db73fe3.png

8.第七步,在堆内存中开辟 Student对象空间,并分配对象地址,并给变量赋初始值 null 0 等;

2f7854ad7937a3f80033bf4884b7d67d.png

9.第八步:构造方法Student(name, age) 进栈, 第九步:构造方法Student(name, age)弹栈;

31f2e7482bc5f4f709ef243ab8ee39fb.png

10.第十步,在堆内存中,name age 属性 被赋值完毕;

42eb770d7fe8dbf438814e2f1f97be0d.png

11.第十一步,new Student(name, age); 后 得到一个对象引用地址 给student变量;

117c647b73eba273900193721da534ec.png

12.第十二步,调用 student.showValue();

13.第十三步:showValue()方法进栈, 并通过this去操作name、age属性,  第十四步:showValue()方法弹栈;

39af21a193cc78bdf1339666e88fd577.png

14.第十五步:

3c5b6e22bfa6aec11f4dc5b5fac8443d.png;

15.第十六步:printlnCountry()方法进栈,并直接去访问 共享的 country 变量,  第十七步:printlnCountry()方法弹栈;

6d22b2b79883aea566686a75978fd166.png

16.第十八步:main方法执行完毕,弹栈;

17.第十九步:等待 JVM GC 机制来回收 Student对象;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值