2016-08-21 12 views
-1

私はバイナリツリーの次の開始コードを持っています。私はちょうど、BinaryTreeクラスがラインAとラインBでまだ定義されていないかどうか知りたかったのですが、ラインAとラインBのレポートでコンパイルエラーが発生しないのはなぜですか。BinaryTree not defined 私は、ラインCはクラスが完全に定義されていると仮定しています。ここでは、tkauslさんのコメントに拡大することクラスが定義されていないようなエラーはありません

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

は、スコーピングに関するJava言語仕様である: http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.3

具体的に:

トップレベルのタイプ(7.6)の範囲は、すべてのタイプでありますトップレベル型が宣言されているパッケージ内の宣言。 http://docs.oracle.com/javase/specs/jls/se7/html/jls-7.html#jls-7.6

例7.6-2:あなたはセクション7.6にジャンプした場合

は、も、あなたの疑問を解決する例があります。トップレベルタイプの範囲

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 
} 

このプログラムは、自分のクラスのメンバの宣言でお互いを使用する2つのクラスを定義します。クラス型PointおよびPointColorは、現在のコンパイル単位内のすべての型宣言を含め、パッケージポイント内のすべての型宣言をスコープとして持つため、このプログラムは正しくコンパイルされます。つまり、前方参照は問題ではありません。

そして、ちょうど完全、前方参照(私もこれを見ていた...)のために: Forward reference vs. forward declaration

TLDR:Javaの仕様では、これがOKであるべきと言うので、それはです。

関連する問題