2017-10-31 6 views
0

Javaでは、主なメソッドが上に(あるいは少なくとも私がそうするように)記述されることが多く、これらのメソッドでは、それぞれのクラスが下に宣言されていてもオブジェクトが作成されます。なぜコンパイルエラーにならないのですか?私はjavaが手続き型ではないことを知っていますが、これに対する答えは決して見つかりませんでした。Javaでは、宣言する前にクラス内のクラスを使用するのはなぜですか?

public static void main (String[] args) 
{ 
    baby1 obj1 = new baby1(); 
    baby2 obj2 = new baby2(); 
} 

class baby1 
{ 
    //some code 
} 
class baby2 
{ 
    //some code 
} 
+2

この言語はそのような前方参照を可能にするためです。それは単に設計上の決定です。 –

+4

Javaは[マルチパスコンパイラ](https://en.wikipedia.org/wiki/Multi-pass_compiler)を使用しています。 – Blorgbeard

+0

実際、それはなぜでしょうか? Cでは、この問題はコンパイラーがすべてを1回のパスで分析できることが必要なために発生します。 Javaはより新しいものであり、この言語の設計者はCの設計時と同じメモリ制約を受けていませんでした。 –

答えて

6

Javaは名前解決に複数のパスを使用します。最初のパスはソースプログラムをスキャンし、クラス,フィールドメソッドをテーブルに格納する「定義パス」です。次のパス(「解決パス」)で、クラスに遭遇した場合は、は、前のパスで作成されたテーブルのクラスに対してを検索します。クラスがそこにある場合、それはエラーをスローします。

しかし、これはローカル変数宣言では発生しません。ローカル変数が宣言される前にそれを使用することはできません。

関連する問題