2011-01-28 11 views

答えて

9

Javaの場合、という制限がありません。まあ、の制限です。これは、Java言語仕様がオプションと記載しているものです。 section 7.6 of the JLSから:パッケージがファイルシステム(§7.2.1)に格納されている場合

、ホストシステムはタイプがファイルに見つからない場合、それはコンパイル時エラーであるという制限を強制することもできます次のいずれかが該当する場合は、タイプ名と拡張子(.javaや.javなど)で構成される名前で指定します。

  • このタイプは、パッケージの他のコンパイル単位でコードで参照されます。型が宣言されます。
  • 型はpublicと宣言されているため、他のパッケージのコードからアクセスできる可能性があります。

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

しかし、基本的には、ソースをナビゲートしやすくすることをお勧めします。パブリッククラスの名前を知っているなら、通常、ソースコードを見つけるのはかなり簡単です。

+3

パブリックではいけない持っている公共のだろう唯一覚えています。 –

+0

okこのルールは、ソースファイルとクラスeasily.butをナビゲートするための規約であることを理解していますが、複数のパブリックファイルを持つことができない理由と同じ規則が非パブリッククラス(デフォルトパッケージと同じ)に適用されない理由は? – saravanan

+2

@ user587072:「なぜ私は複数のパブリックファイルを持つことができないのですか」という意味はどうですか?ファイルはパブリックではなく、クラスはクラスです。複数のパブリッククラスがある場合、それらのクラスは関連する名前を持つことができないため、少なくとも1つは見つけにくいでしょう。なぜ非公開クラスには当てはまりませんか:おそらく、開発者は非公開クラスよりもパブリッククラスのソースコードを探したいと思うかもしれません。しかし、私は正直言って本当に推測しています。可能であれば、すべてのクラスで大会が理にかなっていると思います。 –

1

はい、それはJava言語の仕様です...

1

理由は、これが慣例であること、です。また、クラスローダーは、特定のファイル内のクラスを予期します。この制限を回避するために、独自のクラスローダーを記述することはできますが、これを行う理由はありません。あなたのコードを見ている人は誰もが混乱します。 ;)

しかし、内部クラスを作成することで、1つのファイルに複数のクラスを作成できます。私はそれが同じではないことを知っていますが、通常、あなたは1つのファイルに1つのクラスしかないよりも重要なことについて考えるべきです。

+0

それは単なる慣習ではありません。これは、JLSで明示的に指定されているオプションの制限です。 –

0

コンパイラが依存クラスのソースコードを見つけることができるようにそこにあります。

0

@サラバナン。私は、デフォルトのクラス名でファイル名を保存すると、javaでmainメソッドを持つ単一のデフォルトクラス(つまりアクセス指定子を持たないクラス)がうまく動作することを示す簡単なプログラムをいくつか実行しました。

パブリッククラス名のファイルに名前を付ける理由を追加するために、ドキュメントでは、JVMがパブリッククラスを探すという状態を詳しく説明しました(制限がないため、どこからでもアクセス可能です) publicクラスのpublic static void main()を探します。

このパブリッククラスは、Javaアプリケーション(プログラム)のJVMインスタンスが開始される初期クラスとして機能します。プログラムで複数のパブリッククラスを提供する場合、コンパイラはエラーをスローすることによってユーザーを停止します。

これは、あとでpublic static void main(String args[])のパブリッククラスがJVMの初期クラスであるため、JVMを最初のクラスと混同することができないためです。

希望私は、JAVAプログラミングの命名法を理解するのを手伝ってくれました。

0

は、単純にそのクラスがメインの他のファイルは、それはすべての主流のJava実装(コンパイラ、JVMでは、IDEに、など)は、それを強制する(私の知る限り)オプションの制限ですが、

関連する問題