使用Java工做很长时间了,最近阅读《Java核心技术-卷I(第8版)》时,却总能发现一些本身对Java错误的理解之处,今天要说的是关于Java方法参数使用部分(4.5节)。 小节开篇讲到java
Java程序设计语言老是采用值调用。也就是说,方法获得的是全部参数值的一个拷贝,特别是,方法不能修改传递给它的任何参数变量的内容。测试
下面给出一个例子来讲明this
int number = 10 ; System.out.println(number); // 10 triple(number); // 执行三倍操做 System.out.println(number); // 10
暂时不用管triple
方法实现是怎样,能够看出方法执行先后,number
的值是没有改变的,下面是triple
方法的实现设计
private static final void triple(int x) { x = 3 * x ; }
下面用图说明整个过程(网上找到的图都很模糊,这里我本身从新画了一个)
具体执行过程:code
这里能够看出,方法不能够改变基本类型参数,而做为引用参数则不一样对象
public class Employee { private String name ; private double salary ; public Employee(String name ,double salary) { this.name = name ; this.salary = salary ; } public void setSalary(double salary) { this.salary = salary; } public double getSalary() { return salary; } }
经过如下测试能够看出引用对象的值发生了变化生命周期
Employee jane = new Employee("jane" ,1000) ; System.out.println(jane.getSalary()); // 1000.0 triple(jane) ; // 工资变动为3倍 System.out.println(jane.getSalary()); // 3000.0
下面是triple
方法的实现ip
public static final void triple(Employee e) { e.setSalary(e.getSalary() * 3); }
一样用图说明
get
上述是改变对象状态(属性)的方法,但引用自己却没法改变(容易搞错的地方)同步
Employee jane = new Employee("jane" ,1000) ; Employee john = new Employee("john" ,1200) ; // com.zlikun.jee.Employee@578088c0 System.out.println(jane); // com.zlikun.jee.Employee@37922221 System.out.println(john); swap(jane, john); // com.zlikun.jee.Employee@578088c0 System.out.println(jane); // com.zlikun.jee.Employee@37922221 System.out.println(john);
下面给出swap
方法的实现
static void swap(Employee e1 ,Employee e2) { Employee t = e1 ; e1 = e2 ; e2 = t ; }
经过输出结果能够发现,交换先后,jane、john引用的实例并未发生变化。
以上测试,《Java核心技术-卷I(第8版)》给出的结论是: