Java参数——值传递or引用传递

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对于对象引用参数,按值传递,并非按引用传递。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值