我有以下二叉树的起始代码。我只是想知道,如果在{A}和B行尚未定义BinaryTree
类,为什么我在A行和B行报告中无法得到编译错误 - BinaryTree not defined
。
我假设,C行是完全定义类的地方。
public class BinaryTree {
private int data;
private BinaryTree left; // Line A
private BinaryTree right; // Line B
public BinaryTree(int num) {
this.data = num;
this.left = null;
this.right = null;
}
// getters and setters.
} // Line C
答案 0 :(得分:1)
要扩展tkausl的注释,这里是关于作用域的Java语言规范: http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.3
具体做法是:
顶级类型(第7.6节)的范围是声明顶级类型的包中的所有类型声明。
如果你跳到第7.6节,甚至有一个例子可以解决你的问题:http://docs.oracle.com/javase/specs/jls/se7/html/jls-7.html#jls-7.6
示例7.6-2。顶级类型的范围
package points; class Point { int x, y; // coordinates PointColor color; // color of this point Point next; // next point with this color static int nPoints; } class PointColor { Point first; // first point with this color PointColor(int color) { this.color = color; } private int color; // color components }
该程序定义了两个在类成员声明中互相使用的类。因为类类型Point和PointColor具有包点中的所有类型声明,包括当前编译单元中的所有类型声明作为其范围,所以此程序正确编译。也就是说,前向引用不是问题。
只是为了完整性,前瞻性参考(我不得不仔细查看......): Forward reference vs. forward declaration
TLDR :Java规范说这应该没问题,所以它是。