Java参数——值传递 or 引用传递
值传递
提供给方法的参数是变量的值,不是变量本身,方法的形参在创建时被赋予响应的值,但是对实际变量没有任何影响,不会改变它们的任何状态。
举个例子如下:
public class Params {
public static void add(int x){
x = x + 10;
System.out.println(x); //这里a是20
}
}
class Test01{
public static void main(String[] args) {
int a = 10;
Params.add(a);
System.out.println(a); //这里a还是10
}
}
输出结果为:20 ; 10
解释:
内存中,实变量为a,其值为10。
Params.add(a); 执行时,形参x相当于创建了一个副本,并把a的值接收了进来,即x = 10,之后在函数add执行中,x = x + 10 变为20,add函数执行完成后,x形参变量失效,故a仍是10,没有任何改变,相当于只是另外建了一个副本而已。
数据类型
因此Java中对于基本数据类型,是值传递,不能修改实际变量。
那么如果参数是对象引用会有什么情况??
代码:
//这里定义个简单的员工类型
class Employee{
int id;
int salary;
public Employee() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
}
//定义个操作类,内有一个方法 给员工加薪1000元
class AddSalary{
public static void Addmoney(Employee employee){
employee.setSalary(employee.getSalary() + 1000);
System.out.println(employee.getSalary());
}
}
//测试
class Test02{
public static void main(String[] args) {
Employee yan = new Employee();
yan.setSalary(1000);
AddSalary.Addmoney(yan);
System.out.println(yan.getSalary());
}
}
最终输出的结果为:2000 ; 2000 在内存中也实现了对一个对象的修改
解释:
employee创建了一个对象引用,与yan一同指向了内存中的变量实体,因此employee对实体进行操作后,实体的值就改变了,当函数调用结束后employee失效了,但是这时用yan访问内存实体就是已经修改过的值。
Java参数是值传递还得引用传递?
举例说明即可:
class AddSalary{
public static void Addmoney(Employee employee){
employee.setSalary(employee.getSalary() + 1000);
System.out.println(employee.getSalary());
}
//Java是值传递还是引用传递 举例
public static void swap(Employee a, Employee b){
Employee temp = new Employee();
temp = b;
b = a;
a = temp;
System.out.println(a.getId());
System.out.println(b.getId());
}
}
class Test03{
public static void main(String[] args) {
Employee yan = new Employee();
yan.setId(1);
Employee zhao = new Employee();
zhao.setId(10);
AddSalary.swap(yan,zhao);
System.out.println(yan.getId());
System.out.println(zhao.getId());
}
}
输出结果:10 1 ; 1 10
解释:
调用 AddSalary.swap(yan,zhao);后 首先创建形参a , b,a和yan指向同一个内存实体,b和zhao指向同一个内存实体,然后执行swap函数,a指向了zhao的实体,b指向了yan的实体,但是函数返回后,a ,b失效了,yan和zhao 仍然指向原来的实体。
结论
Java对于对象引用参数,按值传递,并非按引用传递。