2012-05-04 12 views
17

可能性の重複:
Why filename in java should be same as class name?はなぜJavaファイルは、公開クラスと同じ名前を持つ必要がありますか?

私は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"); 
    } 
} 
+9

それは*法*だから! –

+0

この質問はDUPへのリンクせずに、重複としてマークされている方法は、以下のリンクhttp://wiki.answers.com/Q/Why_do_file_name_and_class_name_always_coincide_in_Java –

+1

を見てください?これはいくつかのレガシー2012魔法ですか? – Zsw

答えて

21

、あなたのクラスは、実際には同じパッケージ内のクラスだけがアクセスできることを意味する、(無修飾)「プライベートパッケージ」として宣言されています。 2番目の例では、それを公開として宣言しています。

これは、コンパイラは非常によくJLSを満たしているシナリオです。

The JLS states:

パッケージがファイルシステムに格納されている場合(§7.2.1)、ホストシステムはタイプがで見つからない場合、それは、コンパイル時エラーで制限を強制することを選択することができます

  • タイプ名と、拡張子(.javaや.javなど)で構成される名前のファイルは、パッケージの他のコンパイル単位でコードで参照されます型が宣言されています。
  • タイプは、パブリック宣言(したがって、他のパッケージ内のコードから潜在的にアクセス可能である)されています。

この制限は、1つのコンパイル単位でこのような型が1つ多くなければならないことを意味します。この制限により、Javaプログラミング言語のコンパイラやJava仮想マシンの実装が、パッケージ内の名前付きクラスを簡単に見つけることができます。たとえば、パブリックタイプのwet.sprocket.Toadのソースコードは、ディレクトリwet/sprocket内のファイルToad.javaにあり、対応するオブジェクトコードは、同じディレクトリのファイルToad.classにあります。これはあなたが唯一のパッケージプライベートクラスdemotemp.javaを持っているので、それはパッケージの他のコンパイル単位内のコードによって参照されていないことを、シナリオ1のため、ある意味何

、したがって、それは問題なくコンパイルされます。

あなたの2番目のシナリオは、クラスのパブリック宣言した - それは、クラス名がファイル名に等しい標準に準拠しているので - それは他のパッケージ内のコードから潜在的にアクセス可能であることを意味します。

(同じパッケージ内の)最初のシナリオで別のクラスを作成してから、クラスdemoを参照しようとすると、コンパイルエラーが発生するはずです。

関連する問題