重複の可能性あり:
Java のファイル名はなぜクラス名と同じにする必要があるのですか?
という名前のファイルが 1 つありますtemp.java
。次のコードを記述しました。なぜこれが機能するのでしょうか?
class demo //not public keyword and not same as filename
{
public static void main(String []args)
{
System.out.println("this is Main method");
}
}
なぜこれが機能しないのでしょうか?
public class demo
{
public static void main(String []args)
{
System.out.println("this is Main method");
}
}
ベストアンサー1
最初の例では、クラスは実際には「パッケージ プライベート」(修飾子なし) として宣言されており、同じパッケージ内のクラスのみがアクセスできます。2 番目の例では、クラスをパブリックとして宣言しています。
これは、コンパイラが JLS に非常によく適合しているシナリオです。
パッケージがファイルシステムに格納される場合 (§7.2.1)、ホストシステムは、次のいずれかが当てはまる場合、型名と拡張子 (.java や .jav など) で構成される名前のファイル内に型が見つからない場合はコンパイル時エラーになるという制限を適用することを選択できます。
- 型は、その型が宣言されているパッケージの他のコンパイル単位内のコードによって参照されます。
- 型は public として宣言されています (したがって、他のパッケージのコードからアクセスできる可能性があります)。
この制限は、コンパイル単位ごとに最大 1 つの型が存在する必要があることを意味します。この制限により、Java プログラミング言語のコンパイラまたは Java 仮想マシンの実装は、パッケージ内の名前付きクラスを簡単に見つけることができます。たとえば、パブリック型 wet.sprocket.Toad のソース コードは、ディレクトリ wet/sprocket のファイル Toad.java にあり、対応するオブジェクト コードは同じディレクトリのファイル Toad.class にあります。
つまり、シナリオ 1 の場合、temp.java
with package private classのみが存在するためdemo
、パッケージの他のコンパイル単位のコードによって参照されず、問題なくコンパイルされます。
2 番目のシナリオでは、クラスが public として宣言されています。つまり、他のパッケージのコードからアクセスできる可能性があるので、クラス名がファイル名と同じであるという標準に準拠する必要があります。
最初のシナリオで(同じパッケージ内で)別のクラスを作成し、そのクラスを参照しようとするとdemo
、コンパイル エラーが発生します。