我正在转发我的问题。
有3个引用变量root1,root2,root3,它们包含在引用数组中(root [] = {root1,root2,root3})。
我初始化了root [0]的对象,我希望root [0]引用root1,所以我希望root1.data和root [0] .data访问相同的值。但是我无法使用root1.data,而我能够使用root [0] .data访问它。
public class testing
{
static Node root1,root2,root3;
public static void main(String[] args)
{
Node root[]={root1,root2,root3};
root[0]=new Node(2,null);
System.out.println("root[0]="+root[0].data);//It is working properly
System.out.println("root1="+root1.data);//It is not working properly
}
public static class Node
{
int data;
Node next;
Node(int data,Node next)
{
this.next=next;
this.data=data;
}
}
}
答案 0 :(得分:0)
不,他们不应该访问相同的值,
初始化数组后,您可以简单地在每个节点中放入一个空值
root[0]=new Node(null,2);
新创建的节点将由数组中的第一个节点引用,array1仍具有null
的值 root1=new Node(null,3);
现在root1指向新节点
答案 1 :(得分:0)
变量和数组元素都是对象的引用。它们不是实际的对象。
为了说明,我会"名字"使用数字方案的实际对象,例如#1是第一个对象。
您的代码运行如下:
类由JVM初始化,root1
,root2
和root3
都是 null
。
Node root[]={root1,root2,root3}
已执行,它会创建一个长度为3的Node[]
对象(#1),并复制 null
root1
,root2
和root3
的值。代码相当于:
Node[] root = new Node[3];
root[0] = root1;
root[1] = root2;
root[2] = root3;
root[0]=new Node(null,2)
并创建一个Node
对象(#2)并将其分配给root[0]
。请注意,root1
仍为 null
。
root1=new Node(null,3)
并创建一个Node
对象(#3)并将其分配给root1
。请注意,root[0]
仍然引用#2。
您打印root[0].data
的值,由于root[0]
引用了#2,它将打印2
。
您打印root1.data
的值,由于root1
引用了#3,它将打印3
。
一切都按照应有的方式运作。
答案 2 :(得分:0)
查看具有相同行为的简化代码:
public class Testing2 {
public static void main(String[] args) {
Node r1 = new Node(1);
Node r2 = r1;
r1 = new Node(2);
System.out.println("r1=" + r1.data);// prints 2
System.out.println("r2=" + r2.data);// prints 1
}
public static class Node {
int data;
Node(int data) {
this.data = data;
}
}
}
了解r1和r2在Node对象上指向非常重要。在某些语言中,r1和r2将被称为指针,在Java中它们被称为引用。
执行时:
Node r1 = new Node(1);
你有r1指向Node的实例,数据= 1
r1 -> Node.data=1
之后
Node r2 = r1;
r1和r2都指向同一个Node实例
r1 -> Node.data=1 <- r2
最后
r1 = new Node(2);
你有
Node.data=1 <- r2
r1 -> Node.data=2
这解释了程序的输出。