Java参数传递机制分析和介绍:值与引用

开心编程网   2010年02月04日 13:20   评论»  

其实这个问题我原来翻译(破除java神话之二:参数是传址的 )、转帖别人的详细解释(Java 应用程序中的按值传递语义 )和专门解释( 我对《Java 应用程序中的按值传递语义》的理解 )过,不过现在看来,原来翻译或者解释的角度是有问题的,从底层的角度解释并不直观,在交流的时候也容易引起误解,最终不能达成一致意见。下面以最终的效果来解释参数的传递方式:

1、对于原始数据类型,也就是int、 long、char之类的类型,是传值的,如果你在方法中修改了值,方法调用结束后,那个变量的值没用改变。
2、对于对象类型,也就是Object的子类,如果你在方法中修改了它的成员的值,那个修改是生效的,方法调用结束后,它的成员是新的值,但是如果你把它指向一个其它的对象,方法调用结束后,原来对它的引用并没用指向新的对象。

代码如下:
public class Tester {
    public static void main(String[] args) {
        int primitive = 2;
        changePrimitive(primitive);
        //primitive的值依然是2
        MyClass myClass = new MyClass();
        changeObject(myClass);
        //myClass仍然指向的是执行changeObject之前的那个对象
        //但是myClass.i等于3了
    }

    public static void changePrimitive(int primitive) {
        primitive = 3;
    }

    public static void changeObject(MyClass myClass) {
        myClass.i = 3;
        myClass = new MyClass();
    }
}

class MyClass {
    int i;
}

对于远程调用,无论是什么类型,调用结束后,传入的参数和以前没用任何变化(当然前途是直接调用远程方法,如果中间经过其它的Proxy类或者Facade类,不能保证那些类对对象没用修改)。至于是通过Local接口进行调用的,也应该属于本地调用,和上面说的情况应该是一致的。

Java参数传递机制

Java究竟是应该按照什么来传递参数?值?引用?还是两者皆有?

其实,弄清楚这个问题得从概念入手。什么是按值传递,什么是按照参数传递。

定义一个变量TestObject obj = new TestObject(); 然后把 obj 作为参数传递给一个方法。如果在这个方法中,只能改变obj指向的这个对象的内容,那就是“值传递”,传过去的值就是指向这个对象的指针。如果在这个方法中通过操作,使得返回后的obj指向另外一个对象(通过equal判断返回来的对象是否与原对象在内存中指向同一内存地址),那就是“引用传递”,传过去的是对这个指针变量的“引用”。

Java参数传递机制分析代码

  • public class PersonT {   
  •  
  •     public void change(Person p) {   
  •         p.name = "mary";   
  •         p.age = 20;   
  •     }   
  •  
  •     public void changeInt(int i) {   
  •         i = 8;   
  •     }   
  •     public void change1(Person p){   
  • //新建对象,name为tpm,age为22   
  •        p = new Person("tom",22);   
  •     }   
  •     public static void main(String[] args) {   
  •         PersonT t = new PersonT();   
  •         Person p = new Person("john"18);   
  •         Person p1 = p;   
  •         System.out.println(p);   
  • //通过方法改变对象属性值   
  •         t.change(p1);   
  •         System.out.println(p1);   
  •         System.out.println("传回来的值指向是否一致:" + p.equals(p1));   
  • //通过方法改变整数值   
  •         int i = 10;   
  •         System.out.println("i值为:" + i);   
  •         t.changeInt(i);   
  •         System.out.println("i值为:" + i);   
  • //新建一对象,改变对象值   
  •         t.change1(p);   
  •         System.out.println(p);   
  •     }   
  • }   
  •  

    输出结果为:

    姓名:john年龄:18

    姓名:mary年龄:20

    传回来的值指向是否一致:true

    i值为:10

    i值为:10

    姓名:mary

    年龄:20

    以上就是对Java参数传递机制的一些分析。

    欢迎您发表评论:

    赞助商链接

    最新新闻动态

    友情链接

    关于站点 - 联系我们 - 网站大事 - 友情链接 - 免责声明 - 意见反馈 - 网站投稿 - 站点地图
    版权所有开心编程网禁止转载! Copyright © 2009-2010 All Rights Reserved. Email:hbhgfzk@126.com