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 呢???
小弟现在很迷糊!!
                    

解决方案 »

  1.   

    那为什么 main() 函数 最后一句打印的值不是  100呢?还有在什么情况下是 引用传递
      

  2.   


    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
            
        }}
      

  3.   

    http://topic.csdn.net/t/20060605/13/4801113.html去仔细看看这个吧!先研究一下再问效果会更好一些!
      

  4.   


    能告诉我,在调用了another()方法后, 原来的对象t 是否发生了改变?
    如果改变了 为什么要打印200,而不是打印10,在你所标注的 第3次的时候 t已经被赋值为 新的st对象了啊。。
      

  5.   


    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的方法里声明的,那么,它只能在当前方法域中有效
    现在应该理解了吧?
      

  6.   

    一共有两个 txt 的对象 第一个是main里的t 第三步的时候改变这个t的i为200 第二个是another中的st another里打印的其实st的i值
      

  7.   

    public static void main(String[] args) {
            // TODO Auto-generated method stub    
            txt t = new txt();
    main方法里的这个t,保存的不是一个对象,而是对象的地址,也就是引用,而那个引用就是这个t所保存的值。所以值传递,也就是把保存的这个引用传递给参数!
      

  8.   

    java对象都是引用传递的,基本类型才是值传递
      

  9.   

    楼主  不要 计较他是传值还是传引用了 ,且看内存分析;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