关于java方法参数值传递的理解

      关于Java方法参数是值传递还是参数传递,我们首先明确是值传递。先看一下下面的例子:

       1、定义方法tripleValue(double x)

             public void tripleValue(double x){//将参数值增加三倍

                    x=3*x; 

             }

             下面调用这个方法:

             double percent = 10;

             tripleValue(percent);

             调用结束后percent的值仍然是10,并没有发生改变。

             因为方法调用的执行过程是:

             1)、x被初始化为percent值的一个拷贝(也就是10)

             2)、x被乘以3之后等于30。但是percent仍然是10。

             3)、这个方法结束后,参数变量x不再使用

        2、给方法tripleValue传递一个对象引用类型的参数

            现在有一个雇员类Employee。这个类的raiseSalary(double salary)方法可以将某个雇员对象的薪资增加。

            我们实现一个这样的方法tripleValue(Employee x)。

            public void tripleValue(Employee x){

                   x.raiseSalary(200);

            }

            下面调用这个方法

             harry = new Employee();

             tripleValue(harry);

             调用结束我们会发现harry的工资增长了!

             好了,到这我们也许会想,这不就是引用传递吗,harry指向的对象的属性值发生变化了呀。其实不是这样的,我们再看一下方法调用的过程:

             1)、x被初始化为harry值的拷贝,这里是一个对象的引用。

             2)、raiseSalary方法应用于这个对象引用。x和harry同时引用的那个Employee对象的薪金提高了200。

            3)、方法结束后,参数变量x不再使用。当然,对象变量harry继续引用那个薪资增加200的雇员对象。

            可见参数是对象引用时,仍然是值传递。

            3、再看一个说明java参数传递是值传递的例子:

            编写一个交换两个雇员对象的方法:

            public void swap(Employee x , Employee y){

                   Employee temp = x;

                   x = y;

                   y = temp;

             }

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

            Employee a = new Employee();

            Employee b = new Employee();

            swap(a,b);

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

            这个过程说明:java对对象采用的不是引用传递,实际上,对象引用进行的是值传递。

            下面总结一下在java程序设计语言中,方法参数的使用情况:

             1)、一个方法不能修改一个基本数据类型的参数(即数值型和布尔型)。

             2)、一个方法可以改变一个对象参数的状态。

             3)、一个方法不能实现让对象参数引用一个新的对象。

C++有值调用和引用调用,引用参数标有&符号。可以实现tripleValue(double & x)方法或swap(Employee & x , Employee & y)方法实现修改他们的引用参数的目的

猜你喜欢

转载自642047940.iteye.com/blog/2213559