再探java方法参数的传递

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bbbbln/article/details/80958229

我们知道方法传递有值传递、引用传递、名称传递。

而在java中,是统一的值传递,是一个值的拷贝

对于原始类型,传递方法参数就是这个具体值。所以在方法里面改变这个值是不影响方法调用时的地方值。

而对于对象类型,是一个引用的拷贝。我们可以看下面的例子。

首先,我们定义一个Employee类。

class Employee{

    public Employee(int s){
        this.salary = s;
    }
    private int salary;

    public int getSalary() {
        return salary;
    }

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

}

然后,写一个调用方法:

    public static void main(String[] args) {
        Employee a = new  Employee(4);
        Employee b = new  Employee(5);
        System.out.println("employee a salary:"+a.getSalary());
        System.out.println("employee b salary:"+b.getSalary());
        swap(a, b);
        System.out.println("employee a salary:"+a.getSalary());
        System.out.println("employee b salary:"+b.getSalary());
    }

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

仔细看以上程序,我们预估员工a和员工b交换了。

但真实是这样的吗?

运行一下。

运行后的结果,

employee a salary:4
employee b salary:5
employee a salary:4
employee b salary:5

发现没有a和b并没有交换。

这是为什么?

如果用指针的概念就比较好理解了。

对于Employee a = new Employee(4);,这里的a实际上并不是真正的对象本身,它只是一个引用。当把a传给swap方法时,拷贝的是a本身即这个引用值。

所以,在swap方法里,交换的都是引用值的拷贝,对于对象本身来讲,是没有任何影响的。

既然是这样,我们如果要改变a引用真正对象的值。我们可以这样。


    public static void main(String[] args) {
        Employee a = new  Employee(4);
        System.out.println("employee a salary:"+a.getSalary());
        setSalary(a);
        System.out.println("employee a salary:"+a.getSalary());
    }

    public static void setSalary(Employee e){
        e.setSalary(500);
    }

这样的话,虽然传进去的是对象a的引用值拷贝,但是引用的位置是对的啊。这样参考引用去改变对象的值,是可以成功的。

可以看下结果:

employee a salary:4
employee a salary:500

这样就是没问题的。

不知道,我解释的是不是够明白。如果文章被你看到了,可以给个反馈。^-^

猜你喜欢

转载自blog.csdn.net/bbbbln/article/details/80958229