值传递?
参数传递的值的拷贝,改变拷贝不影响原参数。
引用传递?
参数传递的是参数本身,改变形参,实参也改变。
Java中是什么传递?
Java中只有值传递
实际情况为什么不对呢?
1. 基本数据类型
1 public class Main { 2 3 4 void method01(int a ){ 5 a++; 6 System.out.println("a in method01 is "+a); 7 } 8 9 public static void main(String[] args) { 10 Main main = new Main(); 11 int a = 12; 12 13 main.method01(a); 14 System.out.println(a); 15 16 17 } 18 }
输出结果:
a in method01 is 13
12
没有问题,原值没有改变。
2. String类型
1 public class Main { 2 3 void method02(String s){ 4 s = "world"; 5 System.out.println("string in method is "+s); 6 7 } 8 9 10 public static void main(String[] args) { 11 Main main = new Main(); 12 13 String s = "hello"; 14 15 main.method02(s); 16 System.out.println(s); 17 18 19 } 20 }
输出结果:
string in method is world
hello
没有问题,是值传递。原值没有改变
3. 自定义类
public class Main { void method03(Cat cat){ cat.setName("haha"); System.out.println("cats name is "+cat.getName()); } public static void main(String[] args) { Main main = new Main(); Cat cat = new Cat(); cat.setName("mimi"); main.method03(cat); System.out.println("cats name in main is "+cat.getName()); } } class Cat{ String name; public void setName(String name) { this.name = name; } public String getName() { return name; } }
输出结果:
cats name is haha
cats name in main is haha
不对!为什么值传递原值改变了??????
注意了,这里虽然原值改变了,但是还是值传递。为什么呢?
因为传递的是参数的引用的拷贝也是值传递,这里的值指的是地址的拷贝。
这里举一个简单的例子(引用地址:https://www.cnblogs.com/wchxj/p/8729503.html)
值传递:你有一把钥匙,当你的朋友想要去你家的时候,你复刻了一把新钥匙给他,自己的还在自己手里,这就是值传递。这种情况下,他对这把钥匙做什么都不会影响你手里的这把钥匙。
引用传递:你有一把钥匙,当你的朋友想要去你家的时候,如果你直接把你的钥匙给他了,这就是引用传递。这种情况下,如果他对这把钥匙做了什么事情,比如他在钥匙上刻下了自己名字,那么这把钥匙还给你的时候,你自己的钥匙上也会多出他刻的名字。
当你使用值传递,拷贝一份钥匙给你朋友后,你朋友在你家砸了电视,那么你回家的时候电视肯定是被砸了的。
这个例子理解起来就容易多了。按照这个逻辑我们来测验一下。
如果Java传递的只是引用的拷贝的话,我们将形参指向null,那么实参不会受到影响。通过上面的例子来解释就是,如果你给你朋友的钥匙只是一把复制的钥匙的话,我们将朋友手上的钥匙摧毁,我们还是能通过钥匙原件开门。
public class Main { void method04(Cat cat){
//摧毁朋友手中的钥匙 cat = null; try { System.out.println(cat.getName()); }catch (Exception e){ e.printStackTrace(); System.out.println("cat 已经被回收!"); } } public static void main(String[] args) { Main main = new Main(); Cat cat = new Cat(); cat.setName("mimi"); main.method04(cat); System.out.println(cat.getName()); } } class Cat{ String name; public void setName(String name) { this.name = name; } public String getName() { return name; }
输出结果:
java.lang.NullPointerException
at Main.method04(Main.java:21)
at Main.main(Main.java:44)
cat 已经被回收!
new name
没错!就是这样。
所以Java中只有值传递。