2016-08-21 116 views
-1

我有以下二叉树的开始代码。我只是想知道,如果BinaryTree类尚未在A行和B行定义。为什么我不会在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 
+2

它在Java中并不重要,那不是C++,我们需要头文件。 – tkausl

+0

这是全班级的完整代码吗? –

+0

这段代码编译得很好。 (就其本身而言,只需为该程序添加一个'main()'方法)。您是否有示例说明您描述的问题? – David

回答

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规范说,这应该是好的,所以它是。