Java方法参数使用

使用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

  1. x被初始化为number的一个拷贝。
  2. x被乘以3后等于30,但此时number自己还是10。
  3. 这个方法结束后,x的生命周期结束,值被丢弃。

这里能够看出,方法不能够改变基本类型参数,而做为引用参数则不一样对象

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

  1. e被初始化为jane的值拷贝,这里是一个对象引用,此时e引用了与jane所引用的实例。
  2. triple方法将e引用实例的的salary变动为3倍。
  3. 方法结束后,e被丢弃。但其引用的实例的salary已提升为原来的3倍,而jane仍引用着该实例。

上述是改变对象状态(属性)的方法,但引用自己却没法改变(容易搞错的地方)同步

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版)》给出的结论是:

  1. 一个方法不能修改一个基本数据类型的参数
  2. 一个方法能够改变一个对象参数的状态
  3. 一个方法不能实现让对象引用一个新的对象

本文同步自:http://zlikun.com/java-method-arguments/

相关文章
相关标签/搜索