关于Java方法的参数
刚好看到C++的函数这块,说C++中除了引用类型的形参,其他都是实参的副本(个人总结)。
隐约记得Java中方法的参数也是这么回事,于是手动测试一番。
结果
Java中方法的参数都是值传递,哪怕是引用类型,传递的也是引用本身的副本(指向同一个对象)。
个人以为,将Java中的引用类型的变量看作指针更容易理解。
测试代码
import org.junit.Test; public class TestFunction { @Test public void testInt(){ int a = 3; int b = 4; swap(a, b); System.out.println(a + "---" + b); } @Test public void testString(){ String a = "hehe"; String b = "what"; swap(a, b); System.out.println(a + "---" + b); } @Test public void testInner(){ Inner a=new Inner(); a.setAge(10); Inner b=new Inner(); b.setAge(20); swap(a,b); System.out.println(a.getAge() + "---" + b.getAge()); } /** * 基本类型,是值传递,所以不会修改原对象 * * @param a * @param b */ public void swap(int a, int b){ a += b; b = a - b; a -= b; } /** * 字符串也是值传递 * @param a * @param b */ public void swap(String a, String b){ String tmp = a; a = b; b = tmp; } /** * 引用,传递的也是引用本身,类似地址。所以只是副本,不会影响原值。 * @param a * @param b */ public void swap(Inner a, Inner b){ Inner tmp=a; a=b; b=tmp; } /** * inner class */ class Inner{ private int age; public void setAge(int age){ this.age=age; } public int getAge(){ return this.age; } } }
补充
绝大多数时候,我们使用的都是传入对象(引用类型)的成员,所以不会涉及这个问题。因为引用的副本仍然指向同一个对象。