Java引用变量

3
我知道Java不允许像C++那样使用指针。但是,我听说过引用(可能与C++类似)。我的问题涉及以下问题:
我有一个名为“A”的类,在内存中实例化了一堆,我希望根据自己的选择“链接”这些类。在C++中,我只需定义一个类A的向量,并添加指向我想要链接到的类A实例的指针。这基本上就像在内存中构建一个全向图(或单向图,具体取决于如何构建链接)。
我的问题是,我能否以优雅的方式在Java中完成这个问题,如何完成?我猜这与引用有关。指针似乎是解决此问题的简单方法,但我是Java的新手,正在学习如何在没有指针的情况下完成此类操作。我真的不确定如何定义引用。在C++中,我会使用A * mypointer = new A();
谢谢。

1
在C语言中,没有向量和new。你可能在想C++。在Java中,除了内置类型之外,所有东西都具有引用语义。 - Fred Foo
1
在Java中,您将执行相同的所有操作,但不会在要链接的类前面放置一个小的 * - jahroy
2
在Java中,您传递引用的副本给方法,而不是引用本身。如果它是引用本身,您可以在方法中更改它们,这就是C ++中引用的含义,不是吗? - user unknown
是的,但目标通常不是更改引用,而是更改它所引用的对象(在Java中可以正常工作)。以我的答案为例,如果一个“FunkyObject”迭代其“referenceList”并在每个项上调用名为“changeName”的方法,则原始的“FunkyObject”也将被修改。 - jahroy
是的,抱歉 @larsmans,那是个打字错误。你发现得很好。 - user1300214
5个回答

4
import java.util.List;
import java.util.ArrayList;

class FunkyObject
{
    /** a list of other FunkyObject that this object is linked to */

    List<FunkyObject> referenceList = new ArrayList<FunkyObject>();

    /** creates a link between this object and someObject */

    public addRefrerence(FunkyObject someObject )
    {
        referenceList.add(a);
    }
}

1
public class A {

    private A[] refs;

    public A(A... refs) {
        this.refs = refs;
    }
}

在C语言中,我只需要一个类A定义的指向类A实例的指针向量(vector),然后将我想要链接到的类A实例的指针添加到其中。这听起来有点像在不知道集合大小的情况下进行添加,所以对我来说,数组似乎不是一个合适的选择。 - user unknown
这就是为什么我在我的回答中建议使用列表,但是无论您使用数组还是列表都不应该有影响。 - jahroy
是的,链接数量未定义,这就是为什么在C++中我会使用某种无界容器,比如列表。 - user1300214

0

你可以将引用视为指针,因为它们引用实例就像指针指向内存位置一样。最大的区别在于Java不允许对引用进行算术运算,而C可以对指针进行算术运算。你也不能创建一个字段的引用——只能创建一个对象的引用,并通过使用new来实例化。

至于存储对多个A实例的引用,你有很多选择。你可以使用List,例如ArrayList或任何其他Collection类。这真的取决于你需要如何访问它们。请浏览java.util包中的所有集合。


1
我认为这样说"[object]引用是没有算术运算的指针"是不公正的。 - user166390
@pst - 你能具体一点吗?懂得C指针的人会很容易理解Java引用,因为它们很相似。 - David Harkness
@pst 维特根斯坦的梯子适用。如果这个问题的目的是解释Java和C之间的区别,那么"不公正"是相关的。为了解释如何在Java中实现你想要做的事情,使用一个更简单、"足够接近"的比喻可能是有用的。(话虽如此,在这种情况下,"缺乏指针算术"并不是我认为关键的区别,而是在编辑中添加的那个区别。) - millimoose
1
@Inerdial 我不同意,认为整个语义可以完全不使用“引用”来描述:虽然需要记住术语“引用”在JLS中的使用,但是该概念可以完全不使用“引用”一词来描述,正如ECMAScript规范所证明的那样。我只是看不到建立进一步联系的必要性...让X语言自己发展吧。(而且从C ++来看,这实际上更加令人困惑,因为引用已经是一种语言构造,但并非完全符合Java的意义...) - user166390
1
@pst: 我认为我们可以引用JLS:“引用值(通常只是引用)是指向...对象的指针”(JLS 4.3.1) - newacct
显示剩余3条评论

0
第二段中所描述的几乎就是Java模型的工作方式。这也是它唯一的工作方式。当Java教程说“Java是按值传递”时,它们所指的值是原始类型和对象句柄。也就是说,当您传递一个对象类型的值时,对象不会被复制。(我认为这与在C中传递指向结构体的指针的行为相同。)
例如,您不能创建指向局部变量或对象字段的指针。您只能传递它们的值。

0

感谢您的所有帮助 - 它非常有用。看起来引用提供了我所寻找的优雅解决方案,这是C/C++中指针所提供的。到目前为止,我唯一能看到的主要区别(尚未实现)是我们不能在引用上执行算术运算。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接