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

专业术语——

    按值调用(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(....)方法 )

.一个方法不能让对象参数引用一个新的对象。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏深度学习计算机视觉

java正则表达式详解

正则表达式用于指定字符串的模式,你可以任何需要定位使用匹配某种特定模式的字符串的情况下使用正则表达式 jdk1.4推出java.util.regex包,就为我们...

2644
来自专栏chenjx85的技术专栏

leetcode-747-Largest Number At Least Twice of Others(求vector的最大值和次大值)

2584
来自专栏desperate633

LeetCode 27. Remove Element题目分析代码

给定一个数组和一个值,在原地删除与值相同的数字,返回新数组的长度。 元素的顺序可以改变,并且对新的数组不会有影响。

632
来自专栏xingoo, 一个梦想做发明家的程序员

static_cast const_cast reindivter_cast dynamic_cast

C 风格(C-style)强制转型如下: (T) exdivssion // cast exdivssion to be of type T 函数风格(Func...

21010
来自专栏老马说编程

(20) 为什么要有抽象类? / 计算机程序的思维逻辑

基本概念 上节提到了一个概念,抽象类,抽象类是什么呢?顾名思义,抽象类就是抽象的类,抽象是相对于具体而言的,一般而言,具体类有直接对应的对象,而抽象类没有,它...

2187
来自专栏前端知识分享

第203天:js---Array对象常用方法

852
来自专栏彭湖湾的编程世界

【javascript】您好, 您要的ECMAScript6速记套餐到了 (一)

【前言】本文“严重参考” 自阮一峰老师写的ES6文档,在此我郑重感谢他沉默无声的帮助 总结一下ES6为 javascript中的 对象/数组/函数 这JS三巨头...

1907
来自专栏Create Sun

基础拾遗------泛型详解

前言:   泛型是具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。类型参数使得设计类和方...

3579
来自专栏xingoo, 一个梦想做发明家的程序员

Kruskal算法

同样是求最小生成树,kruskal适合从边的角度出发,因此适合稀疏图。而prim算法从点的角度出发,适合稠密图。 时间复杂度为O(eloge)。因为外层循环了e...

2145
来自专栏靠谱PM

JavaScript基本语法(一)

1.什么是变量 2.为什么要使用变量 3.变量如何使用 4.原理图 5.变量命名规则和规范 6.变量的交换

862

扫码关注云+社区