[{"createTime":1735734952000,"id":1,"img":"hwy_ms_500_252.jpeg","link":"https://activity.huaweicloud.com/cps.html?fromacct=261f35b6-af54-4511-a2ca-910fa15905d1&utm_source=V1g3MDY4NTY=&utm_medium=cps&utm_campaign=201905","name":"华为云秒杀","status":9,"txt":"华为云38元秒杀","type":1,"updateTime":1735747411000,"userId":3},{"createTime":1736173885000,"id":2,"img":"txy_480_300.png","link":"https://cloud.tencent.com/act/cps/redirect?redirect=1077&cps_key=edb15096bfff75effaaa8c8bb66138bd&from=console","name":"腾讯云秒杀","status":9,"txt":"腾讯云限量秒杀","type":1,"updateTime":1736173885000,"userId":3},{"createTime":1736177492000,"id":3,"img":"aly_251_140.png","link":"https://www.aliyun.com/minisite/goods?userCode=pwp8kmv3","memo":"","name":"阿里云","status":9,"txt":"阿里云2折起","type":1,"updateTime":1736177492000,"userId":3},{"createTime":1735660800000,"id":4,"img":"vultr_560_300.png","link":"https://www.vultr.com/?ref=9603742-8H","name":"Vultr","status":9,"txt":"Vultr送$100","type":1,"updateTime":1735660800000,"userId":3},{"createTime":1735660800000,"id":5,"img":"jdy_663_320.jpg","link":"https://3.cn/2ay1-e5t","name":"京东云","status":9,"txt":"京东云特惠专区","type":1,"updateTime":1735660800000,"userId":3},{"createTime":1735660800000,"id":6,"img":"new_ads.png","link":"https://www.iodraw.com/ads","name":"发布广告","status":9,"txt":"发布广告","type":1,"updateTime":1735660800000,"userId":3},{"createTime":1735660800000,"id":7,"img":"yun_910_50.png","link":"https://activity.huaweicloud.com/discount_area_v5/index.html?fromacct=261f35b6-af54-4511-a2ca-910fa15905d1&utm_source=aXhpYW95YW5nOA===&utm_medium=cps&utm_campaign=201905","name":"底部","status":9,"txt":"高性能云服务器2折起","type":2,"updateTime":1735660800000,"userId":3}]
声明:本人所说的并不完全,说的不好勿喷!
栈的特点:
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的底层,因为我也了解不清楚,我只是想通过分析在内存中程序运行的步骤来理解以后要学的代码