在Java中,所有的方法参数,都是"按值传递".
有那么一种说法,Java中基本类型是按值传递,对象是按引用传递.这个说法其实是不确切的,确切的说法是
Java中基本类型将值作为参数,按值传递.对象将引用作为参数,按值传递.
所谓按值传递,就是传递的是一个副本.
现在来解释下Java方法传递引用时的情况.
比如说有一个引用 Body body = new Body(.....);
将body当作参数传递的时候,传递的不是body指向的对象,也不是body引用本身,而是body的一个副本,并且这个副本和body是一模一样. 这里的一模一样就是body和副本指向同一个对象.
那么当body的副本进入方法后,对这个副本的修改同样会影响body.
但是如果进入方法后将body的副本指向其它对象的时候,那么和body是一点关系都没有了.
下面来看看程序就明白了.
public class TestParam { public static void main(String[] args) { Body var1 = new Body(1); Body var2 = var1; doSomething( var2 ); System.out.println( var1.a ); System.out.println(var2.a); System.out.print(var1 == var2); } public static void doSomething(Body body) { body.a = 2; } } class Body { public Body(int a) { this.a = a; } int a; }
输出的结果是:
2
2
true
这个结果不难理解.
public class TestParam { public static void main(String[] args) { Body var1 = new Body(1); Body var2 = var1; doSomething( var2 ); System.out.println( var1.a ); System.out.println(var2.a); System.out.print(var1 == var2); } public static void doSomething(Body body) { body = new Body(2); } } class Body { public Body(int a) { this.a = a; } int a; }
输出的结果是
1
1
true
两个程序就是在参数进入方法体之后的处理有所区别.
针对第二个程序,画一个草图.