对象数组初始化

时间:2016-10-07 15:35:13

标签: java arrays object

我正在转发我的问题。

有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;
        }    
    }
}

3 个答案:

答案 0 :(得分:0)

不,他们不应该访问相同的值,

初始化数组后,您可以简单地在每个节点中放入一个空值

     root[0]=new Node(null,2);

新创建的节点将由数组中的第一个节点引用,array1仍具有null

的值
         root1=new Node(null,3);

现在root1指向新节点

答案 1 :(得分:0)

变量和数组元素都是对象的引用。它们不是实际的对象。

为了说明,我会"名字"使用数字方案的实际对象,例如#1是第一个对象。

您的代码运行如下:

  • 类由JVM初始化,root1root2root3都是 null

  • Node root[]={root1,root2,root3}已执行,它会创建一个长度为3的Node[]对象(#1),并复制 null root1root2root3的值。代码相当于:

    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 

这解释了程序的输出。