1 值传递
Java中,方法中所有参数都是“值传递”,也就是“传递的是值的副本”。 也就是说,我们得到的是“原参数的复印件,而不是原件”。因此,复印件改变不会影响原件。
在方法的调用过程中,实参把它的实际值传递给形参,此传递过程就是将实参的值复制一份传递到函数中,这样如果在函数中对该值(形参的值)进行了操作将不会影响实参的值。因为是直接复制,所以这种方式在传递大量数据时,运行效率会特别低下。
2 引用传递
引用传递弥补了值传递的不足,如果传递的数据量很大,直接复过去的话,会占用大量的内存空间,而引用传递就是将对象的地址值传递过去,函数接收的是原始值的首地址值。
在方法的执行过程中,形参和实参的内容相同,指向同一块内存地址,也就是说操作的其实都是源数据,所以方法的执行将会影响到实际对象
3 结论
基本数据类型传值,对形参的修改不会影响实参;引用类型传引用,形参和实参指向同一个内存地址(同一个对象),所以对参数的修改会影响到实际的对象。String, Integer, Double 等 immutable(常量) 的类型特殊处理,可以理解为传值,最后的操作不会修改实参对象
4 多个变量指向同一个对象
/** * 测试参数传值机制 * @author 赵广陆 * */ public class User4 { int id; //id String name; //账户名 String pwd; //密码 public User4(int id, String name) { this.id = id; this.name = name; } public void testParameterTransfer01(User4 u){ u.name="张三"; } public void testParameterTransfer02(User4 u){ u = new User4(200,"高三"); } public static void main(String[] args) { User4 u1 = new User4(100, "李四"); u1.testParameterTransfer01(u1); System.out.println(u1.name); u1.testParameterTransfer02(u1); System.out.println(u1.name); } }
执行结果如图4-所示: