按参考对象与按值参照

我在这里阅读此评论:在Java中通过引用传递字符串?

是的,这是一种误解。 这是一个巨大的,广泛的误解。 它导致我讨厌的一个采访问题:(“Java如何传递参数”)。 我讨厌这个问题,因为大约一半的采访者似乎都想要错误的答案(“基于价值的原语,参考对象”)。 正确的答案需要更长的时间才能完成,而且似乎也混淆了其中一些问题。 他们不会相信:我发誓我没有通过技术筛选,因为CSMajor-type筛选器在大学里听到了这种误解,并将其视为福音。 FEH。 - - CPerkins 09年8月13日在14:34

有人可以解释一下,一个新的程序员可以掌握,说什么区别:

“在Java中,原语通过值传递,对象通过引用传递。”

和:

“在Java中,没有任何东西是通过引用传递的,引用是通过值传递的。”?

这些陈述在某种意义上是否属实? 我不想邀请喧哗的游行,但这听起来像是一个非常重要的概念,而我仍然不完全明白。


我相信这个误解是因为一个变量不能包含一个开头的对象 。 如果你掌握了这一点,那么显然变量只能包含对象(或原始值)的引用。 从那里到实现参考按值传递的步骤(就像原始值一样)非常小。

你可以做一个非常简单的测试来确定一种语言是否支持通过引用。 问问自己,你是否可以用这种语言编写交换功能,也就是说,可以这样工作

x == A, y == B

swap(x, y);

x == B, y == A

作为一名Java程序员,您很快意识到您无法在Java中实现此功能,因此您(正确地)得出了Java没有引用的结论。

回到你的句子:

  • 在Java中,基元是通过值传递的,而对象是通过引用传递的。
  • 这是错误的 。 我认为你只能传递变量中包含的东西,正如我上面所说的,一个变量不能包含一个对象,因此你不能在Java中传递一个对象。

  • 在Java中,没有任何东西是通过引用传递的,引用是按值传递的。
  • 这是真的


    这样的事情在绘制时总是比较容易。 考虑以下两个变量,一个是原始类型,另一个是引用类型:

        int i    = 5;
        String s = "test";
    

    在内存的某处有一个i看起来像这样的条目:

      i
    -----
    | 5 |
    -----
    

    类似s在内存中也有一个s的入口,但是它引用堆中的一个位置,因为s是引用类型变量,对象存储在堆中:

                                ----------- 
     s                 |------->|  "test" |
    -----              |        |---------|
    | --|--------------|        |         |
    -----                       |         |
                                |         |
                                |---------|
    

    所以s的值是对那个坐在堆上的String对象的引用,所以如果将s传递给一个方法:

    printString(s);
    
    public void printString(String arg)
    {
       System.out.println(arg);
    }
    

    实际被复制到arg参数中的值是对堆中s引用:

                                ----------- 
     s                 |------->|  "test" |<-----|
    -----              |        |---------|      |
    | --|--------------|        |         |      |
    -----                       |         |      |
                                |         |      |
                                |---------|      |
     arg                                         |
    -----                                        |
    | --|----------------------------------------- 
    -----
    

    希望这可以帮助。


    好问题。 考虑下面的例子

    void foo(Object obj) {
      obj = new Foo(); 
    }
    
    Object o = new Bar();
    foo(o);
    // is o Foo or Bar?
    
  • 如果pass by-reference那么在调用foo之后o引用可能已经改变
  • 如果在调用foo之后pass by-reference-by-value引用o不变
  • 链接地址: http://www.djcxy.com/p/20883.html

    上一篇: Object by Reference vs. Reference by Value

    下一篇: How to make fuction which add String into String?