我正在编写一个程序,在整个地图中执行星形搜索。我创建了一个包含地图所有节点的类。
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是包的名称,请帮忙!
答案 0 :(得分:1)
@override toString()方法显示类的内部属性。
默认情况下,java显示完整的类名@ hashCode值。
答案 1 :(得分:1)
Java中的变量是对象引用而不是实际的对象。 NextNode[j].here_node = a.up_node;
会使NextNode[j].here_node
和a.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
的{{1}}实现。这是一个为每个toString()
提供唯一编号的示例:
Node
答案 2 :(得分:0)
我们知道我们写的每个班级都是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")