声明:本人所说的并不完全,说的不好勿喷!
栈的特点:
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的底层,因为我也了解不清楚,我只是想通过分析在内存中程序运行的步骤来理解以后要学的代码