Java中的参数传递

今天在做一道数组相关的leetcode题目时,遇到了数组作为方法参数传递的一些麻烦,于是查阅资料后整理记录下来。
网上很多博文都提到了Java的值传递、引用传递,虽然一部分情况下这样说也解释的通,但这确实是不正确的说法。

Java 总是 采用按值调用,方法得到的是所有参数值的一个拷贝。
Java对对象采用的不是引用调用,实际上,对象引用进行的是值传递。

方法参数类型共有两种:
1.基本数据类型(数字、布尔值)
2.对象引用
我们已经知道一个方法不可能修改一个基本数据类型的参数。但对象引用就不同了,可以很容易利用下面的方法把一个员工的工资提高两倍。

public static void tripleSalary(Employee x)  {
     x.raiseSalary(200);
}

当调用

Employee harry = new Employee();
tripleSalary(harry);

时,具体的执行过程为:
1.x被初始化为harry值得拷贝,这里是一个对象的引用。
2.raiseSalary方法应用于这个对象的引用。x和harry同时引用的那个Employee对象的工资提高了200%;
3.方法结束后,参数变量x不再使用。对象变量harry继续引用那个工资增至3倍的员工对象。
在这里插入图片描述
实现一个改变对象参数状态的方法并不是一件难事。理由很简单,方法得到的是对象引用的拷贝,对象引用及其拷贝同时引用同一个对象。

很多人认为Java对对象采用的是引用调用,实际上这种理解是不对的。下面给出一个反例来解释这个问题。
首先,编写一个交换两个员工对象的方法:

public static void swap(Employee x,Employee y){
    Employee temp = x;
    x = y;
    y = temp;
}

如果Java对对象采用的是引用调用的话,那这个方法就能够实现交换数据的效果:

Employee a = new Employee("Alice");
Employee b = new Employee("Bob");
swap(a,b);
System.out.println("a's name is "+a.getName());
System.out.println("b's name is "+b.getName());

输出:

a's name is Alice
b's name is Bob

但是,方法并没有改变存储在变量a和b中的对象的引用。swap方法的参数x和y被初始化为两个对象引用的拷贝。方法交换的是这两个对象的拷贝!
最终白费力气,在方法结束时参数变量x和y被丢弃了。原来的变量a和b仍然引用方法调用之前所引用的对象。
在这里插入图片描述

Java中的引用更像C\C++中的指针,当我们定义一个对象时(比如Employee e = new Employee(); ),定义的对象实例会放到Java堆中,而变量e(即引用)会放到Java栈中,e指向堆中的Employee对象实例。

下面总结一下Java中方法参数的使用情况:
1.一个方法不能修改一个基本数据类型的参数(即数值型和布尔型)。
2.一个方法可以改变一个对象参数的状态。
3.一个方法不能让对象参数引用一个新的对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值