public class txt {
int i = 10;
}
public class main { public static void main(String[] args) {
// TODO Auto-generated method stub
txt t = new txt();
t.i = 100;
new main().another(t);
System.out.println(t.i);
}
public void another(txt t){
t.i = 200;
txt st = new txt();
t = st;
System.out.println(t.i);
}}程序的输出结果是:
10
200对于在 another(txt t)方法中输出了10,我了解,
但为什么在调用了another()方法后,再次打印t.i的值 是200。这个值是在another()中第一句 赋值语句有关。
为什么t.i的值 不是10,或者是100 呢???
小弟现在很迷糊!!
public class txt {
int i = 10;
}
public class main { public static void main(String[] args) {
// TODO Auto-generated method stub
txt t = new txt();
t.i = 100; 1. t.i 第一次变化为 100
new main().another(t);
System.out.println(t.i);5. 打印的t.i最后值为200
}
public void another(txt t){
t.i = 200; 2. t.i 第二次变化为 200
txt st = new txt(); 3. 又一个新的t t.i值为10
t = st;
System.out.println(t.i);4. 打印的新t.i
}}
能告诉我,在调用了another()方法后, 原来的对象t 是否发生了改变?
如果改变了 为什么要打印200,而不是打印10,在你所标注的 第3次的时候 t已经被赋值为 新的st对象了啊。。
public class main {
public static void main(String[] args) {
// TODO Auto-generated method stub
txt t = new txt();
}
}//这个声明和下面这个声明是一样的。
public class main {
static txt t = new txt();
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}//因为main是static的,它内部声明的变量相对于自己也是static的。
//所以你的例子中,它调用another方法时里面的t.i=200其实就是this.t.i=200;
//但txt st = new txt();这一句不同,它是在非static的方法里声明的,那么,它只能在当前方法域中有效
现在应该理解了吧?
// TODO Auto-generated method stub
txt t = new txt();
main方法里的这个t,保存的不是一个对象,而是对象的地址,也就是引用,而那个引用就是这个t所保存的值。所以值传递,也就是把保存的这个引用传递给参数!
执行时候,在内存栈区域里分配一片空间,名字叫t ,同时在内存堆区域里分配空间存放新new对象,t指向这个对象;同时赋初值i=10;
t.i = 100;
执行时候,t指向的堆区域里里的对象的i值变为100 new main().another(t);
执行的时候, 因为穿了一个参数,所以在内存栈区域区域里还要分配一个空间,参数t 为它的名字,
它也指向堆里那个new 对象函数内容::
t.i = 200;执行时候,将堆里那个对象赋值i=200;
txt st = new txt();
执行时候,在内存栈区域里分配一片空间,名字叫st ,同时在内存堆区域里分配空间存放新new对象,st指向这个对象;同时赋初值i=10;
t = st;
执行的时候,t引用 现在不指向i=200那个对象了, 而是指向i=10那个对象了;
System.out.println(t.i);
执行时候 此时输出t.i=st.i=10;到这个时候,函数执行结束,局部变量以及参数变量全部消失,内存空间回收,所以 st 对象没了, 参数t 引用消失了,但是此时函数外面的引用t 所指向的那个对象,因为参数t
t.i=200 的执行 已经变成了200 , 尽管参数t现在消失了,但是这个值还是在的;
System.out.println(t.i);执行的时候 ,输出为200