有关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 条评论
登录 后参与评论

相关文章

来自专栏前端知识分享

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

942
来自专栏移动端开发

Swift 内存管理详解

Swift内存管理: Swift 和 OC 用的都是ARC的内存管理机制,它们通过 ARC 可以很好的管理对象的回收,大部分的时候,程序猿无需关心 Swift...

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

static_cast const_cast reindivter_cast dynamic_cast

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

22110
来自专栏Create Sun

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

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

3689
来自专栏Java帮帮-微信公众号-技术文章全总结

Java基础-Java基础-02总结关键字,标识符,注释,常量进制,变量数据类型

首先原谅小编的过错,昨天第二篇文章标题是: 程序员:为什么选择Java? ? 1:关键字(掌握) (1)被Java语言赋予特定含义的单词 (2)特点: 全...

2535
来自专栏CSDN技术头条

常见的七种排序算法解析

01 选择排序 实现原理 首先从未排序序列中找到最小的元素,放置到排序序列的起始位置,然后从剩余的未排序序列中继续寻找最小元素,放置到已排序序列的末尾。所以称之...

2078
来自专栏小白鼠

Java8特性接口的改变LambaStream时间API

函数式接口,该接口中只能由一个抽象方法,可以使用@FunctionalInterface注解修饰某个接口有且仅有一个抽象方法。

1132
来自专栏coding for love

JS原生引用类型解析2-Array类型

(注1:如果有问题欢迎留言探讨,一起学习!转载请注明出处,喜欢可以点个赞哦!) (注2:更多内容请查看我的目录。)

1302
来自专栏DHUtoBUAA

查找数组中重复的数字

        题目来源于《剑指Offer》中的面试题3:找出数组中重复的数字。   // 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中...

4446
来自专栏老马说编程

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

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

2427

扫码关注云+社区

领取腾讯云代金券