【0】README

0.1)本文描述+源代码均 转自 core java volume 1, 旨在理清值调用+引用调用;


【1】参数传递给方法的专业术语:

1.1)值调用:它表示方法接收的是调用者提供的值;
1.2)引用调用:它表示方法接收的是调用者提供的变量地址;

【2】看个荔枝:

2.1)设一个方法视图将一个参数值增大3倍:

public static void tripleValue(double x)
{x = 3 * x;
}

2.2)然后调用这个方法:

double percent = 10;
tripleValue(percent);


2.3)无论如何,调用这个方法后,percent的值还是10,下面看一下具体执行过程:

  • step1) x 被初始化percent值的一个copy;
  • step2) x 被乘以 3 后等于 30, 但是 percent 仍然是 10;
  • step3) 这个方法结束后, 参数变量x 不在使用;

【3】方法参数共有两种类型:

  • type1) 基本数据类型(数字、布尔值);
  • type2) 对象引用;

3.1)可以看到, 一个方法不可能修改一个基本数据类型的参数;
3.2)对象引用作为参数就不同了,可以很容易地利用下面的方法实现将一个雇员的薪水提高两倍:

package com.corejava;public class EmployeeTest
{public static void main(String[] args) {Employee e = new Employee(10); Employee.tripleSalary(e);System.out.println("salary = " + e.getSalary());}
}class Employee
{private double salary;public Employee(double salary){this.salary = salary;}public static void tripleSalary(Employee e){e.raiseSalary(200);}public void raiseSalary(double x){this.salary = this.salary * x / 100;}public double getSalary() {return salary;}
}
打印结果为: salary=20.0

3.3)上述程序的具体调用过程为:

  • step1) x 被初始化为 harry值的拷贝, 这里是一个对象的引用;
  • step2) raiseSalary方法应用于这个对象引用, x 和 harry 同时引用的那个 Employee对象的薪水提高了200%;
  • step3) 方法结束后,参数变量x 不再使用, 当然,对象变量harry继续使用那个薪水涨了 200%的对象;

    3.4) 读者已经看到,实现一个改变对象参数状态的方法并不是难事, 方法得到的是对象引用的copy, 对象引用和其它的copy同时引用同一个对象;

【4】再看个荔枝:

package com.corejava;public class EmployeeTestOne
{public static void main(String[] args) {EmployeeOne a = new EmployeeOne("Alice");EmployeeOne b = new EmployeeOne("Bob");System.out.println("before:" + a.getName() + b.getName());EmployeeOne.swap(a,b);System.out.println("after:" + a.getName() + b.getName());}
}
class EmployeeOne
{private String name;public EmployeeOne(String name){this.name = name;}public static void swap(EmployeeOne x, EmployeeOne y){EmployeeOne temp = x;x = y;y = temp;}public String getName() {return name;}
}
打印结果为:
before:AliceBob
after:AliceBob

4.1)显然, 方法并没有改变存储在变量 a 和 b 中的 对象引用;swap 方法的参数x 和 y 被初始化为两个对象引用的copy, 这个方法交换的是 两个拷贝;在方法结束时参数变量x 和 y 被丢弃了, 原来的变量 a 和 b仍然引用这个方法调用之前所引用的对象;
4.2)这个过程说明: java程序设计语言对对象采用的不是引用调用, 实际上,对象引用进行的是 值传递;

【5】下面总结下 java 中方法参数的使用情况:

  • 5.1)一个方法不能修改一个基本数据类型的参数(数值型和布尔型);
  • 5.2)一个方法可以改变一个对象参数的状态;
  • 5.3)一个方法不能让对象参数引用一个新的对象;

【6】最后一个综合性荔枝:

/*** This program demonstrates parameter passing in Java.* @version 1.00 2000-01-27* @author Cay Horstmann*/
public class ParamTest
{public static void main(String[] args){/** Test 1: Methods can't modify numeric parameters*/System.out.println("Testing tripleValue:");double percent = 10;System.out.println("Before: percent=" + percent);tripleValue(percent);System.out.println("After: percent=" + percent);/** Test 2: Methods can change the state of object parameters*/System.out.println("\nTesting tripleSalary:");Employee harry = new Employee("Harry", 50000);System.out.println("Before: salary=" + harry.getSalary());tripleSalary(harry);System.out.println("After: salary=" + harry.getSalary());/** Test 3: Methods can't attach new objects to object parameters*/System.out.println("\nTesting swap:");Employee a = new Employee("Alice", 70000);Employee b = new Employee("Bob", 60000);System.out.println("Before: a=" + a.getName());System.out.println("Before: b=" + b.getName());swap(a, b);System.out.println("After: a=" + a.getName());System.out.println("After: b=" + b.getName());}public static void tripleValue(double x) // doesn't work{x = 3 * x;System.out.println("End of method: x=" + x);}public static void tripleSalary(Employee x) // works{x.raiseSalary(200);System.out.println("End of method: salary=" + x.getSalary());}public static void swap(Employee x, Employee y){Employee temp = x;x = y;y = temp;System.out.println("End of method: x=" + x.getName());System.out.println("End of method: y=" + y.getName());}
}class Employee // simplified Employee class
{private String name;private double salary;public Employee(String n, double s){name = n;salary = s;}public String getName(){return name;}public double getSalary(){return salary;}public void raiseSalary(double byPercent){double raise = salary * byPercent / 100;salary += raise;}
}

方法参数的值调用+引用调用+深浅拷贝相关推荐

  1. Python中的赋值、引用和深浅拷贝

    2019独角兽企业重金招聘Python工程师标准>>> 全局变量 在函数之外创建的变量属于main,又被称为全局变量.它们可以在main中的任意函数中访问,与局部变量在函数结束时消失 ...

  2. python赋值标志_Python中的赋值、引用和深浅拷贝

    全局变量 在函数之外创建的变量属于__main__,又被称为全局变量.它们可以在__main__中的任意函数中访问,与局部变量在函数结束时消失不同,全局变量可以在不同函数的调用之间持久存在. 全局变量 ...

  3. 列表、字典补充点、strJoin方法、set()集合、和深浅拷贝

    一 .对之前知识点的补充 str中的join方法,把列表换成字符串 1 s = "_".join("ABC") #可迭代对象 2 print(s) 3 > ...

  4. C/C++语言参数传递----函数/方法 参数的指针引用传递

    int m_value = 1; void func(int *p) {p = &m_value; }int main(int argc, char *argv[]) {int n = 2;i ...

  5. c# 方法参数 传值or传引用?(ref,out,可变参数params,可选参数,命名参数)

    目录 一.方法参数的类型----值类型和引用类型 二.一些特殊的方法参数 1.引用参数---ref 2.输出参数---out 注意:ref和out的区别 3.可变参数/参数数组-----params ...

  6. c# 方法参数(传值,传引用,ref,out,params,可选参数,命名参数)

    一.方法参数的类型----值类型和引用类型 当方法传递的参数是值类型时,变量的栈数据会完整地复制到目标参数中即实参和形参中的数据相同但存放在内存的不同位置.所以,在目标方法中对形参所做的更改不会对调用 ...

  7. boolean类型_JS核心理论之《数据类型、类型转换、深浅拷贝与参数传递》

    数据类型 基本类型:共7种,也被称为值类型,是一种既非对象也无方法的数据.包括:string.number.bigint.boolean.null.undefined.symbol. 除了 null ...

  8. JavaScript专题(五)深浅拷贝

    JavaScript专题之深浅拷贝 了解拷贝背后的过程,避免不必要的错误,Js专题系列之深浅拷贝,我们一起加油- 目录 一.拷贝示例 二.浅拷贝 三.深拷贝的方法? 四.自己实现深浅拷贝 一.拷贝示例 ...

  9. 指针--用指针变量作函数参数的实例(按值调用与模拟按引用调用)、函数指针及其应用

    一.用指针变量作函数参数的实例 思考题: 例题:从键盘输入某班学生某门课成绩(每班人数最多不超过40人,具体人数由键盘输入),是分析下列程序是否能实现计算并输出最高分以及相应学号. #include ...

最新文章

  1. Matlab实现 sift 特征匹配(代码源自网络)
  2. Pandas数据规整
  3. matlab把cell矩阵转换成能处理的数据
  4. python连通域标记_图像分析:二值图像连通域标记
  5. IntelliJ IDEA 2019 快捷键终极大全,速度收藏!
  6. Java Web——图像上传
  7. Ubuntu16.04 +cuda8.0+cudnn+opencv+caffe+theano+tensorflow配置明细
  8. 问题 | Android Studio:Missing contentDescription attribute on image(ImageView)
  9. Spring AOP(四)之After增强处理
  10. windows 核心编程下的内存映射文件
  11. WinForm开发(28)——TextBox(2)——Winform给TextBox设置默认值(获取焦点后默认值消失)
  12. H 幻方变换(puzzle)(NYIST 2019年校赛)
  13. cadence orcad capture tcl/tk脚本开发
  14. SparkSQL和HiveSql的对比
  15. 『天涯杂谈』十大古今名人语录经典(2007版)
  16. English--consonant_爆破音
  17. Unity3D 使用图片自定义字体,防止打包安卓后字体变形
  18. mongodb副本集集群中节点出现recovering状态解决办法
  19. STM32-esp8266-MQTT服务器通信
  20. 网络设备配置与管理-综合实验2

热门文章

  1. LOJ:黑暗城堡(最短路)
  2. 2021.9.23模拟
  3. AT1983-[AGC001E]BBQ Hard【dp,组合数学】
  4. CF932F-Escape Through Leaf【树上启发式合并,CDQ分治,斜率优化dp】
  5. jzoj1264,P2866-乱头发节,糟糕的一天Bad Hair Day【单调栈】
  6. ICPC 2019-2020 North-Western Russia Regional Contest 补题部分
  7. 【动态规划】书的复制 (ssl 1203)
  8. 8、mysql数据表中数据的增删改
  9. Nacos(六)之Spring Boot集成
  10. Java 面试就业指导,100 % 提高面试成功率