Java方法参数的传递方式

程序设计语言中,将参数传递给方法(或函数)有两种方法。按值传递(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倍的对象。

原文地址:https://www.cnblogs.com/yang91/p/9633923.html

时间: 2024-11-08 16:09:21

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

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

在通常的说法中,方法参数的传递分为两种,值传递和引用传递,值传递是指将实际参数复制一份传递到方法中, 在方法中的改动将不会影响到实际参数本身,而引用传递则是指传递的是实际参数本身,在方法中的改动将会影响到实 际参数本身.但是,在java中只有值传递,没有引用传递!那么,为什么当方法参数是基本数据类型时表现是值传递, 而当是引用类型时表现的是引用传递形式呢? Java内存区域中含有java堆和虚拟机栈两个内存区域(并不是只是将java内存区分为这两个内存区域,此外还有程 序计数器,本地方法栈以及方

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

(博客内容来自于core java卷一) 1. xx调用:程序设计语言中方法参数的传递方式: 引用调用(call by reference):表示方法接收的是调用者提供的变量地址. 值调用(call by value):表示方法接收的是调用者提供的值. 命名调用(call by name):已经成为历史. 2. Java使用值调用,而且只有值调用.也就是说方法得到的是参数值的一个拷贝,并不是参数值本身,所以,方法不能修改传递给它的的任何参数变量本身. 看下面代码: public class te

java方法参数传递面试题

传值还是传引用是Java中很基础的一个问题,也是笔试的时候经常被考察的一个问题,总结一下. 题目1: 写出以下程序的输出内容. public class Test { public static void changeValue(int value){ value = 0; } public static void main(String[] args) { int value = 2010; changeValue(value); System.out.println(value); } }

java方法参数

java程序设计语言总是采用按值调用.也就是说,方法得到的是所有参数值的一个拷贝,特别:方法不能修改传递给它的任何参数变量的内容. 方法参数共有两种类型: 1.基本类型(数字,布尔值). 2.对象引用. java中方法参数的使用情况: 1.一个方法不能修改一个基本数据类型的参数(数值 布尔型). 2.一个方法可以改变一个对象参数的状态. 3.一个方法不能让对象参数引用一个新的对象. 一个方法不可能修改一个基本数据类型的参数,而对象引用作为参数就不同了

【解惑】Java方法参数是引用调用还是值调用?

最近找实习,在笔试时候做了下面这道题:求下面代码的输出结果. public class MyClass { static void aMethod(StringBuffer sf1,StringBuffer sf2){ sf1.append(sf2); sf2=sf1; } public static void main(String[] args){ StringBuffer sf1=new StringBuffer("A"); StringBuffer sf2=new String

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

小方法大门道 小瓜瓜作为一个Java初学者,今天跟我说她想通过一个Java方法,将外部变量通过参数传递到方法中去,进行逻辑处理,方法执行完毕之后,再对修改过的变量进行判断处理,代码如下所示. public class MethodParamsPassValue { public static void doErrorHandle() { boolean a = false; int b = 5; passBaseValue(a, b); if (a == true || b == 10) { S

Java的方法参数-想想挺有趣的问题

一直认为Java的方法参数都是传递值,调用后对本身不影响. Java不存在C/C++中的指针,在快速排序中,传入的数组,却发生了值的改变.由此引发的思考: //为方便举例,以下为部分快速排序伪代码 传入的数组,在递归中,数组值被操作. void quickSort(int s[], int l, int r){ if (l < r){ quickSort(s, l, i - 1); quickSort(s, i + 1, r); } } 结论:Java方法参数中传递的是值,在参数是引用类型(如数

Java中的方法参数传递方式

最近在系统学习Core Java,Java中的数据类型分为两种,第一种是基本数据类型(数字型和布尔型),第二种是类类型(即对象),起初,我以为第一种类型的参数是按值传递,第二种是按引用传递,但在学习Core Java的过程中,我发现这是错误的,先抛出最终结论:在Java中,所有的方法参数都是按值传递的!!!下面来进行解释. 第一种类型的参数是按值调用很好理解,主要是要说明第二种类型的参数也是按值调用的,看下面的一段程序: 1 public static void swap(A x, A y) 2

JAVA入门学习: 方法参数的传递(函数传参问题)

引言:我们知道C++中拥有两种参数传递方式, 值调用和引用调用. 有些程序员认为JAVA程序设计语言对对象采用的是引用调用,实际上,这种理解是不对的. 由于这种误解存在普遍性,所以下面将阐述一下这个问题. 所以用一段简单的代码来阐述一下这个问题: 1 //如果方法参数是的输入时引用,那么我们将交换两个指针(即引用) 2 public static void swap(Employee x, Employee y) 3 { 4 Employee temp = x; 5 x =y; 6 y = te