【问题标题】:Object Array Initialization [duplicate]对象数组初始化
【发布时间】:2017-02-16 16:11:38
【问题描述】:

我正在重新发布我的问题。

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

【问题讨论】:

  • 为什么需要所有节点都是静态的?尝试不使用静态修饰符但使用主要方法
  • 你为什么要转发你的问题?改为编辑您的原始问题。我投票决定将此问题作为原始问题的副本结束。
  • 请客气。

标签: java arrays object


【解决方案1】:

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

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 

这解释了程序的输出。

【讨论】:

    【解决方案2】:

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

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

    您的代码运行如下:

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

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

      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

    一切正常。

    【讨论】:

      【解决方案3】:

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

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

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

      新创建的节点将被数组中的第一个节点引用,array1 的值仍然为 null

               root1=new Node(null,3);
      

      现在root1指向新节点

      【讨论】:

        猜你喜欢
        • 2018-06-22
        • 1970-01-01
        • 2017-02-18
        • 2011-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多