【问题标题】:Do pointers in java actually exist?java中的指针真的存在吗?
【发布时间】:2009-12-14 13:01:51
【问题描述】:

我以为我在 java 方面很有经验,但似乎情况并非如此,我昨天才注意到一些东西,我以前使用过的东西,但从未真正意识到它做了什么。我用谷歌搜索,但没有找到我的问题的答案。

如果我声明一个 int 数组,并使用 Array 的静态排序函数对我的数组进行排序,我只需要输入

Arrays.sort( numbers );

代替

numbers = Array.sort( numbers );

这在 C 和 C++ 中可能看起来很简单,因为您可以在那里使用指针。所以我想知道的是,这是怎么做到的?这是太阳的优势,还是我在这里完全没有意义?

【问题讨论】:

    标签: java pointers reference


    【解决方案1】:

    指针存在于java中——所有非原始变量都是java中的指针,也就是引用。

    它们不支持与 C 中的指针相同的操作集 - 它们对语言的用户本质上是不透明的。

    Arrays.sort(array) 起作用的原因是因为array 是一个“指针”,它允许sort() 函数访问array 变量指向的内存位置。

    现在,为什么不呢:

    void swap (Integer a, Integer b) {
       Integer tmp = a;
       a = b;
       b = tmp;
    }
    

    如果你这样做了就工作

    Integer x = 1;
    Integer y = 2;
    swap(x,y);
    

    这是因为 java 按值传递(这是一个与指针不同的概念)。指向1 的指针被赋予swap(),而不是变量x(它是一个内存地址或指针)的值。因此,操作swap() 中的参数不会影响变量x

    【讨论】:

    【解决方案2】:

    首先,这属于 StackOverflow。二、想看文章Java is Pass-by-Value, Dammit!

    【讨论】:

    • 这根本没有回答问题!
    • 确实如此。 sort() 获取对数组的引用的副本。它可以随心所欲地重新排列数组的内容(即状态)。它无法创建一个新的并将其分配给您传递的那个。但这不是这里发生的事情。
    • 确实如此,但更简单的解释是“对对象的引用被传递给 sort 函数。引用是复制还是通过引用传递与这个问题无关。所有这些都很重要是函数看到的是对原始对象的引用,而不是对象的副本。
    【解决方案3】:

    它就地对数组进行排序。

    sort 方法接收对number 数组(它是一个对象)的引用,并更改数组中的值!没有创建新的数组对象,因此只需将其传递给sort 函数就足够了。

     

    PS:Java 的所有源代码都是开放的,你可以自己去阅读sort 函数的源代码。你会看到,没有魔法。如果您的系统上正确安装了 Java,Java 主文件夹中应该有一个 src.zip

    【讨论】:

    • 注意数组总是对象,甚至是原始类型的数组也可能很有用。您不能使用单个原语来执行此操作,例如:void increaseInt(int value) 不起作用,原始 int 无法通过方法内的任何操作来更改。
    【解决方案4】:

    我假设numbers 是一个整数数组,Java 中的所有数组都是对象。所以sort 被传递了一个对numbers 的引用,它可以就地对它们进行排序。

    【讨论】:

      【解决方案5】:

      这个问题应该转移到 Stack Overflow。Java 有一个 NullPointerException 类这一事实应该给你一个强烈的暗示,即 Java 是否使用指针作为场景。

      【讨论】:

      • 是的,但是NullPointerException 的名称确实有误——如果是NullReferenceExceptionIllegalNullDereferenceException 之类的名称会更好。引用不一定要在幕后通过指针来实现。
      • 我同意 Sun 的命名不一致。但是,如果没有在底层引用内存地址(即指针)的变量的概念,您将很难实现 Java。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-23
      • 2010-12-25
      • 2011-05-18
      • 2016-06-19
      • 1970-01-01
      • 2015-02-03
      • 2023-04-09
      相关资源
      最近更新 更多