程序设计语言中,将参数传递给方法(或函数)有两种方法。按值传递(call by value)表示方法接受的是调用者提供的值;按引用调用(call by reference)表示方法接受的是调用者提供的变量地址。Java程序设计语言都是采用按值传递。下面通过例题进行说明:

 1 public class ParamTest {
2 public static void main(String[] args) {
3 /*
4 *Test1: Methods can't modify numeric parameters
5 */
6 System.out.println("Testing tripleValue:");
7 double percent = 10;
8 System.out.println("Before: percent=" + percent);
9 tripleValue(percent);
10 System.out.println("After: percent=" + percent);
11
12 /*
13 *Test2: Methods can change the state of object parameters
14 */
15 System.out.println("\nTesting tripleSalary");
16 Employee harry = new Employee("Harry", 50000);
17 System.out.println("Before: salary=" + harry.getSalary());
18 tripleSalary(harry);
19 System.out.println("After: salary=" + harry.getSalary());
20
21 /*
22 *Test3: Methods can't attach new objects to object parameters
23 */
24 System.out.println("\nTesting swap");
25 Employee a = new Employee("Alice", 30000);
26 Employee b = new Employee("Bob", 60000);
27 System.out.println("Before: a=" + a.getName());
28 System.out.println("Before: b=" + b.getName());
29 swap(a, b);
30 System.out.println("After: a=" + a.getName());
31 System.out.println("After: b=" + b.getName());
32 }
33
34 public static void tripleValue(double x) {
35 x *= 3;
36 System.out.println("End of method: x=" + x);
37 }
38
39 public static void tripleSalary(Employee x) {
40 x.raiseSalary(200);
41 System.out.println("End of method: salary=" + x.getSalary());
42 }
43
44 public static void swap(Employee x, Employee y) {
45 Employee temp = x;
46 x = y;
47 y = temp;
48 System.out.println("End of method: x=" + x.getName());
49 System.out.println("End of method: y=" + y.getName());
50 }
51 }
52
53 class Employee {
54 private String name;
55 private double salary;
56 public Employee(){}
57 public Employee(String name, double salary){
58 this.name = name;
59 this.salary = salary;
60 }
61
62 public String getName() {
63 return name;
64 }
65
66 public double getSalary() {
67 return salary;
68 }
69
70 public void raiseSalary(double byPercent){
71 double raise = salary * byPercent / 100;
72 salary += raise;
73 }
74 }

程序运行结果为:

从以上例题可以总结Java中方法参数的使用情况:

  • 一个方法不能修改一个基本数据类型的参数(即数值型或布尔型)。
  • 一个方法可以改变一个对象(数组)参数的状态。
  • 一个方法不能让对象参数(数组)引用一个新的对象。

以上内容均参考:java核心技术 卷1 第十版 4.5节

———————————————————————————————————————————

下面通过画内存图说明参数传递过程:

基本数据类型的传递:

  • percent将值拷贝给x,percent与x的地址值不同;
  • tripleValue()方法将x的值10乘以3后得到10,percent的值不变;
  • tripleValue()弹栈后,参数变量x不再使用。

对象或数组作为参数传递:

  • Employee harry = new Employee("Harry", 50000); 创建了一个对象变量harry,引用了Employee的一个对象;
  • tripleSalary(harry); 将对象harry的地址值传递给参数x, 此时变量harry和x都引用了堆中的同一个Employee对象;并通过方法将这一对象的薪金提高了200%;
  • tripleSalary(harry)方法弹栈后,参数变量x不再使用。对象变量harry继续引用那个薪金增至3倍的对象。

Java方法参数的传递方式的更多相关文章

  1. java方法参数传递方式只有----值传递!

    在通常的说法中,方法参数的传递分为两种,值传递和引用传递,值传递是指将实际参数复制一份传递到方法中, 在方法中的改动将不会影响到实际参数本身,而引用传递则是指传递的是实际参数本身,在方法中的改动将会影 ...

  2. java 方法参数-值调用,引用调用问题

    (博客内容来自于core java卷一) 1. xx调用:程序设计语言中方法参数的传递方式: 引用调用(call by reference):表示方法接收的是调用者提供的变量地址. 值调用(call ...

  3. 【转】java方法参数传递方式--按值传递、引用传递

    java的方法参数传递方式有两种,按值传递和引用传递 1.按值传递 参数类型是int,long等基本数据类型(八大基本数据类型),参数传递的过程采用值拷贝的方式 代码片段1: public class ...

  4. java方法参数

    Java程序设计语言总是采用值调用.也就是说,方法得到的是所有参数的一个拷贝,特别是方法不能修改传递给它的任何参数变量的内容. 基本类型参数 1)X被初始化为percent值的一个拷贝: 2)X被乘以 ...

  5. 辨析Java方法参数中的值传递和引用传递

    小方法大门道 小瓜瓜作为一个Java初学者,今天跟我说她想通过一个Java方法,将外部变量通过参数传递到方法中去,进行逻辑处理,方法执行完毕之后,再对修改过的变量进行判断处理,代码如下所示. publ ...

  6. java 方法参数的执行顺序

    java方法的参数的执行顺序是从左到右还是从右到左呢? 写出一下测试程序: 1 import java.util.*; 2 import java.io.*; 3 public class Test ...

  7. Java方法参数:

    一个方法不能修改一个基本数据类型的参数 一个方法可以改变一个对象参数的状态 一个方法不能实现让对象参数引用一个新的对象 案例1: 一个方法不能修改一个基本数据类型的参数 String a = &quo ...

  8. 新手容易混乱的String+和StringBuffer,以及Java的方法参数传递方式。

    之前在交流群里和猿友们讨论string+和stringbuffer哪个速度快以及Java的方法参数传递的问题,引起了群里猿友的小讨论.最终LZ得出的结果是string+没有stringbuffer快, ...

  9. Java方法的参数传递方式为: 值传递

    Java方法的参数传递方式为: 值传递 对于基本数据类型作为参数传递时, 是"按值传递", 这点都认识很清楚. 但是, 当对象或者说引用作为参数传递, Java 的参数传递方式是& ...

随机推荐

  1. 一:SqlServer中的 CEILING函数和 FLOOR函数以及ROUND()

    例如 1.ROUND() 格式为ROUND(y1,y2,y3) y1:要被四舍五入的数字y2:保留的小数位数 y3:为0,可以不写,y1进行四舍五入,不为0则y1不进入四舍五入,如果y1有值就直接根据 ...

  2. 'Attempt to create two animations for cell' iOS

    我是在对一个UITableView 一起进行 reloadRows和reloadSections 的操作的时候 出现的

  3. js坚持不懈之13:JavaScript查找HTML元素的方法

    1. 通过 id 查找 HTML 元素 <!DOCTYPE html> <html> <body> <p id = "intro"> ...

  4. 记录Nginx实现内容重定向的两种方式:rewrite和反向代理

    第一种:rewrite server { listen                80; server_name   www.test.org; root                  /te ...

  5. Linux基础学习:文件与目录管理

    目录与路径 目录的相关操作 几个特殊的目录: . :表示当前目录 .. :表示上一层目录 - :表示前一个工作目录 ~ :表示当前用户所在的主文件夹 ~account :表示account用户所在的主 ...

  6. UI自动化测试之Jenkins配置

    前一段时间帮助团队搭建了UI自动化环境,这里将Jenkins环境的一些配置分享给大家. 背景: 团队下半年的目标之一是实现自动化测试,这里要吐槽一下,之前开发的测试平台了,最初的目的是用来做接口自动化 ...

  7. 编译装php7.2 && nginx-1.14

    环境准备 # cat /etc/centos-release CentOS Linux release 7.6.1810 (Core) # uname -r 3.10.0-957.el7.x86_64 ...

  8. IO模型介绍

    先理解几个问题: (1)为什么读取文件的时候,需要用户进程通过系统调用内核完成(系统不能自己调用内核)什么是用户态和内核态?为什么要区分内核态和用户态呢? 在 CPU 的所有指令中,有些指令是非常危险 ...

  9. scala的多种集合的使用(3)之遍历集合的方法

    遍历集合的方法 1.用foreach循环遍历一个集合 foreach接收一个函数作为参数.定义的函数应该接收一个元素作为输入参数,然后不要返回任何的东西.输入的参数的类型应该匹配集合中的类型.随着fo ...

  10. NodeJs连接操作MongoDB数据库

    NodeJs连接操作MongoDB数据库 一,介绍 MongoDB是一种文档导向数据库管理系统,由C++撰写而成.介绍如何使用 Node.js 来连接 MongoDB,并对数据库进行操作. Mongo ...