2016-04-19 7 views
9

オブジェクトクラスはすべてのクラスの基本クラスです。つまり、すべてのクラスがオブジェクトクラスを拡張します。 Objectクラスにはpublic String toString()メソッドがあり、Stringクラスでも同じメソッドが存在します。 StringクラスはObjectクラスも継承し、toStringメソッドはString型を返します。ObjectクラスのtoString()メソッドはどのようにjavaでコンパイルされますか?

私の質問is-:Objectクラスをコンパイルする際に、String.classが検索され、StringクラスがObject.classを検索して相互依存のタイプを作成します。この依存関係はどのように解決されていますか?コンパイルメカニズムはどのように機能しますか?私がどこか間違っているなら、私を修正してください。

+0

Javaがどのようにこの種の参照ループをどのようにサポートしているのかわかりません。そのため、クラスパスなしでJavaファイルをコンパイルすることはできません。コンパイラは、必要に応じて他のクラスを検査します。 – aalku

+0

in javaクラスAのインポートBを持つことに何も問題はありません。クラスB輸入A; (そして他の言語では前方宣言があります) – Exceptyon

+0

お互いを参照する他の2つのクラスをコンパイルするのと同じです。 – SomeJavaGuy

答えて

4

JavaコンパイラはMulti-Pass Compilerです。これは、コンパイル手順に段階的なステップがあることを意味します。 Objectをコンパイルしている間は、Stringという一時的な表現を使用して、Objectをコンパイルできるようにします。

一時的な表現と何らかの非表示のインターフェイスを比較できます。コンパイラはそのインタフェースにコンパイルします。実行時にのみ、コンパイルされた部分が一緒になります。コンパイラは、別のクラスをコンパイルするために、完全にコンパイルされたクラスを必要とせず、その抽象化のみを行います。実際

+0

これは完全には適合しませんが、他の言語に対して行われているコンパイルと[リンク](https://en.wikipedia.org/wiki/Linker_%28computing%29)のステップへの参照を追加することができます。コンパイラは、それが必要とするすべてを持っていると仮定します。リンカは実際には "リンクを解決する"(そして、これらの*未定義の参照*エラーをすべて吐き出す) – Marco13

2

、あなたがそのようなコードを書きながら:それは何かをインスタンス化していないため、

public class Class1 
{ 
public Class2 giveClass2() 
{ 
    return new Class2(); 
} 
} 
public class Class2 : Class1 { } 

それは正しくコンパイル。コンパイラは、使用する型が定義されているかどうかをチェックします。

しかし、あなたは以下のようにそれを書く場合:

public class Class1 
    { 
     public Class1(){ 
      aClass2 = new Class2(); 
     } 
     public Class2 aClass2; 
    } 

    public class Class2 : Class1 
    { 

    } 

また、これはコンパイルされますが、その後、循環依存関係への影響ので、それは実行時にスタック・オーバーフローが発生します。

関連する問題