一.代码示例
编写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小白,有说的不到位的地方欢迎大家可以指正。