在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
两个程序就是在参数进入方法体之后的处理有所区别.
针对第二个程序,画一个草图.