在方法调用之后,percent的值还是10 public static void tripleValue(double x) {//doesn't work x = 3 * x; } 具体执行过程: 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倍的雇员对象
可以绘制图形如下:
误区:java程序设计语言对对象采用的不是引用调用,是值调用。 public static void swap(Employee x, Employee y) { //doesn't work Employee temp = x; x = y; y = temp; }
若java程序设计语言对对象采用的是引用调用,那么这个方法就应该能够实现交换数据的效果; Employee a = new Employee("Alice",...); Employee b = new Employee("Bob",...); swap(a,b); 但是,方法并没有改变存储在变量a和b中的对象引用。swap方法的参数x和y被初始化为两个 对象引用的拷贝,这个方法交换的是这两个拷贝。 // x refers to Alice, y to Bob Employ temp = x; x = y; y = temp; //now x refers to Bob, y to Alice 最终白费力气,在方法结束时参数变量x和y被丢弃了。原来的变量a和b仍然引用这个方法调用 之前所引用的对象。