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我不知道“开始”、“目的地”和“距离”代表什么。他们中的每一个人都应该在它所属的班级中。一般的经验法则是,变量应该在尽可能狭窄的范围内声明!