2016-11-09 5 views
2

ケース1に割り当てられた理由: 私はパッケージ、java.langのを定義し、このパッケージでStringクラスを定義している:ここでコアStringオブジェクトのカスタム文字列クラスリファレンス

package java.lang; 
public class String { 
    String name = "ABC"; 
} 

私は参照を割り当てることができていますがコアJavaライブラリのStringクラスのオブジェクト( "ABC")への私のカスタムStringクラスの名前( "ABC")。 コンパイラはなぜそうすることができますか?

ケース2: 私は他のいくつかのパッケージに同じ文字列クラスを定義しjava.langplusを言う:予想通り、私は私の参照を代入していますので、

package java.langplus; 
public class String { 
    String name = "ABC"; //compiler error 
} 

は、その行String name = "ABC";は、コンパイラエラーがスローされますjava.langplusクラスからコアStringクラスのObjectへのカスタムStringクラス。

+0

コンパイラが完全修飾名が同じであるため、カスタムクラスとコアクラスを区別する方法はありません。 – mm759

+0

これらのいずれかの完全修飾クラス名を使用します。 –

+0

私は、(1)は "String"クラスをロードするために必要なクラスのものを定義するために "実際の" 'String'クラスをブートストラップする必要があると思いますので、コンパイラはそれを特別に扱います。面白い。 –

答えて

3

実行時に、javaのすべてのクラスは、クラスローダーとそのパッケージによって定義されます。

コンパイル時にはクラスローダがないため、コンパイラは型名のチェックのために参照名を割り当て、パッケージ名のみを使用します。

ケース2の場合、コア文字列「ABC」と文字列リファレンス「」のパッケージ名はjava.langplusパッケージのものと異なります。コンパイラはあなた Stringクラスを見つけるにもかかわらず、ケース1では

、あなたの java.langの「ABC」、すなわちコアライブラリのStringクラスのクラスは、実行時に失敗することが起こっているのと同じ。

関連する問題