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反例是举例错误