当然要看你怎么定义by value 和 by reference。Java的官方文档【3】 中如此描述:“When the method or constructor is invoked, the values of the actual argument expressions initialize newly created parameter variables.”但是作为面向对象的语言,一个对象的值又是什么呢?所以这里value并不等同于面向过程中的定义。在C语言里,或者是一个值,或者就是一个地址(引用)。但是Java里面,对象的值,就是对象的地址的值(具体见后面的例子)。
基本总结:
基本类型作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的。
对象作为参数传递时,是把对象在内存中的地址拷贝了一份传给了参数。
String类是个特殊的类,对它的一些操作符是重载的,所以String对象和基本类型一样,一般情况下作为参数传递。
例子:
public class parameterPass {
public static void Test1(){
int i = 10;
System.out.println("Before change, i = " + i);
changeInt(i);
System.out.println("After change, i = " + i);
}
public static void changeInt(int i){
i = 20;
}
public static void Test2() {
Person p1 = new Person();
p1.setAge(10);
System.out.println("Before change, p1 age = " + p1.getAge());
changeAge(p1);
System.out.println("After change, p1 age = " + p1.getAge());
}
public static void changeAge(Person person) {
person.setAge(20);
}
public static void Test3(){
String str = "Hello";
System.out.println("Before change, str = " + str);
changeString(str);
System.out.println("After change, str = " + str);
}
public static void changeString(String str){
str = str + " World!";
}
public static void Test4(){
Integer i = new Integer(10);
System.out.println("Before change, i = " + i);
changeInteger(i);
System.out.println("After change, i = " + i);
}
public static void changeInteger(Integer i){
i = 20;
}
public static void main(String[] args) {
System.out.println("Test pass primitive data type: int");
Test1();
System.out.println("/nTest pass user defined object: Person");
Test2();
System.out.println("/nTest pass object type: String");
Test3();
System.out.println("/nTest pass object type: Integer");
Test4();
}
}
class Person {
int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
参考:
【1】http://java.ccidnet.com/art/3737/20050527/472879_1.html
【2】http://javadude.com/articles/passbyvalue.htm
【3】http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.4.1