Java对对象采用的是值调用还是引用调用?

2020-05-14  本文已影响0人  笨笨牛皮糖

准备一个雇员类:

public class Employee {
    private String name;
    private double salary;

    public Employee(String n, double s) {
        name = n;
        salary = s;
    }

    public String getName() {
        return name;
    }

    public double getSalary() {
        return salary;
    }
}

首先,编写一个交换两个雇员对象的方法:

public static void swap(Employee x, Employee y) { // does't work
    Employee temp = x;
    x = y;
    y = temp;
}

如果Java对对象采用的是按引用调用,那么swap方法就应该能够实现交换数据的效果:

Employee a = new Employee("Alice", 400);
Employee b = new Employee("Bob", 300);
swap(a,b);
// does a now refer to Bob, b to Alice?

但是,方法并没有改变存储在变量a和b中的对象引用。swap方法的参数x和y被初始化为两个对象引用的拷贝,这个方法交换的是这两个拷贝。

// x refers to Alice, y to Bob
Employee temp = x;
x = y;
y = temp;
// now x refers to Bob, y to Alice

可以输出看一下:

System.out.println("a.name=" + a.getName() + ",a.salary=" + a.getSalary());
System.out.println("b.name=" + b.getName() + ",b.salary=" + b.getSalary());

>>> a.name=Alice,a.salary=400.0
>>> b.name=Bob,b.salary=300.0

最终,白费力气。在方法结束时,参数变量x和y被丢弃了。原来的变量a和b仍然引用这个方法调用之前所引用的对象。

这个过程说明:Java程序设计语言对对象采用的不是引用调用,实际上,对象引用是按值传递的。

引用自《Java核心技术 卷I》

上一篇 下一篇

猜你喜欢

热点阅读