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

浙公网安备 33010602011771号