画重点:
Java 中所有的参数传递都是按值传递。
值传递:内存会开辟一个新的空间存储传入参数的拷贝值,方法中得到的就是这个拷贝值,修改方法中这个拷贝值,并不能改变原来的值。
(1)首先来看看基础数据类型
public static void main(String[] args) {
int age = 25;
System.out.println( age );
changeValue( age );
System.out.println( age );
}
private static void changeValue(int age) {
age = age + 5;
System.out.println( age );
}
/* 输出结果是:
age = 25
age = 30
age = 25
*/
根据输出结果可知,基础数据类型只是将age值的一份拷贝传入到方法中,在方法中的任何修改不会影响到方法外原来的age值。
(2)对象引用
下面将用两个例子来说明一下,对象作为参数传递到方法中也是按值传递的,只不过传递的值是对象的引用。
class Person {
private String name;
Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Example 1:
public static void main(String[] args) {
Person person = new Person( "dz" );
System.out.println( "name = " + person.getName() );
changeName( person );
System.out.println( "name = " + person.getName() );
}
private static void changeName(Person person) {
person.setName( "newDz" );
System.out.println( "name = " + person.getName() );
}
/*输出结果是:
name = dz
name = newDz
name = newDz
*/
Example 2:
public static void main(String[] args) {
Person person = new Person( "wdz" );
Person person1 = new Person( "sym" );
System.out.println( "Before swap: person name = " + person.getName() );
System.out.println( "Before swap: person1 name = " + person1.getName() );
swap( person, person1 );
System.out.println( "After swap: person name = " + person.getName() );
System.out.println( "After swap: person1 name = " + person1.getName() );
}
private static void swap(Person x, Person y) {
Person temp = x;
x = y;
y = temp;
System.out.println( "Processing: person name = " + x.getName() );
System.out.println( "Processing: person1 name = " + y.getName() );
}
/*输出结果是:
Before swap: person name = wdz
Before swap: person1 name = sym
Processing: person name = sym
Processing: person1 name = wdz
After swap: person name = wdz
After swap: person1 name = sym
*/
其实从第二个例子中就可以看出,对象作为参数传入方法其实也是按值传入,不然的话,交换之后,person 与 person1 指向的对象也应该跟着交互,但是事实是原值并没有发送改变,下面的图可以让你对此有个更清晰的认识。
(3)特殊的 String 类
public static void main(String[] args) {
String str = "test";
System.out.println( "String Value= " + str );
changeValue( str );
System.out.println( "String Value= " + str );
}
private static void changeValue(String temp) {
temp = "changed";
System.out.println( "String Value= " + temp );
}
/*输出结果是:
String Value= test
String Value= changed
String Value= test
*/
String不是基础类型,但是例子中的结果也不是像一般对象一样,这是因为String 类具有不可变性,一旦创建了 String 对象,那么它的值就不可改变了,任何修改都会产生一个新的 String 对象,changeValue 方法中 temp 已经指向了一个新的对象。