关于Java中类执行时的内存变化以及整个执行过程的介绍

一.代码示例

编写Person类

public class Person{
    String name;
    int age;
    
    public void show(){

        System.out.println("姓名:"+name+",年龄:"+age); 
    }

}

 创建Person类对象并使用

public class TestPerson { 
   public static void main(String[ ] args) { 
         // 创建p1对象 
         Person p1 = new Person(); 
         p1.age = 24; 
         p1.name = "张三"; 
         p1.show(); 
         // 创建p2对象 
         Person p2 = new Person(); 
         p2.age = 35; 
         p2.name = "李四"; 
         p2.show(); 
   } 
}

内存变化示意图

 

 内存变化分析

在TextPerson类中,在虚拟机栈中会开启一个主方法的栈帧,栈帧中的参数args为null,根据构造方法创建并初始化p1对象后,就会在堆中开启一块内存区域放p1对象初始化的数据,此时p1.name=null  p1.age=0 还有一个show()方法,这个方法的信息存储在方法区中,假设p1对象初始化数据的内存地址为0x11,此时在main()方法中的p1=0x11,而后执行下面的代码,将p1对象的变量重新赋值后并调用show()方法,此时p1.name="张三",p1.age="24"。系统在调用show()方法时会在栈帧中开启一个p1.show()栈帧,在这个栈帧中会系统自己会传一个this,它的值为0x11,也就对应堆中的地址,这样就输出了姓名和年龄。完成后p1.show栈帧就没有用了,就会被垃圾回收机制回收,继续执行下面的代码。和创建p1指针的过程类似。

这里讲一下为什么字符串常量“张三”“李四”放在方法区中?

方法区中的数据与堆一样,对所有的线程共享,它主要存储的是类数据,常量,静态变量等。

本人是java小白,有说的不到位的地方欢迎大家可以指正。

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值