Java是按值调用还是按引用调用的?

首先来看一段代码

int a = 10;
multiplyTen(a);
System.out.println(a);

 public static void multiplyTen(int x) {
        x = x * 10;
 }

a会改变吗?
肯定是不会改变的。a还是=10;
具体执行过程如下:

1.x初始化为a值的一个副本(即10);
2.x乘以10后等于100,但是 a的值仍然是10;
3.multiplyTen()方法结束后,参数x不再使用。

以上可以看出java是采用按值调用的。
接下来再看一段代码

class Employee {
    private double salary;

    public Employee(double salary){
        this.salary = salary;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
}

private static void raiseSalary(Employee e) {
        e.setSalary(e.getSalary() + 1000);
}

		Employee employee = new Employee(1000.0);
        raiseSalary(employee);
        System.out.println(employee.getSalary());
        

以上这段代码输出的结果会是什么呢?
答案是 2000。
难道不应该还是1000吗?
让我们来看一下这段代码的执行过程:

1.e初始化为employee值的一个副本,这里是一个对象引用,两者 都指向内存中的同一个对象;
2.raiseSalary方法应用于这个对象引用,,所以实际内存中该对象的工资会增加1000;
3.raiseSalary方法结束后,参数e不再使用,但是employee还是指向那个对象,而内存中的对象 工资是已经增加了1000的。

难道这就说明java中也有按引用调用吗?

再来看一个案例

 private static void swap(Employee tom, Employee jerry) {
        Employee tmp = tom;
        tom = jerry;
        jerry = tmp;
    }

		Employee tom = new Employee(1000.0);
        Employee jerry = new Employee(2000.0);
        swap(tom,jerry);
        System.out.println(tom.getSalary());
        System.out.println(jerry.getSalary());

这里swap之后,tom和jerry的工资是调换了吗?
并没有,tom还是1000块,jerry还是2000块?

同样,我们在分析这段代码的调用过程之后就能知道,这里交换的是tom和jerry这两个对象应引用的副本。

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

总结:

  1. 方法不能修改基本数据类型的的参数。
  2. 方法可以改变对象参数的状态。
  3. 方法不能让一个对象参数引用一个新的对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值