51代码网ORACLEMYSQLSQL SERVER其它数据库java/jspasp/asp.netC/C++/VC++APP应用其它语言服务器应用
您现在的位置: 51代码网 >> java >> 文章正文

java方法的参数是传值还是传引用

更新时间:2012-3-17:  来源:51代码网

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

赞助商链接
推荐文章
  • 此栏目下没有推荐文章
  • {
    设为首页 | 加入收藏 | 友情链接 | 网站地图 | 联系站长 |