Javaプログラムに2つの主要なメソッドが存在できますか?
次のような彼らの議論の違いによってのみ:
public static void main(String[] args)
そして2番目は
public static void main(StringSecond[] args)
可能であれば、どの方法がエントリポイントとして使用されますか?これを識別する方法は?
ここではpublic static void main (String args[])
、名前を持つ単一のファイルに2つありTest.java
(具体的には、2つのクラス名のいずれかとしてファイルの名前を使用していません)、2つのクラスにはデフォルトのアクセス指定子が付いていることがわかります。
class Sum {
int add(int a, int b) {
return (a+b);
}
public static void main (String args[]) {
System.out.println(" using Sum class");
Sum a = new Sum();
System.out.println("Sum is :" + a.add(5, 10));
}
public static void main (int i) {
System.out.println(" Using Sum class main function with integer argument");
Sum a = new Sum();
System.out.println("Sum is :" + a.add(20, 10));
}
}
class DefClass {
public static void main (String args[]) {
System.out.println(" using DefClass");
Sum a = new Sum();
System.out.println("Sum is :" + a.add(5, 10));
Sum.main(null);
Sum.main(1);
}
}
コード Test.java をコンパイルすると、2 つの.class
ファイル (vizSum.class
とDefClass.class
) が生成されます。Test.java を実行すると、Test という名前のメイン クラスが見つからないため実行できません。代わりに、java Sum
またはjava DefClass
両方を行うと、異なる を使用して異なる出力が得られますmain()
。Sum クラスの main メソッドを使用するには、クラス名Sum.main(null)
またはSum.main(1)//Passing integer value in the DefClass main()
.
クラス スコープでは、クラスごとに 1 つのみ持つことができます。これは、クラスpublic static void main (String args[])
の静的メソッドがそのオブジェクトではなくクラスに属し、そのクラス名を使用して呼び出されるためです。複数のオブジェクトを作成し、それらを使用して同じ静的メソッドを呼び出したとしても、これらの呼び出しが参照する静的メソッドのインスタンスは同じになります。
メインで異なる引数のセットを渡すことにより、メイン メソッドのオーバーロードを行うこともできます。同様の例が上記のコードで提供されていますが、デフォルトでは、制御フローはpublic static void main (String args[])
を使用して呼び出したクラス ファイルの で開始されますjava classname
。他の一連の引数を使用してメイン メソッドを呼び出すには、他のクラスから明示的に呼び出す必要があります。
メソッドのパラメーター (数値 (または) 型) が異なる限り、可能です。これはオーバーロードと呼ばれます。
オーバーロードされたメソッドは、メソッドに渡される引数の数と型によって区別されます
public static void main(String[] args)
パラメータとして単一のString[]
(または)を持つメイン メソッドのみString...
が、プログラムのエントリ ポイントと見なされます。
public static void main(String[] args)
カウントのみ。これは、真の main() であると見なされる唯一の署名です (つまり、プログラムのエントリ ポイントとして)。
StringSecond
クラスである限り、それはコンパイル可能なコードです。ただし、「メインメソッド」がプログラムへの2番目のエントリポイントを意味する場合、質問に対する答えはまだノーです。最初のオプション ( public static void main(String[] args)
) のみが、プログラムへのエントリ ポイントになることができます。
ただし、main(String[])
別のクラス (ただし同じプロジェクト内) に 2 番目のメソッドを配置する場合は、プロジェクトへのエントリ ポイントが複数存在する可能性があり、そこから選択できることに注意してください。ただし、これはオーバーライドまたはオーバーロードの原則と矛盾することはありません。
また、特に初歩のプログラマーにとって、この分野での混乱の原因の 1 つは、public static void main(String[] args)
とpublic static void main(String ... args)
が両方ともエントリ ポイントとして使用され、同じメソッド シグネチャを持つものとして扱われることです。
main メソッドのシグネチャは、
public static void main(String[] args)
クラスは、main という名前の複数のメソッドを定義できます。これらのメソッドのシグネチャは、メイン メソッドのシグネチャと一致しません。署名が異なるこれらの他のメソッドは、「メイン」メソッドとは見なされません。
答えはノーだ; 「メイン」メソッドは 1 つしかありません。ここで、「メイン」は「実行」できるエントリ ポイントを意味します。
例のようにオーバーロードされたバージョンをコーディングできますが、「実行」することはできません。
1 つのプログラムに複数の main メソッドを含めることができます。しかし、JVM は常に String[] 引数の main() メソッドを呼び出します。他のメソッドはオーバーロードされたメソッドとして機能します。これらのオーバーロードされたメソッドは、明示的に呼び出す必要があります。
はい!Java の任意のクラスは、複数のメイン メソッドを持つことができます。これはオーバーロードと呼ばれます (オーバーロードされたメソッドは同じ名前のメソッドですが、署名が異なります) が、次のようなパラメーターを持つメイン メソッドは 1 つだけである必要があります:- (String[] args) または (String args[])
例:-public class E {
public static void main(String args){
System.out.println("Print A");
}
public static void main(String [] args){
System.out.println("Print B");
}
public static void main(int garbage){
System.out.println("Print C");
}
public static void main(int i){
System.out.println("Print D")
}
}
上記のプログラムの出力は「Print B」になります。Javac コンパイラによって識別された正しいメソッド シグネチャが含まれているのはメイン メソッドだけであり、それだけをコンパイルして残りを残すためです。
同じスコープ内に 2 つの main(String[] args) メソッドが存在する可能性があるため、JVM に混乱が生じます。それらをオーバーロードされたメソッドとして使用することはできません。したがって、パラメーターに関する署名は異なる必要があります。
Java バージョン 1.6.0_32 で複数のメイン メソッドが動作していることを確認しましたが、タイプ シグネチャの public static void main(String []args) のようなメイン メソッドが 1 つあるはずです。Exは私がテストしたものです。
public class mainoverload
{
public static void main(String a)
{
System.out.println("\nIts "+a);
}
public static void main(String args[])
{
System.out.println("\nIts public static void main\n");
mainoverload.main("Ankit");
mainoverload.main(15,23);
mainoverload.main(15);
}
public static void main(int a)
{
System.out.println("\nIts "+a);
}
public static void main(int a,int b)
{
System.out.println("\nIts "+a+" "+b);
}
}