JAVA为何是值传递而不是参数传递
概念
java方法中的形参:
- 基本数据类型
- 引用类型
值传递与引用传递
- 值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参数的值。
- 引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。
举例证明
举例1:基本数据类型
public static void main(String[] args) {
int i = 10;
fun(10);
System.out.println("主函数中i是:" + i);
}
public static void fun(int j) {
j = 20;
System.out.println("调用函数中j是:" + j);
}
输出结果是:
调用函数中j是:20
主函数中i是:10
分析:
形参j改变了,不影响实参i的值
举例2:引用类型
public static void main(String[] args) {
String name = "main";
fun(name);
System.out.println("主函数中name是" + name);
}
public void fun(String name1) {
name1 = "fun";
System.out.println("调用函数中name1是" + name1);
}
输出结果是:
调用函数中name1是:fun
主函数中name是:main
分析:
假如对象"main"的存储地址是0x2000
那么实参name的值就是0x2000
形参name1的值也是0x2000
调用方法fun时,name1的值变成了"fun1"的存储地址0x3000
此时符合判断条件,形参的值改变了,此时实参的值name未发生改变,仍然是"main"
所以是值传递
举例3:引用类型(错误反例)
public static void main(String[] args) {
User user = new User();
user.setName("张三");
user.setAge(12);
fun(user);
System.out.println("主函数中用户是:" + user.toString());
}
public void fun(User u) {
u.setName("李四");
u.setAge(20);
System.out.println("调用函数中用户是:" + u.toString());
}
输出结果是:
调用函数中用户是:李四20
主函数中用户是:张三12
分析:
咦,奇怪,为啥形参u改变影响了实际参数user的值??
这不是引用传递的特征吗:方法执行中形式参数值的改变将会影响实际参数的值
误区在于搞错了:形式参数u的值是地址0x1000,实参user的值是地址0x1000,例子3中fun方法中改变的是实际对象的值,而形参u的值仍然是0x1000,改变的是形参的具体内容,而没有改变形参的值,怎么能去验证上面的特征?
所以根本原因在于上面的例3反例是举例错误