大家先看看下面这段简单的代码,我将使用这段代码带领大家模拟程序在内存中怎么变化的?
public class Student {
public String name;
public int age;
public int number=9;
public Student(String _name,int _age){
this.name=_name;
this.age=_age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
//传递引用
public void changeStudent(Student s1){
s1=new Student("王五",25);
System.out.println(s1.getName()+"s1=====>"+s1.getAge());
}
public void changeAntherStudent(Student s2){
s2=new Student("李四",35);
}
public void changeName(Student s1,String name1){
s1.setName(name1);
}
/**
* @param args 测试方法
*/
public static void main(String[] args) {
String name="陈凯歌";//第一步
Student oneStu=new Student("张艺谋",45);//第二步
oneStu.changeStudent(oneStu);//第三步
Student twoStu=new Student("章子怡",33);//第四步
twoStu.changeAntherStudent(twoStu);//第五步
oneStu.changeName(oneStu,name);//第六步
System.out.println(oneStu.getName());//第七步
}
}
当程序进入main方法之后执行到第一步的时候,内存的的变化如下:
程序执行到第二步的时候,内存如下分配:
第二部结束之后,也就是构造方法调用完之后内存如下:
局部变量在作用域外,会立刻释放掉内存 .
程序执行到第三部的时候,内存如下:
当第三步结束之后,内存如下: 因为局部变量S1是要被内存马上回收的 所以S1会马上消失:
那么有的同学会问 那么S1引用的堆里面的东西什么时候消失了,其他在堆中存在的王五这个 已经跟垃圾没什么两样,因为没有任何内容引用他,他将会在某一时候被垃圾回收器 收回.
第四步跟第五步 我就不带大家做了 跟上面的是一样的,也就是说,这几步看起来是无用功,并没有改变原有对象里面的内容.
内存结构如下:
当程序执行到第六步的时候,内存的分布如下:
最终内存分布如下:
[输出结果如下:]
王五s1=====>25
张艺谋=====>45
陈凯歌