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

相关文章

来自专栏码匠的流水账

java9系列(五)Stack-Walking API

java9新增这个类的目的是提供一个标准API用于访问当前线程栈,之前只有Throwable::getStackTrace、Thread::getStackTr...

421
来自专栏Ryan Miao

ehcache报错

jfinal2.0+tomcat7+ehcache2.6.11+Linux Linux version 2.6.18-164.el5 (mockbuild@x8...

3729
来自专栏WOLFRAM

向日葵中的数学之美

1833
来自专栏Pulsar-V

Save Camera Document

#pragma once #include "HCCamera.h" #include <time.h> #include <cstdio> #incl...

2828
来自专栏搞前端的李蚊子

Html5模拟通讯录人员排序(sen.js)

// JavaScript Document  var PY_Json_Str = ""; var PY_Str_1 = ""; var PY_Str_...

5946
来自专栏Golang语言社区

Knapsack problem algorithms for my real-life carry-on knapsack

I'm a nomad and live out of one carry-on bag. This means that the total weight o...

1142
来自专栏一个会写诗的程序员的博客

java.base.jmod

/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/jmods$ jmod list java....

1112
来自专栏Petrichor的专栏

Dataset 列表:机器学习研究

In computer vision, face images have been used extensively to develop face recog...

1521
来自专栏专知

2018年SCI期刊最新影响因子排行,最高244,人工智能TPAMI9.455

2018年6月26日,最新的SCI影响因子正式发布,涵盖1万2千篇期刊。CA-Cancer J Clin 依然拔得头筹,其影响因子今年再创新高,达244.585...

1282
来自专栏增长技术

App Guide相关

##TourGuide https://github.com/worker8/TourGuide

702

扫码关注云+社区