最初の例では、クラスは実際には「package private」(修飾子なし) として宣言されています。これは、同じパッケージ内のクラスのみがアクセスできることを意味します。2 番目の例では、パブリックとして宣言しています。
これは、コンパイラが JLS を十分に満たしているシナリオです。
JLS は次のように述べています。
パッケージがファイル システム (§7.2.1) に保存されている場合、ホスト システムは、型名と次のいずれかに該当する場合、拡張子 (.java または .jav など):
- 型は、型が宣言されているパッケージの他のコンパイル単位のコードによって参照されます。
- この型は public と宣言されています (したがって、他のパッケージのコードからアクセスできる可能性があります)。
この制限は、コンパイル単位ごとにそのような型が最大で 1 つ存在する必要があることを意味します。この制限により、Java プログラミング言語のコンパイラまたは Java 仮想マシンの実装が、パッケージ内の名前付きクラスを簡単に見つけることができます。たとえば、パブリック タイプの wet.sprocket.Toad のソース コードは、ディレクトリ wet/sprocket のファイル Toad.java にあり、対応するオブジェクト コードは、同じディレクトリのファイル Toad.class にあります。
temp.java
これが意味するのは、シナリオ 1 の場合、パッケージ private classしかないためdemo
、パッケージの他のコンパイル単位のコードによって参照されていないため、問題なくコンパイルされるということです。
2 番目のシナリオでは、クラス public を宣言しました。これは、他のパッケージのコードからアクセスできる可能性があることを意味します。そのため、クラス名がファイル名と等しいという標準に準拠する必要があります。
最初のシナリオ (同じパッケージ内) で別のクラスを作成し、そのクラスを参照しようとするとdemo
、コンパイル エラーが発生するはずです。