Java 如何初始化具有子类私有值的类的对象

Java 如何初始化具有子类私有值的类的对象,java,Java,例如,我有这个代码 public class BST{ private Node root; private double[] start; public class Node{ private double[] coords; private String address; private Node left, right; private double distance; public Node (double[] coords, String addr

例如,我有这个代码

public class BST{
private Node root;
private double[] start;

public class Node{
    private double[] coords;
    private String address;
    private Node left, right;
    private double distance;


public Node (double[] coords, String address){
    this.coords = coords; this.address = address;
    this.distance = distance(coords);
    }
//calculates 
public double distance(double[] destination){
    double tempLat = start[1] - destination[1];
    double tempLong = start[0] - destination[0];
    tempLat = tempLat*111;
    tempLong = tempLong*85;
    double Distance = Math.sqrt(Math.pow(tempLong, 2)+Math.pow(tempLat,2));
    return Distance;
}

}

public BST(Node root, double[] start){
    this.root = root;
    this.start = start;
}
它是一棵树,有一个子类节点

我的问题是,在主类中,我无法正确初始化BST对象

我这样做:

BST mcdonaldsLocations;
Node rootM = new Node(rootCoords, rootAddress); 
mcdonaldsLocations = new BST(rootM, start);
但它不起作用。所以我做了一些修补,得到了这个

BST mcdonaldsLocations = null;
Node rootM = mcdonaldsLocations.new Node(rootMCoords, rootMAddress); 
mcdonaldsLocations = new BST(rootM, start);

编译,但有空指针错误。

我不会将
节点实现为内部类,但出于演示目的:
您可以使用静态工厂-从代码中删除构造函数,然后执行以下操作:

public static BST generateBST(double[] start, String rootAddress) {
    BST bst = new BST();
    bst.start = start;
    Node root = bst.new Node(start, rootAddress);
    bst.root = root;
    return bst;
}

在这种情况下,你不能。因为在创建BST.节点之前需要一个BST.节点,在创建BST.节点之前需要一个BST.节点。但是您是否考虑过将BST.节点设置为静态?请遵循JDK中提供的示例,如java.util.Map及其Map.Entry。您可以详细说明一下吗。我还是一个新手,你是说让BST.node成为一个静态类?这有什么帮助?正如immibis所描述的,现在你有一个鸡和蛋的场景。如果将BST.Node设置为静态,则可以独立创建它,而不需要BST的实例。尽管alfasin也提出了一个有效的观点。另一个选择是跳过嵌套类方法。谢谢Leigh,我现在明白了。我还必须创建一个嵌套类,因为Node的构造函数使用方法距离(double[]),它依赖于BST的私有值。我这样说对吗?我需要定义一个不带参数BST()的构造函数吗?可以,但不是强制的,如果不这样做,将使用空构造函数作为默认构造函数。你为什么不两个都试一下呢?;)好吧,我明白了,我不知道它们是默认的。感谢您的帮助。确切地说,内部类和外部类之间的设计和耦合并不完全正确。至少有一股代码的味道。@Martin我不知道“开始”、“目的地”和“距离”代表什么。他们中的每一个人都应该在它所属的班级中。一般的经验法则是,变量应该在尽可能狭窄的范围内声明!