声明:本人所说的并不完全,说的不好勿喷!

栈的特点:

1.Java虚拟机栈是描述Java方法执行过程的内存模型,简单的说就是Java虚拟机栈会为每一个即将执行的方法创建一块“栈帧”,这块区域就是专门用来存放方法在运行过程中所需要的信息。

2.栈遵循“先进后出,后进先出”的规则,栈里边存放的不是方法吗?那最先进去的是main方法,然后是除main以外的方法开始执行,那main先进去,别的方法后进去,而后面进来的得执行完,最后main才能结束执行。

简单的说就是→假设main是一个富人家的佣人,里边的方法是富人以及他的孩子还有老婆,当佣人做好饭之后,得先让富人和富人的家人先吃,等他们吃完自己才能吃。(大概就是这个意思)

堆的特点:

1.堆用于存储创建好的对象和数组

方法区:

1.方法区其实也就是一个堆,只是它比较特殊,用于存储类、常量等相关信息。

2.用来存放程序中不变的或唯一的内容(静态变量,字符串常量等)

如果还是不懂那么我们开始动手操作:

假设是这么一串代码
public class Person { String name; int age; public void show(){
System.out.println("姓名:"+name+"\t年龄:"+age); } public static class TestPerson{
public static void main(String[] args) { Person p1 = new Person(); p1.age = 24;
p1.name= "帅哥"; p1.show(); Person p2 = new Person(); p2.age = 18; p2.name =
"张三"; p2.show(); } } }

假设栈,堆,方法区分成这样三个模块

最开始先执行了main方法

然后执行了Person这个类,创建了p1和一个新的对象

刚刚开始p1没有任何值所以初始化为null,String name和show()放在方法区里边 

(show方法放在方法区里边是因为,这样就可以省资源,不然每次创建一个新的对象都得创建一次show方法浪费资源)

然后把这个在堆里边建造的对象的地址赋给p1

并且show也是有地址的(我的理解方法),然后把方法区里边Person类show方法的地址0x12赋给p1里边的show()
System.out.println("姓名:"+name+"\t年龄:"+age);

然后执行p1.age就相当于0x11.age,通过地址改变了堆对象里边的age的值

第二步同理通过p1.name(0x11.name),访问对象里边的name

※(难点)但是这里“帅哥”是字符串所以他得放到方法区里边,并且他也是有地址的

然后就把“帅哥”的地址赋予给p1对象里边的name

前两步赋值完成后就到调用show方法了,p1.show也是上面说的一样0x11.show

我们这里其实是有传递参数的,把p1的地址传过去了

 

 然后他通过name(电脑为自动给你变为this.name)访问到了0x11里边的name,这里的this其实就相当于0x11.name,这样理解简单一点,通过地址直接访问对象里边的内容

 结果:

下面的p2也是同样的道理哦 

总结:我并不是想要了解java的底层,因为我也了解不清楚,我只是想通过分析在内存中程序运行的步骤来理解以后要学的代码

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信