您的位置:首页 > 编程语言 > Java开发

有关java中的参数调用的问题

2018-01-01 00:00 260 查看
摘要:
关于值传递、引用传递啊什么的,每次都没能够深刻理解。翻了很多博客,也都没什么实质性的理解,索性自己写一下,顺道再消化一遍。

专业术语——

按值调用(call by value) 表示方法接受的是调用者提供的值。

按引用调用(call by reference) 表示方法接受的是调用者提供的变量地址。

一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。

java中只有值传递!

java中只有值传递!

java中只有值传递!

重要的事情要说三遍!!!

也就是说,方法得到的是所有参数值的一个拷贝,特别是,方法不能修改传递给它的任何参数变量的内容。

public static void tripleValue(double x) // doesn't work
{
x=3*x;

}

double persent = 10;
tripleValue(percent);


可以看到,无论怎样,调用这个方法之后,percent的值还是10.下面看一下具体的执行过程:

1) x 被初始化为percent值的一个拷贝(也就是10)。
2) x被乘以3后等于30.但percent仍然是10)
3) 这个方法结束之后,参数变量x不再使用。


方法参数共有两种类型:

.基本数据类型(数字、布尔值)。

.对象引用。

一个方法不可能修改一个基本数据类型的参数。而对象引用作为参数就不同了,可以很容易地利用下面这个方法实现将一个雇员的薪金提高两倍的操作:

public static void tripleSalary(Employee x) //works
{
x.raiseSalary(200);
}

当调用
harry = new Employee(...);
tripleSalary(harry);
时,具体的执行过程如下:

1) x被初始化为harry 值的拷贝,这里是一个对象的调用。
2) raiseSalary 方法应用于这个对象引用。x和harry同时引用的那个Employee对象的薪金提高了200%。
3) 方法结束后,参数变量x不再使用。当然,对象变量harry继续引用那个薪金增至3倍的雇员对象。

方法得到的是对象引用的拷贝,对象引用及其他的拷贝同时引用同一个对象。

下面我们写一个交换两个对象的方法:

Boy a = new Boy(...);
Boy b = new Boy(...);
swap(a,b);

public static void swap(Boy x, Boy y) //doesn't work
{
Boy temp = x;
x = y;
y = tmp;
}

swap 方法的参数x和y 被初始化为两个对象引用的拷贝,这个方法交换的是这两个拷贝。

然而,在方法结束后参数变量x和y被丢弃了。原来的变量a和b仍然引用这个方法调用之前所引用的对象。


总结:

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

.一个方法可以改变一个对象参数的状态。(即对象成员属性的值,一般为set(....)方法 )

.一个方法不能让对象参数引用一个新的对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息