Java——方法的参数总是使用值传递

在C语言中函数的参数有值传递方式以及地址传递方式两种,但是在Java中只有值传递这一种方式。

案例一:

在下面的例子中执行将a乘以3

int a = 10;
three_a(a);

方法three_a()的部分如下:

public static void three_a(int x)
{
    x = x*3;
}

将a传入方法中,经过调用three_a()方法之后,首先x=10,x*3之后x变为30,最后离开方法体,a的值仍然是10,没有发生改变,整个过程只是将a的值进行了拷贝。

案例二:

假设构建了一个职工的类:

class Staff
{
    private String name;    //职工姓名
    private double salary;    //薪水
    publie Staff(String name, double salary)
    {
        this.name = name;
        this.salary = salary;
    }
    public String getName()
    {
        return name;
    }
    public String getSalary()
    {
        return salary;
    }
    public void raiseSalary(double p)
    {
        salary += (salary*p); 
    }
}

现在需要将一个员工的薪水提高20%,如下:

public class Test
{
    public static void main(String[] args)
    {
        Staff puff = new Staff("puff",5000);
        raiseSa(puff);
    }
    
    public static void raiseSa(Staff s)
    {
        s.raiseSalary(0.2);
    }
}

开始构建一个新的员工puff,其工资为5000,将对象puff传入方法raiseSa()之后,调用类Staff的raiseSalary()方法使得该员工薪水增加20%,但是这里改变的是一个Staff对象puff,在raiseSa()方法中首先将s指向puff所对应的一个对象,这里的s是对象的引用,调用raiseSalary()方法之后改变的是s指向的对象,同时该对象也是puff指向的对象,最后退出raiseSa()方法后,参数变量s不再使用,而main函数中的puff的salary已经提升了20%。

这是否表明Java也是有按照地址传递呢?

其实并不是,该案例中只是两个对象的引用始终指向同一对象,在下面的一个案例中将展示传入的参数为对象引用时,仍然会出问题。

案例三:

这里编写交换两个职员对象的方法:

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

接下来,构建两个Staff对象,并进行调换:

Staff a = new Staff("puff",5000);
Staff b = new Staff("clearlove",5000);
swap(a,b);

按说上面传入的是引用,应该经过swap()方法之后,a和b两个职员应该发生了互换,但结果仍然a是puff,b是clearlove;解释如下:

首先构建了两个实例对象的引用a和b,分别指向puff和clearlove;

将a和b传入swap()方法之后,方法的参数x和y分别指向puff和clearlove;

在swap()方法内部进行了交换操作之后,x和y分别指向clearlove和puff,可见确实发生了交换;

但是在该方法结束之后,参数变量x和y被丢弃,原来的变量a和b仍然这个swap()方法调用之前所引用的对象,即puff和clearlove,因此虽然传入的是对象的引用,但是调用交换方法之后并没有实现对象的交换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值