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

准备一个雇员类:

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》

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容