欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-09 20:32:14
...

      关于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)方法实现修改他们的引用参数的目的