複数のクラスを含むJavaファイルがあり、そのうちの1つはパブリックです。mainメソッドが非パブリッククラス内にある場合。そのJavaファイルを実行できません。何故ですか?コンパイルエラーもありません。もしそうなら、どうすればそのメインメソッドを使用できますか?
7 に答える
このコードを見てください:
Super.java
public class Super{ }
class Sub{
public static void main(String[] s){
System.out.println("Hello");
}
}
印刷するには、次Hello
のようにプログラムをコンパイルして実行できます。
これはどのように機能しますか?
コンパイラ.class
は、プログラム内のクラスごとに個別のファイルを生成します。main()
したがって、パブリック クラスから非パブリック クラスを呼び出す代わりに、main()
上記のように出力を出力できます。
注:public class
規則にあるように、 aを別のファイルに配置する必要があります<class_name>.java
。また、1 つのファイルに複数のクラスを入れないでください (内部クラスの場合を除く)。それらをインポートしたり、他のクラスで使用したりすると、問題が発生します。
追加したいことがありますが、クラスのメインにはパブリックが必要であり、メインなしでは機能しないと誰もが信じています
1 つのクラスに必要な数のメインを含めることができ、パブリック アクセス修飾子なしでそれらを含めることができます。ただし、ファイルにちなんで名付けられたクラスのみをパブリックにできることに注意してください。つまり、ファイルにa.javaという名前を付けた場合、 a.java という名前のクラスのみをパブリックにすることができ、他の誰もこの機能を持つことはできません。
これを示すコードは次のとおりです。ファイルの名前がhelp.javaであることがわかります
//:initialization/helping.java
class b{
public static void main(){
System.out.println("hello its b");
}
}
class helping {
static void f(float i, Character... c) {
System.out.println("first");
}
static void f(char a, Character... args) {
System.out.println("second");
}
public static void main(String[] args) {
f(1,'a');
f('a','b');
c.main();
}
}
class c{
public static void main(){
System.out.println("hello its b");
}
}
//:~
/*
* output:
* first
* second
* hello its b
* */
簡単な答え。You can't
. a に main メソッドが必要でありpublic class
、その署名はpublic static void main(String... args)
コンパイルエラーはありません
なぜあるのでしょうか?コンパイル規則に関する限り、あなたは何も悪いことをしていません。唯一のことはnon-public-class-main-method
、コードのエントリ ポイントとして機能しないことです。
最上位の型宣言に、protected、private、または static のいずれかのアクセス修飾子が含まれていると、コンパイル エラーになります。このリンクが役立つ場合があります。
トップレベルの型宣言を保護、静的、またはプライベートにするべきではないと述べたように、これはコンパイル時エラーではありません。
リンクhttp://docs.oracle.com/javase/specs/jls/se7/html/jls-7.html#jls-7.6をよく参照すると、トップがレベルの型宣言は「トップレベルのクラスとインターフェイスの型宣言」のみを指し、これらはトップレベルの宣言で保護、静的、またはプライベートであってはなりませんが、その中の任意のメソッドまたは変数宣言に保護、静的、またはプライベートを使用できます。
上記のコードに関しては、宣言に問題はなく、すべての外側の最上位クラスがデフォルトで違反がないため、コードは正常にコンパイルおよび実行されます。
一番上にある質問に対する答えは、一番上の少数の専門家が述べたとおりです。
「確かに、非パブリック クラス内にメイン メソッドを含むファイルを含めることができ、正常にコンパイルおよび実行されますが、プログラムの実行時に「メイン メソッド」のクラス名を渡さなければならないことを確認してくださいpublic であるクラスの代わりに Java インタープリターを使用します。」
A(public) と B(main メソッドを含む非パブリック) の 2 つのクラスがある場合、ファイルは "javac A.java" でコンパイルされますが、コードの実行中にコマンドを "java B" として渡す必要があります。
あなたは確かにmainメソッドをオーバーライドすることができ、それはコンパイラのルールに違反しないので、コンパイラエラーは発生しません。
複数のクラスがあるにもかかわらず、パブリックとして宣言されているファイルが実行しようとしているファイルの名前であることを確認します。
これは、そのコードで公開されている同じクラスにちなんでファイルに名前を付ける必要があるという規則です。
したがって、そのクラスを実行しようとすると、実行を開始するメインメソッドがありません。したがって、非パブリッククラスでメインメソッドを実行する場合、これを行う唯一の方法は、メインメソッドのメインメソッドからそのメインを呼び出すことです。パブリッククラス。