0

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

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 是包的名称,请帮忙!

4

3 回答 3

1

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

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

于 2013-04-08T19:30:09.287 回答
1

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);

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

为了得到更好Node的东西,你必须重写toString(). 这是一个示例,它将给每个人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;
  }
}
于 2013-04-08T19:37:57.717 回答
0

我们知道,我们编写的每个班级都是Object班级的孩子。当我们打印 an 的孩子时,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")

于 2013-04-08T19:33:30.890 回答