代码之家  ›  专栏  ›  技术社区  ›  Cratylus

java vs C++的引用

  •  6
  • Cratylus  · 技术社区  · 15 年前


    我有以下困惑:

    这在java中是不可能发生的,我也不知道为什么。

    E、 这是一个来自对象X的方法

    public boolean aMethod(int id, myClass aClass)
    {
       //do some logic
       aClass = new MyClass();
       //configure argument object aClass
       return true;
    }
    

    :

    //some code processing
    myClass obj = null;
    if(X.aMethod(2,obj))
    {
      obj.methodA();//start using the object
    }
    

    我在C++中使用它,即返回一个结果,通知函数参数可以使用,但是在java中这不起作用。

    我没有在method(intid,myClass aClass)方法内部使用new从堆中分配内存地址吗?我不是在函数中传递obj的“地址”吗?

    6 回复  |  直到 15 年前
        1
  •  27
  •   Amber    15 年前

    Java通过值传递一切- 包括参考文献 .

    这意味着,如果传递一个对象,则可以修改 属性 它们会在你回来后继续存在,但你不能 代替 参考 -只有参考点。

    在你的 aClass = 线路:

    Outside the function:
    
        obj ---> <foo>
    
    Inside the function:
    
        aClass ---> <foo>
    

    A级=

    Inside the function:
    
        aClass ---> <bar>
    
    Outside the function:
    
        obj ---> <foo>
    

    这里要注意的关键是 aClass 不是指 obj <foo> . 你没有传递地址 ,你路过 什么地址 A级 指的是,那没什么大不了的 目标 .


    作为另一种思考方式:

    在爪哇,

    Bar foo = new Bar();
    

    Bar *foo = new Bar();
    

    所以当你经过的时候 foo -您正在传递已分配对象的地址。Java没有 &

        3
  •  3
  •   djna    15 年前

    在C++中如果你这样做会发生什么:

     void myFunct( int * pInt) {
         pInt = // something;
     }
    
     // caller
     int x;
     int * myPointer = & x;
     myFunc(myPointer);
     // where does myPointer point now? 
    

    myFunc中的赋值对调用方的指针没有影响。如果myFunct把指针指向指针

     void myFunct( int ** ppInt) {
         *ppInt = // something;
     }
    

    或者是对指针的引用,那么你会看到调用者的变化,我想这就是你一直在做的。

    在Java中

     void myFunct (Integere anInteger) {
           // anInteger is  reference to whatever is passed
           anInteger = new Integer(99); // no effect on caller
     }
    

    我们确实传递了对函数的引用,上面的一个整数是对调用方拥有的对象的引用,但是整合器是一个方法的局部值,分配给它与在第一个例子中分配给一品脱相同,对调用者没有影响。

        4
  •  2
  •   RichN    15 年前

    示例中的注释表明该方法 aMethod 存在以配置对象。因此,与其传入null,不如先实例化对象,然后再传入。或者,可以使方法返回对象intead,如下所示:

    public boolean aMethod(int id)
    {
      myClass aClass = new MyClass();
      return myclass;
    }
    

    myClass obj = X.aMethod(2);
    if(obj != null)
    {
      obj.methodA();//start using the object
    }
    

    或者,我更喜欢把它作为一个惯例 阿密德

        5
  •  1
  •   Yin Zhu    15 年前

    Java不能做“按引用传递”。

    Java使用” 传递值 ".

        6
  •  0
  •   justin    15 年前

    void method(TObject* arg);
    
    推荐文章