您好我有2个Java课程,Gossip
和Node
,我希望Gossip
能够保存Node
类所有对象的列表,我希望每个Node
对象也将具有该列表。我尝试用以下方式编写它:
public class Node {
private Boolean val = null;
private LinkedList<Node> list;
static Random rand = new Random();
public Node(LinkedList<Node> list) {
this.list=list;
}
... the rest of Node functions ...
}
和Gossip
承包商:
public class Gossip {
private int count;
private int n;
private LinkedList<Node> list;
public Gossip (int n) {
this.count = 0;
this.n = n;
list = new LinkedList<Node>();
for (int i=0; i<n; i++){
list.add(new Node(list));
}
}
... the rest of Gossip functions ...
}
由于我已经习惯C++
,我不确定它在这里是如何工作的,这是否会像指针一样工作,每个Node
都会有一个完整的列表,或者每个Node
将只有一个列表,其中包含Node
之前和它自己。此外,我不需要更改程序上的列表,只是为了阅读它,但有趣的是,列表中Node
所做的更改将影响所有其他Node
的列表?
答案 0 :(得分:1)
只有一个节点列表,所有节点都引用了这个列表。
这是因为在Node构造函数中,赋值this.list=list;
不会创建对象的副本 - 它只会使this.list
与list
相同,但请记住它们都是引用(在堆栈)到对象(在堆上)。
因此,如果您通过其中一个节点更改列表,则所有其他节点都将看到更改。
答案 1 :(得分:1)
每new LinkedList<Node>();
Gossip
只创建一个列表{{1}}。后来它通过引用(像指针一样)传递,因此它在任何地方列出相同的内容。
答案 2 :(得分:1)
Node
类是否在Gossip
类之外使用?如果没有,那么您可能需要考虑将Node
作为Gossip
的私有内部类。这将简化事情,因为Node
实例可以访问Gossip
中的列表而无需自己引用它。您必须将列表定义为final
才能执行此操作。
答案 3 :(得分:0)
java中从java.lang.Object派生的所有变量/字段都是“引用”,它与C ++中的指针基本完全相同。 (不要与C ++引用混淆,这些引用也只有指针但具有特殊语义) 这意味着int,float和所有其他的原始值都是值而不是指针/引用,ofc。