【问题标题】:change values of array of a class in java在java中更改类的数组的值
【发布时间】:2013-04-08 19:25:23
【问题描述】:

我正在编写一个在整个地图中执行星搜索的程序。我创建了一个包含地图所有节点的类。

public Node {
   Node up_node, right_node, down_node, left_node;
}

public class Star {
    public static void main(String args[]) {
        Node a=new Node();
        Node b=new Node();
        Node h=new Node();
        Node here=new Node();

        Node[] NextNode;
        NextNode = new Node[10];
        for(int i=0;i<10;i++) {
            NextNode[i]=new Node();
        }
        int j=0;
        a.up_node=h;
        a.right_node=b;

        b.left_node=a;

        h.down_node=a;

        //if certain conditions are met
        NextNode[j].here_node=a.up_node;
        //what i was hoping to do is copy the node a.up which is h
    }
}

在这种情况下进入 NextNode[0]。但是它不断返回某种内存地址:test.Node@10b28f30: test 是包的名称,请帮忙!

【问题讨论】:

  • 返回哪里?如果您尝试 system.out.println Node 对象,除非您覆盖类节点的 toString 方法,否则您肯定会以 Node@XXXX 结束。
  • 除了其他节点的引用之外,每个节点中将包含哪些value?如果你有那个value,那么在toString() 方法中返回那个valueString 格式。这将解决您的问题
  • “它不断返回”非常模糊。根本不清楚你在哪里看到它,但几乎可以肯定这是在 Node 上调用 toString() 的结果 - 而且你还没有覆盖该方法......
  • 引用:"NextNode[j].here_node=a.up_node;" Node 类上不存在 here_node?​​span>

标签: java arrays class initialization


【解决方案1】:

@override toString() 方法来显示你的类的内部属性。

默认情况下,java会显示完整的类名@hashCode值。

【讨论】:

    【解决方案2】:

    Java 中的变量是对象引用,而不是实际的对象NextNode[j].here_node = a.up_node; 将使NextNode[j].here_nodea.up_node 指向同一个对象。这不是你想要的吗?

    如果您想制作对象的全新副本,那么您可以在 Node 类中实现它:

    public class Node {
      Node up_node, right_node, down_node, left_node;
    
      public Node clone() {
        Node ret = new Node();
    
        // copy the properties
        ret.up_node = this.up_node;
        ...
    
        return ret;
      }
    }
    

    现在

    NextNode[j].here_node = a.up_node.clone();
    

    将制作一个副本(尽管它只是一个浅层副本——该副本将通过其字段指向相同的对象,而不是它们的副本)。

    我假设您对返回“地址”的代码感到困惑是因为您试图打印一个节点,例如

    System.out.println(a.up_node);
    

    你会得到类似test.Node@10b28f30的东西,但是试试

    System.out.println(NextNode[j].here_node);
    

    你应该得到完全相同的字符串,表明它们指向同一个对象。

    要获得更好的结果,您必须覆盖 NodetoString() 的实现。下面是一个示例,它将为每个 Node 分配一个唯一编号:

    public class Node {
      Node up_node, right_node, down_node, left_node; 
    
      // how many nodes were created
      private static int count = 0;
    
      // the number of this node
      private int number;
    
      public Node() {
        // increment the number of nodes created
        ++Node.count;
        // assign that number to this node
        this.number = Node.count;
      }
    
      public String toString() {
        return "Node #" + this.number;
      }
    }
    

    【讨论】:

      【解决方案3】:

      我们知道我们编写的每个类都是Object 类的子类。当我们打印一个Object 的孩子时,它会打印它的toString() 方法。默认情况下,它是内存位置的哈希值。所以它打印出一些奇怪的东西。如果我们 @overriding toString 方法返回对我们更有意义的东西,那么我们可以解决这个问题。如果我们可以以某种方式命名我们的节点类,我认为我们可以轻松地跟踪它们

      class Node(){
            String nameOfNode;    
            //contractor to keep track of where it goes. 
            public Node(String a){
                   nameOfNode=a;
      
            }
            //when we will print a Node it is going to print its name
            public String toString(){
                    return nameOfNode;
            }
      }
      

      然后它将打印节点的名称。它会停止显示那个奇怪的内存地址。

      并将您的 new Node() 替换为不同的名称 new Node("a name")

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-01
        • 1970-01-01
        • 2014-03-15
        相关资源
        最近更新 更多