2008年10月27日星期一

Java中的参数传递问题

      这几天需要把原来用VC写的一个计算弧垂的代码用Java改写,供系统的BS调用。原来没有用过Java,遇到了一些问题,例如容器的声明中不允许用基本数据类型、deep clone中的ArrayList问题等等。今天又遇到一个问题,解决后不知道自己的理解是否正确,记下来也请大家帮忙指正。

      问题是起初认为虽然基本数据类型int不能把改变后的参数传递出来,但是类类型Integer应该是可以的。其实不是这样的。因为Java中的传递是按值传递(有争议,但是可以搁置,不理它),对于基本数据类型和C++是一样的;对于类类型,传递的是对象的指针(句柄)地址(Java中是有指针的),针对Integer类型来说,如果要改变其值,只能new一个新的对象,即使用=直接赋值,Java也会声明一个新的对象的。在方法中修改对象的地址的值,这个值作为参数是不会被改变的。而郁闷的是Integer对象又没有一个可以改变其成员的地方,所以只好作为返回值来传递。如果有多个Integer类型的对象需要传递呢?请使用数组吧。这一点上感觉Java不方便,虽然Java没有头文件让人很爽。

      下面是我做测试的代码,上面的图片(用图片是因为我不会在blogger中排版Java格式,谁教我?)中的代码应该更美观,可以点击放大。

public class ParaChange
{
    public ParaChange()
    {
        i = 0;
    }
   
    public void Change(int iPara)
    {
        iPara = 9;
    }
   
    public void Change(Integer iObjPara)
    {
        iObjPara = new Integer(9);
    }
   
    public void Change(ParaChange pc)
    {
        ParaChange newpc = new ParaChange();
        newpc.i = 9;
       
        pc = newpc;
    }
   
    public void Change0(ParaChange pc)
    {
        pc.i = 9;
    }
   
    private int i;


    public static void main(String[] args)
    {
        ParaChange pc = new ParaChange();
       
        int index = 0;
        pc.Change(index); // 显而易见,不会改变参数的值;和C++一样
        System.out.println(index); // 0
       
        Integer Iindex = new Integer(0);
        pc.Change(Iindex); // 传入的是对象iObjPara的地址。地址的值不会被改变,
                                       //
所以对象的值也不会被改变
        System.out.println(Iindex.
toString()); // 0
       
        ParaChange pcOther = new ParaChange();
        pc.Change(pcOther); // 和Integer对象类似,不会改变
        System.out.println(pcOther.i); // 0
       
        pc.Change0(pcOther); // 改变对象成员的值,OK!可以被改变
        System.out.println(pcOther.i); // 9
    }
}




没有评论: