2013-05-06 14 views
6

Javaコンパイラに関するいくつかの質問があります。Javaコンパイラに関するいくつか質問があります

私の現在のディレクトリは、次のようなものです。

├── Hoge.java 
├── Sample.class 
├── Sample.java 
├── pattern01 
│   └── com 
│    └── cat 
│     └── Hoge.class 
└── pattern02 
    └── com 
     └── cat 
      └── Hoge.class 

----- ----- Sample.java

import com.cat.Hoge; 

public class Sample { 

    public static void main(String[] args) { 
     System.out.println("hello!"); 
     Hoge h = new Hoge(); 
     h.call(); 
    } 
} 

----- ----- pattern01

package com.cat; 

public class Hoge { 

    public void call() { 
     System.out.println("com.cat"); 
     System.out.println("pattern01"); 
    } 
} 

----- pattern02 -----

package com.cat; 

public class Hoge { 

    public void call() { 
     System.out.println("com.cat"); 
     System.out.println("pattern02"); 
    } 
} 

このようにSample.javaをコンパイルしました。

$ javac -cp pattern01 Sample.java 

そして、このように実行します。

$ java -cp .:pattern01 Sample 
hello! 
com.cat 
pattern01 

$ java -cp .:pattern02 Sample 
hello! 
com.cat 
pattern02 

通常、パターン01とパターン02の両方が終了する。

しかし、私はpattern01でコンパイルしました。なぜプログラムはpattern02で正常終了したのですか?

コンパイラチェックとは何ですか?コンパイラはクラス名だけをチェックしますか?

答えて

8

クラスは実行時に解決されます。クラスパスのHogeクラスのバージョンでクライアントクラス(Sample)をコンパイルし、別のバージョンのクラスでそれを実行しました。クラスはまだ互換性があるので(同じパッケージ、同じ名前、同じメソッドのシグネチャ)、すべてが順調です。

これは、特定のバージョンのライブラリ(またはJDK)でクラスをコンパイルできますが、同じライブラリ(またはJDK)の別のバージョンでも実行できます。これが不可能な場合は、すべてのライブラリをJDKのすべてのバージョンとすべての依存ライブラリのすべてのバージョンに対してコンパイルする必要があるため、再利用可能なライブラリを作成するのは難しいことです。

関連する問題