关于程序:
class BirthDate {
private int day;
private int month;
private int year;
public BirthDate(int d, int m, int y) {
day = d;
month = m;
year = y;
}
public void setDay(int d) {
day = d;
}
public void setMonth(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);
}
}定义了一个Birthday类,这个类有三个成员变量 day,month,year,写出带有三个参数的构造函数,这个构造函数用于生成目标参数的对象,并且构造三参数的get和set方法,并且写一个display方法;
public class Test{
public static void main(String args[]){
Test test = new Test();
int date = 9;
BirthDate d1= new BirthDate(7,7,1970);
BirthDate d2= new BirthDate(1,1,2000);
test.change1(date);
test.change2(d1);
test.change3(d2);
System.out.println("date=" + 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类,并在主方法中new一个test对象,用于调用test类中定义的方法:有三个;
在主方法中new 两个d1和d2对象,分别带有不同的day,month,year;
在主方法中声明并赋值一个整型常量,date,数值为9;
接着test对象调用chang1方法,将值date作为实参代入该方法如下:
public void change1(int i){
i = 1234;
}
分析该方法:
首先定义了一个整型变量后,即在栈内存中定义了一块空间,命名为date,数值为9;作为基本数据类型,date值只占了一块空间哟;
Change1方法中有一个局部变量i,所以运行整个方法时,在栈空间中创建一个i并给ta一份空间,因为代入i的值是date,所以刚开始i为9;接下来运行语句:i = 1234;i被重新赋值为1234;该方法运行结束后,i就被内存回收了;注意:date的值并没有发生变化!
然后运行change2方法;
public void change2(BirthDate b) {
b = new BirthDate(22,2,2004);
}
分析该方法:
Change2方法中有局部变量b,所以在栈内存中定义一个对象b,这是一个引用数据类型;因为代入的b是d1对象,所以b对象指向的栈地址是d1的栈地址,指向的堆内存变量是d1的堆内存变量,接下来,运行方法change2,运行语句b = new BirthDate(22,2,2004);此刻在new 了一个个新的b对象,并且为这个对象赋值;此刻,b的栈地址不在是d1的栈地址,b的堆内存变量也不在是d1的堆内存变量;接下来该方法运行结束了,方法运行结束后,其局部变量会被内存回收,所以b对象去哪呢,被内存回收了,d1对象发生了变化么?没有!!
接下来运行change3方法
public void change3(BirthDate b) {
b.setDay(22);
}
在change3方法中有一个局部变量,b,这个b对象是引用数据类型.刚开始在栈内存中,b的栈地址就是代入该方法的的d2的栈地址,对内存变量就是d2的堆内存变量,接下运行方法,b.setDay(22);此时,b对象的day值重新设为了22;此刻d2的day值是否发生了变化呢?发生了变化,因为b对象和d2对象此刻的堆栈地址和变量都是一样的,b发生了改变,所以d2的变量也要发生变化;
接下来执行
System.out.println("date=" + date);
date 的只没有发生变化,所以 date已然为9;
d1.display();输出了d1的个变量值,此刻d1的变量值没有发生变化,所以也不会变化
d2.display();因为d2的day值发生了变化,所以d2输出的变量值中day值发生了变化.
以上就是这个程序的分析;内存分析!
d1.display();
d2.display();