Java 对象数组初始化

Java 对象数组初始化,java,arrays,object,Java,Arrays,Object,我正在重新提出我的问题 有3个引用变量root1、root2、root3,它们包含在引用数组中(root[]={root1、root2、root3}) 我为根[0]初始化了对象,希望根[0]引用根1,因此我希望根1.data和根[0]。data访问相同的值。但是我无法使用根1.data访问它,而我可以使用根[0]。data访问它 public class testing { static Node root1,root2,root3; public static void main(S

我正在重新提出我的问题

有3个引用变量root1、root2、root3,它们包含在引用数组中(root[]={root1、root2、root3})

我为根[0]初始化了对象,希望根[0]引用根1,因此我希望根1.data和根[0]。data访问相同的值。但是我无法使用根1.data访问它,而我可以使用根[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;
        }    
    }
}

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

初始化数组后,只需在每个节点中输入一个空值

     root[0]=new Node(null,2);
新创建的节点将被数组中的第一个节点引用,array1的值仍然为null

         root1=new Node(null,3);

现在root1 one指向新节点

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

为了举例说明,我将使用数字方案“命名”实际对象,例如#1是第一个对象

您的代码运行如下:

  • 类由JVM初始化,
    root1
    root2
    root3
    都是
    null

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

    Node[] root = new Node[3];
    root[0] = root1;
    root[1] = root2;
    root[2] = root3;
    
  • root[0]=执行新节点(null,2)
    并创建一个
    节点
    对象(#2)并将其分配给
    root[0]
    。请注意,
    root1
    保持为
    null

  • root1=执行新节点(null,3)
    并创建一个
    节点
    对象(#3)并将其分配给
    root1
    。请注意,
    root[0]
    仍然引用#2

  • 打印
    root[0]的值。数据
    ,由于
    root[0]
    references#2,它将打印
    2

  • 打印
    root1.data
    的值,由于
    root1
    引用了#3,它将打印
    3


一切都按其应有的方式运行。

请查看具有相同行为的简化代码:

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指向节点对象是非常重要的。在某些语言中,r1和r2被称为指针,在Java中,它们被称为引用

执行时:

Node r1 = new Node(1);
r1指向数据为1的节点实例

r1 -> Node.data=1
之后

Node r2 = r1;
r1和r2都指向同一个节点实例

r1 -> Node.data=1 <- r2
你有

        Node.data=1  <- r2
r1 ->   Node.data=2 
Node.data=1个Node.data=2

这解释了程序的输出

为什么需要所有节点都是静态的?尝试不使用静态修饰符,但使用主要方法。为什么要重新发布问题?改为编辑原始问题。我投票结束这个问题,作为原始问题的重复。请友好。
        Node.data=1  <- r2
r1 ->   Node.data=2