Java只有值传递

主要是看了知乎上这个问题的启发所学到的 Java中参数传递:引用传递和值传递的问题?

然后从stack overflow看了一个问题(地址记不住啦)

当传递的参数是基本类型的时候,将会为该参数拷贝一个副本。并作为实际参数传入方法中。
当传递的参数是引用类型的时候,传入的参数应为某引用类型数据的引用,假设为A。在传递参数时,传入的参数就是该”引用A“的”拷贝“。
 
写个栗子
一个类 Dog 
 1 public class Dog{
 2     private String name;
 3 
 4     public String getName(){
 5         return name;
 6     }
 7     
 8     public void setName(String name){
 9         this.name=name;
10     }
11 
12     public Dog(String name){
13         this.name=name;
14     }
15 }

main方法

public class Test {
    public static void main(String[]args){
        //声明两个变量 且变量name均为Max
        Dog d= new Dog("A");
        Dog d1= new Dog("A");
        foo(d);
        foo1(d1);
        System.out.println("d.name="+d.getName());
        System.out.println("d1.name="+d1.getName());
    }

    public static void foo(Dog d)
    {
        System.out.println("foo start");
        System.out.println("Dog.name="+d.getName());
        d.setName("B");
        System.out.println("Dog.name="+d.getName());
        System.out.println("foo end");
    }
    
    public static void foo1(Dog d){
        System.out.println("foo1 start");
        System.out.println("Dog.name="+d.getName());
        d = new Dog("B");
        System.out.println("Dog.name="+d.getName());
        System.out.println("foo1 end");
    }
}

运行结果

foo start
Dog.name=A
Dog.name=B
foo end
foo1 start
Dog.name=A
Dog.name=B
foo1 end
d.name=B
d1.name=A
 
通过上述代码可以看出来
在开始时 程序声明并实例化了两个对象。并分别创建d,d1两个变量引用这两个对象,并给两个对象的名都命名为A。
在方法foo()中,方法获取了对象d的引用,并通过这个引用修改了引用d的指向的对象的name属性。
在方法foo1()中,方法同样获取了d1的引用,但是在方法体内部,又将参数指向了一个新的name属性为“b”的对象,如果是引用传递的话,那么传入参数d1的指向也应该为新的对象(B),但实际上在程序的运行结果中我们发现d1的name属性还是"A"。也就是说方法内部的参数的引用指向改变并没有影响d1的引用指向。
 
理解:
java中的方法在以引用变量为传入参数的时候,实际上是创建了一个新的引用,同时把传入参数的引用指向拷贝到这个引用上(即在调用时被传入参数为A,在方法体内部的传入参数为B,让B的指向和A相同。因此,在不改变B的指向的条件下,如果修改B指向的对象的值,则因为A也指向该对象,故A也受影响。如果在方法执行过程中,修改了B的引用指向,这之后对B的操作等等于对一B所指向的对象进行操作,此时A不受影响。

 

那么问题来了 能不能在不依靠返回值的情况下完成一个public void swap(Object a,Object b)方法,来交换对象a和b......

 

posted @ 2015-03-25 14:44  Alex_zhang  阅读(160)  评论(0)    收藏  举报