在java中更改类的数组值

时间:2013-04-08 19:25:23

标签: java arrays class initialization

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

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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的{​​{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")