java内存解析
ass BirthDate{
private int day;
private int month;
private int year;
public BirthDate(int d;int m,int y){
day = d;
}
public void setDay( int d){
day = d;
}
public void setMoth(int m){
month = m;
}
public void setYear(int y){
year = y;
}
public int getDay(){
return day;
}
public int getMonth(){
return month;
}
public int getYear(){
return year;
}
public void display(){
System.out.println(day+"-"+month+"-"+year);
}
}
public class Test{
public static void main(String args[]){
Test test = new Test();
int date=9;
BirthDate d1 = new BirthDate(7,7,1970);
BirthDate d1 = new BirthDate(1,1,2000);
test.change1(d1);
test.change2(d2);
System.out.println("adte="+date);
d1.display();
d2.display();
}
public void change1(int i){
i = 1234;
}
public void change2(BirthDate b){
b = new BirthDate(22,2,2004);
}
public void change3(BirthDate b){
b.setDay(22);
}
}
执行Test test = new Test();的时候调用Test的构造方法,int date = 9;在占内存里分配一个变量date等于9, 执行这句话的时候BirthDate d1= new BirthDate(7,7,1970);在占内存里分配一个变量叫d1:xxx指向堆内存里new出来的的一块内存,内存如图:
当执行完BirthDate d1= new BirthDate(7,7,1970);之后,方法完成之后为这个方法分配的局部变量消失所以内存图变成如下图所示:
BirthDate d2= new BirthDate(1,1,2000); 同上述一样;
当执行test.change1(date);这句话时,在调用change1这个方法,这时的i=9;之后,i变成 了1234,当方法执行完毕之后,分配给这个方法的局部变量消失,所以这个方法相当于白调用,栈内存变化如图:
当执行这句话时,test.change2(d1);在堆内存里分配new 出来的一块内存 b这个BirthDay的类型指向new 出来的对象之后,执行完方法之后,为这个方法分配的局部变量消失,没有一个变量指向new出来的新的对象,最后由java的垃圾回收机制回收掉;
当执行test.change3(d2);这段代码时,调用change3这个方法,BirthDay的变量b指向的是d2的setDay这个方法,并且在占内存里有一个变量d ,d的值为22,将22赋值给day,方法完成之后,堆内存里的day由1变成了22,最后方法执行完成之后,d这个变量消失最终的内存图为