Java的参数是传值还是传引用,到现在也没有一个确切的定论。但是在 thinking in Java一书中,有一句经典的解释:“When you are passing primitives into a method,you get a distinct copy of the primitive.When you are passing a reference into a method,you get a copy of the reference."意思是说,不管java传的是值还是传引用,传递的都是对应的值or引用的副本。
在Java中,值有两种类型,值类型与引用类型。当传递的是值类型的时候,其实传递的是值的副本,即将自身的值复制传递;当传递的是引用类型的时候,其实传递的是自身指向自己的地址的副本,而非是“自己”这整个对象。
请看下面两个例子:
例1:
public class Test{
public static void test(boolean test){
test = !test;
System.out.println("In the test(boolean) : test = " + test);
}
public static void main(String[] args) {
boolean test = true;
System.out.println("Before test(boolean) : test = " + test);
test(test);
System.out.println("After test(boolean) : test = " + test);
}
}
运行结果:
Before test(boolean) : test = true;
In the test(boolean) : test = false;
After test(boolean) : test = true;
可以看出,test方法中改变了传进来的参数值,但对这个参数本身并没有影响,即对main函数中的test没有影响,说明参数类型为值类型时是按值传递的。
若想改变test的参数本身,可为test方法添加返回值类型为Boolean即可。
例2:
public class Test{
public static void test(StringBuffer str){
str.append(",World");
}
public static void main(String[] args) {
StringBuffer string = new StringBuffer("Hello");
test(string);
System.out.println(string);
}
}
运行结果:
Hello,World
可以看出,在调用test方法是,将string作为参数传了进去,string是一个引用类型对象,所以其实穿进去的是string这个对象的地址。通过地址找到对象然后修改了对象的值,对象自然也就发生了变化。