W
e
l
c
o
m
e
: )

Java是值传递 or 引用传递?

Java到底是值传递还是引用传递,这个话题争论来争论去,公说公有理,婆说婆有理,但是笔者始终坚定的认为:Java是值传递。
下面我会通过几个代码示例来进行证明:

public class Test01 {
    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 20;
        test01(num1,num2);
        System.out.println("num1:"+num1);
        System.out.println("num2:"+num2);
    }

    /**
     * 基本数据类型验证
     * @param num1
     * @param num2
     */
    public static void test01(int num1,int num2){
        int temp = num1;
        num1 = num2;
        num2 = temp;
        System.out.println("num1:"+num1);
        System.out.println("num2:"+num2);
    }
}

上面的这段代码用于测试基本数据类型的传递,测试结果如下:

num1:20
num2:10
num1:10
num2:20

可以看到,交换形参num1num2并没有影响到实参本身,说明传入的实际上只是实参的一个副本。再来看看引用类型的传递:

public class Test01 {
    public static void main(String[] args) {
        Person p = new Person("zhangsan");
        test02(p);
        System.out.println("name:"+p.name);
    }

    public static void test02(Person person){
        person.name = "lisi";
        System.out.println("name:"+person.name);
    }

    public static class Person{
        public String name;

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

这段代码用于测试引用类型的传递,测试结果如下:

name:lisi
name:lisi

从测试结果来看好像确实是引用传递啊,因为原来的实参的name属性也被修改了。我们再来看下面的这段代码:

public class Test01 {
    public static void main(String[] args) {
        Person p1 = new Person("zhangsan");
        Person p2 = new Person("lisi");
        test03(p1,p2);
        System.out.println("p1:name:"+p1.name);
        System.out.println("p2:name:"+p2.name);
    }

    public static void test03(Person p1,Person p2){
        Person temp = p1;
        p1 = p2;
        p2 = temp;
        System.out.println("p1:name:"+p1.name);
        System.out.println("p2:name:"+p2.name);
    }

    public static class Person{
        public String name;

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

上面这段代码将两个引用类型的形参进行了交换并打印,测试结果如下:

p1:name:lisi
p2:name:zhangsan
p1:name:zhangsan
p2:name:lisi

通过测试结果可以看出,原来的实参好像并没有受到形参交换的影响啊,不是说好的引用传递嘛。那这就只有一种解释了:其实这依然是值传递,只不过传递的不是对象本身,而是引用值,也就是对象的地址,也就是说形参和实参它们并不是同一个东西,它们只是指向的对象是一样的,所以在第二个测试代码那里形参修改对象属性的时候看到实参也被改了,但是在第三个测试代码那里却没有影响,因为实参依然指向原来的对象,而形参已经指向另一个对象了。
image

posted @ 2026-07-28 16:25  寒月静无光  阅读(2)  评论(0)    收藏  举报