1.代码1的内存分析:
分析:1.程序从main入口,首先要将Person类的字节码文件加载到方法区,且只在首次调用该类时加载一次,再次使用该类创建对象不需要加载。2.new Person()时会在堆中开辟一块区域,如0x5555,作为类的对象的存储区域,此时会初始化属性值。3.main方法中的p1为局部变量,所以存储在栈中,且p1为引用数据类型,指向了0x5555.
2.代码2的内存分析(复杂)
代码如下:
class Person{
int id;
int age;
String school;
Person (int a,int b,String c){
id=a;
age=b;
school=c;
}
public void setAge(int a){
age=a;
}
}
public class Test {
public static void main(String[] args) {
Test t=new Test();
int age=40;
Person tom=new Person(1,20,"海淀");
Person jack=new Person(2,30,"朝阳");
t.change1(age);
t.change2(tom);
t.change3(jack);
System.out.println(age); //40
System.out.println("id:"+jack.id+",age:"+jack.age+",school:"+jack.school); //id:2,age:66,school:"朝阳"
}
public void change1(int i){
i=3366;
}
public void change2(Person p){
p=new Person(3,22,"西城");
}
public void change3(Person p){
p.setAge(66);
}
}
内存分析如下: