Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java引用变量 我知道java不允许用C++语言编写指针。但是,我已经听说过一些关于引用(大概类似于C++)。我的问题涉及以下问题:_Java_Pointers_Pass By Reference - Fatal编程技术网

Java引用变量 我知道java不允许用C++语言编写指针。但是,我已经听说过一些关于引用(大概类似于C++)。我的问题涉及以下问题:

Java引用变量 我知道java不允许用C++语言编写指针。但是,我已经听说过一些关于引用(大概类似于C++)。我的问题涉及以下问题:,java,pointers,pass-by-reference,Java,Pointers,Pass By Reference,我有一个类“a”,比如说,我在内存中实例化了一堆(使用new),我希望根据我的选择将这些类“链接”到另一个。在C++中,我只需要一个向量(在类中定义),它是一个类指针,我将指针添加到要链接到的类A的实例中。这基本上类似于在内存中构建全向图(或单向图,具体取决于我如何构建链接) 我的问题是,我可以用Java优雅地实现这一点吗?如何实现?我猜这和推荐信有关。指针似乎是解决这个问题的一个非常简单的方法,但我对Java还不熟悉,正在学习如何在没有指针的情况下做这些事情。我真的不知道如何定义引用。在C++

我有一个类“a”,比如说,我在内存中实例化了一堆(使用new),我希望根据我的选择将这些类“链接”到另一个。在C++中,我只需要一个向量(在类中定义),它是一个类指针,我将指针添加到要链接到的类A的实例中。这基本上类似于在内存中构建全向图(或单向图,具体取决于我如何构建链接)

我的问题是,我可以用Java优雅地实现这一点吗?如何实现?我猜这和推荐信有关。指针似乎是解决这个问题的一个非常简单的方法,但我对Java还不熟悉,正在学习如何在没有指针的情况下做这些事情。我真的不知道如何定义引用。在C++中,我将使用A*MyPosie=新A.();p>
谢谢,

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

public class A {

    private A[] refs;

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

至于存储对
A
的多个实例的引用,您有很多选择。您可以使用诸如或任何其他类。这实际上取决于您需要如何访问它们。仔细阅读所有集合的
java.util
包。

您在第二段中描述的内容与java模型的工作原理非常接近。(这也是它工作的唯一方式。)当Java教程说“Java是按值传递的”时,它们所指的值是基本类型和对象句柄。也就是说,当传递对象类型的值时,对象不会被复制。(我认为这与在C中传递指向结构的指针的行为相同。)

例如,您不能创建指向局部变量或对象字段的指针。您只能传递它们的值。

import java.util.List;
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);
    }
}
导入java.util.ArrayList; 类FunkyObject { /**此对象链接到的其他FunkyObject的列表*/ List referenceList=new ArrayList(); /**在该对象和someObject之间创建链接*/ public addreference(FunkyObject someObject) { 添加(a); } }
感谢您的帮助-它非常有用。似乎引用提供了我所寻找的优雅的解决方案,而指针在C/C++中提供了这种解决方案。到目前为止,我能看到的唯一主要区别(没有实际实现)是我们不能对引用执行算术。

在C中,没有向量,也没有新的
。你在考虑C++。在Java中,所有东西(除了内置类型)都有引用语义。在Java中,所有事情都是一样的,但不会在链接的类前面放一点
*
。在Java中,将引用的副本传递给方法,而不是引用。如果它是引用,那么你可以在方法中改变它们,即C++中的引用,不是吗?是的,但是目标通常不是改变引用,而是改变它引用的对象(在java中工作得很好)。以我的回答为例,如果一个
FunkyObject
在其
referenceList
上迭代,并对每个项目调用名为
changeName
的方法,那么原始的
FunkyObject
也将被修改。是的,对不起@larsmans,这是一个打字错误。很好。我认为说“[对象]引用是没有算术的指针”是不公平的。@pst-你能更具体一点吗。理解C指针的人会很好地理解Java引用,因为它们很相似。@pst适用。如果这个问题的目的是解释Java和C之间的区别,那么“不公正”是相关的。为了解释如何在Java中完成您想做的事情,可以使用一个更简单的“足够接近”的比喻。(也就是说,在这种情况下,“缺少指针算法”并不是关键区别,正如编辑中添加的一样。)@Ineradial我不同意,并且认为整个语义可以在不完全使用“引用”的情况下进行描述:尽管重要的是要记住术语“引用”在JLS中使用,正如ECMAScript规范所证明的那样,可以完全不用术语“引用”来描述这个概念。我只是看不到试图建立进一步的联系。。。让语言X走吧。(实际上,C++是一种语言构造,但不是完全在java意义上……):PST:我认为我们可以引用JLS:“引用值(通常只是引用)是指向…对象的指针”(JLS4.3.1)<代码> > C i中只有一个向量(在A类中定义)。我向要链接的类A实例添加指针的类A指针。
听起来有点像在不知道集合有多大的情况下添加指针,因此数组似乎不是我的合适选择。这就是为什么我在回答中建议使用列表,但使用数组还是列表并不重要。是的,链接的数量是不确定的,这就是为什么在C++中我会使用某种无界容器,比如列表。