美文网首页
为什么说 Java 中只有值传递?

为什么说 Java 中只有值传递?

作者: zhimin_ | 来源:发表于2022-01-11 18:40 被阅读0次

值传递和引用传递概念

在方法调用时,在方法内部对参数修改,如果影响到参数的原始值,那么就是引用传递;如果修改后,参数原始值不变,那么就是值传递。
这也是判断值传递和引用传递的最根本原则。

代码实验

下面是对针对基础类型、String 类型、复杂类型的测试

public class ParamTransTest {

    public static void main(String[] args) {
        ParamTransTest paramTransTest = new ParamTransTest();
        // 修改整数
        int i = 1;
        paramTransTest.changeInt(i);
        System.out.println(i +"\n");

        // 修改字符串
        String str = "str";
        paramTransTest.changeStr(str);
        System.out.println(str + "\n");

        // 修改复杂对象
        User user = new User("xiao ming");
        paramTransTest.changeUser(user);
        System.out.println(user);
    }


    public void changeInt(int i) {
        i = i + 1;
        System.out.println(i);
    }

    public void changeStr(String str) {
        str = "string";
        System.out.println(str);
    }

    public void changeUser(User user) {
        // 这里有同学会有疑问了,为什么要 new 一个对象出来,其实这样做恰恰是为了看能否改变形参的值,因为这里传的参数是『对象的引用』,目的就是改变它,而不是它在堆区的内容。
        // 很多同学在这里会有一个思维误区,需要纠正。
        user = new User("xiao ming is 10 years old.");
        System.out.println(user);
    }


}

class User {
    private String name;

    public User(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                '}';
    }
}

从实验结果可见,Java中对集中类型的参数传递后修改,都没影响参数原始值。
\color{red}{这里对复杂对象很多人有一个误区,复杂对象作为形参,传的是『对象的引用』,那么试图修改该参数,原始参数是否} \color{red}{改变?实验证明,原始值仍然是旧的对象的引用,并没有改变,这里已通过打印堆区内容证明。}

相关文章

网友评论

      本文标题:为什么说 Java 中只有值传递?

      本文链接:https://www.haomeiwen.com/subject/yyficrtx.html