在各种程序设计语言中方法的参数有两种,分别是:值调用,引用调用。
Java程序设计语言总是采用
值调用,即方法得到了所有参数值的一个拷贝。
细分的话,方法参数一共两种类型:
- 如果参数是基本数据类型,那么传递的是一个基本数据类型的值;
- 如果参数是对象,那么传递的是一个
对象引用的拷贝,注意不是C++中的对象引用。这个引用的拷贝和其他的拷贝一样,同时引用了一个对象。
一个方法不可能修改一个基本数据类型的参数,但是可以修改一个对象的状态。
一定要注意,Java中对对象采用的是引用的拷贝,并不是引用调用,反例如下:
测试程序:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66 1package com.xujin;
2
3public class Test {
4 public static void main(String[] args) {
5 Employee[] staff = new Employee[2];
6 staff[0] = new Employee("Bob", 1000);
7 staff[1] = new Employee("Jim", 2000);
8
9 //doesn't work
10 swap(staff[0], staff[1]);
11 System.out.println(staff[0].getName());//Bob
12 System.out.println(staff[1].getName());//Jim
13
14 staff[0].raiseSalary(0.5);//涨50%的工资
15 System.out.println(staff[0].getSalary());//1500.0
16
17 System.out.println(staff[0].getId());//1
18 System.out.println(staff[1].getId());//2
19 }
20
21 public static void swap(Employee x, Employee y){
22 Employee temp = x;
23 x = y;
24 y = temp;
25 }
26
27}
28
29class Employee{
30 public Employee(String name, double salary){
31 this.name = name;
32 this.salary = salary;
33 id = nextId;
34 nextId++;
35 }
36
37 public String getName(){
38 return name;
39 }
40
41 public double getSalary(){
42 return salary;
43 }
44
45 public int getId(){
46 return id;
47 }
48
49 public void setName(String name){
50 this.name = name;
51 }
52
53 public void setSalary(double salary){
54 this.salary = salary;
55 }
56
57 public void raiseSalary(double percent){
58 this.salary *= (1 + percent);
59 }
60
61 private String name;
62 private double salary;
63 private int id;
64 private static int nextId = 1;
65}
66