黑马程序员技术交流社区

标题: i很是伤脑筋啊 [打印本页]

作者: 金_鑫    时间: 2012-7-29 14:43
标题: i很是伤脑筋啊
本帖最后由 金_鑫 于 2012-7-31 00:28 编辑

在Java中方法参数的传递,对象是传递引用,基本数据类型是传递值。而且一直一来都似乎没有人提出过疑问。
  直到最近,我才发现,这错了!在方法中,Java语言中对象传递的是地址,而不是引用,这两个概念是有非常大的差别的,我相信熟悉c++的人都应该知道。
  例如下面:假设对象Test有name的属性。
  public void call(Test t) {
  Test t2 = new Test();
  t2.setName("cba');
  t.setName("abc");
  t = t2 ;
  }
  
  public static void main(String[] arg) {
  Test obj = new Test();
  call (obj) ;
  System.out.println("obj"+obj.getName());
  }
  这个时候,你们可以发现,打印出来的是"abc" ,而不是"cba",原因是这样的,在这次调用中,等于声明了两个变量obj , t,它们指向的是同一个地址,调用call方法,只是将obj指向的地址传递给了t,而obj本身并没有传递过去(也就是没有传递引用),当你重新赋值的时候(也就是将对象引用指向其他存储空间),等于只影响了t,而没有影响obj。
  这样的传递方式只能称之为址传递,或者是引用对象传递,而不嫩说是传递引用或者引用传递。
  我不知道这究竟属于翻译的错误,还是我们理解的错误。
作者: 丁二跃    时间: 2012-7-29 14:52
不要想太多………
java 只有值传递 , 你变量存的什么 传的 就是什么 : 基本数据类型存的 就是 1234 这些值 ,对象 变量存的就是对象地址……
作者: 张頔    时间: 2012-7-29 15:29
class  find
{        String name;
        public void setName(String s){
                this.name = s;
        }
        public String getName(){
                return name;
        }
        public static void call(find f) {
                find f2 = new find();
                f2.setName("cba");
                System.out.println("f2: "+f2);//f2的地址
                f.setName("abc");//待会你把这句话注释了,可以看得明白点
                System.out.println("f : "+f);//f的地址
                f = f2;
                System.out.println("f```````` : "+f);//指向的地址,但是f还有自己的地址和属性
        }
                public static void main(String[] arg) {
                find obj = new find();
                call (obj) ;
                System.out.println("obj"+obj.getName()); //这个地方就是f自己的属性
                System.out.println("obj : "+obj);//这事f自己的地址,虽然他还指向别的地址
                }
}

结果
f2: ceshi.find@18a992f
f : ceshi.find@4f1d0d
f```````` : ceshi.find@18a992f
objabc
obj : ceshi.find@4f1d0d




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2