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 呢???
小弟现在很迷糊!!Java 里面没有引用传递
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的方法里声明的,那么,它只能在当前方法域中有效
不要 计较他是传值还是传引用了 ,且看内存分析;
txt t = new txt();
执行时候,在内存栈区域里分配一片空间,名字叫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