web-dev-qa-db-ja.com

Javaプログラムに2つの主要なメソッドがありますか?

Javaプログラムに2つの主要なメソッドが存在しますか?引数の違いによってのみ:

public static void main(String[] args)

そして2つ目は

public static void main(StringSecond[] args)

可能であれば、どのメソッドがエントリポイントとして使用されますか?これを識別する方法は?助けてください。

29
joey rohan

メソッドのパラメーター(数値(または)タイプ)が異なる限り、可能です。 オーバーロード と呼ばれます。

オーバーロードされたメソッドは、メソッドに渡される引数の数とタイプによって区別されます

public static void main(String[] args)

パラメーターとして単一のString[](または)String...を持つmainメソッドのみが、プログラムのエントリポイントと見なされます。

25
kosa

ここで、名前_Test.Java_(特に2つのクラス名のいずれかとしてファイル名を使用しなかった)を持つ単一のファイルに2つのpublic static void main (String args[])があり、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_ファイル(つまり_Sum.class_および_DefClass.class_)が生成されます。Test.Javaを実行すると、見つからないため実行できません。 Testという名前のメインクラス。代わりに_Java Sum_または_Java DefClass_を実行すると、両方とも異なるmain()を使用して異なる出力を提供します。 Sumクラスのメインメソッドを使用するには、クラス名Sum.main(null)またはSum.main(1)//Passing integer value in the DefClass main()を使用できます。

クラススコープでは、クラスごとにpublic static void main (String args[])を1つだけ持つことができます。クラスの静的メソッドは、オブジェクトではなくクラスに属し、クラス名を使用して呼び出されるためです。複数のオブジェクトを作成し、それらを使用して同じ静的メソッドを呼び出す場合でも、これらの呼び出しが参照する静的メソッドのインスタンスは同じになります。

Mainに異なる引数セットを渡すことで、mainメソッドのオーバーロードを行うこともできます。上記のコードでは同様の例が提供されていますが、デフォルトでは、制御フローは_Java classname_を使用して呼び出したクラスファイルのpublic static void main (String args[])で始まります。メインメソッドを他の引数セットで呼び出すには、他のクラスから明示的に呼び出す必要があります。

25
Swarish

1つのプログラムに複数のメインメソッドがある場合があります。その他はオーバーロードされたメソッドです。このオーバーロードされたメソッドは、単一のメインメソッドで正常に動作します

public class MainMultiple{

   public static void main(String args[]){
       main(122);
       main('f');
       main("hello Java");
   }

   public static void main(int i){
       System.out.println("Overloaded main()"+i);
   }

   public static void main(char i){
       System.out.println("Overloaded main()"+i);
   }

   public static void main(String str){
       System.out.println("Overloaded main()"+str);
   }
}
7
Ram Sharma

StringSecondがクラスである限り、それはコンパイル可能なコードになります。ただし、「メインメソッド」でプログラムへの2番目のエントリポイントを意味する場合、あなたの質問への答えはまだいいえです。最初のオプション(public static void main(String[] args))のみがプログラムへのエントリポイントになります。

ただし、2つ目のmain(String[])メソッドを別のクラスに(ただし同じプロジェクトに)配置する場合、プロジェクトから選択できる複数のエントリポイントを作成できることに注意してください。しかし、これはオーバーライドまたはオーバーロードの原則と矛盾することはできません。

また、この領域における混乱の原因の1つは、特に入門プログラマにとって、public static void main(String[] args)public static void main(String ... args)が両方ともエントリポイントとして使用され、同じメソッドシグネチャを持つものとして扱われることです。

5
asteri

public static void main(String[] args)のみがカウントされます。これは、真のmain()と見なされる唯一の署名です(プログラムのエントリポイントとして)。

4
dashrb

Javaでは、クラスごとにonepublic static void main(String[] args)のみを使用できます。つまり、プログラムに複数のクラスがある場合、各クラスはpublic static void main(String[] args)を持つことができます。詳細については [〜#〜] jls [〜#〜] を参照してください。

3
1ac0

はい、好きなだけメインメソッドを使用できます。オーバーロードと呼ばれるmain(String[])とは異なるシグネチャを持つメインメソッドを持つことができ、JVMはそれらのメインメソッドを無視します。

public class TwoMain {
    public static void main(String args1[])
    {
        System.out.println("First main");
    }

    public static void main(String args2[])
    {
        System.out.println("Second main");
    }
}
1
Santanu Barik

Mainメソッドの署名は

public static void main(String[] args) 
  • パラメータの名前は任意の有効な名前にすることができます
  • 静的キーワードと公開キーワードの位置は交換できます
  • 文字列配列は可変引数構文も使用できます

クラスは、mainという名前の複数のメソッドを定義できます。これらのメソッドの署名は、メインメソッドの署名と一致しません。署名が異なるこれらの他のメソッドは、「メイン」メソッドとは見なされません。

1

はい、同じプログラムに2つのmain()を含めることができます。たとえば、次のようなクラスDemo1がある場合。このファイルをコンパイルすると、Demo1.classファイルが生成されます。そして、これを実行すると、デフォルトでString引数の配列を持つmain()が実行されます。 int引数を使用してmain()を探知することすらしません。

class Demo1 {   
static int a, b;    
public static void main(int args) {
     System.out.println("Using Demo1 class Main with int arg");
     a =30;
     b =40;
     System.out.println("Product is: "+a*b);
 }
public static void main(String[] args) {
      System.out.println("Using Demo1 class Main with string arg");
      a =10;
      b =20;
      System.out.println("Product is: "+a*b);

 }
 }      

Output:
Using Demo1 class Main with string arg
Product is: 200

しかし、Anonymという名前の別のクラスを追加して、ファイルをAnonym.Javaとして保存するとします。この中で、Demo1クラスをmain()[int引数または文字列引数のいずれか]と呼びます。このコンパイル後、Anonym.classファイルが生成されます。

class Demo1 {   
    static int a, b;    
public static void main(int args) {
    System.out.println("Using Demo1 class Main with int arg");
    a =30;
    b =40;
    System.out.println("Product is: "+a*b);
}
public static void main(String[] args) {
    System.out.println("Using Demo1 class Main with string arg");
     a =10;
     b =20;
     System.out.println("Product is: "+a*b);        
} 
}       

class Anonym{
public static void main(String arg[])
{

    Demo1.main(1);
    Demo1.main(null);
}
}


Output:
Using Demo1 class Main with int arg
Product is: 1200
Using Demo1 class Main with string arg
Product is: 200
1
BIJAY

ファイル「Locomotive.Java」内の以下のコードは、コンパイルおよび正常に実行され、実行結果が表示されます

2<SPACE>

上記の投稿で述べたように、mainメソッドではオーバーロードルールは引き続き機能します。ただし、エントリポイントは有名なpsvm(public static void main(String [] args))

public class Locomotive {
    Locomotive() { main("hi");}

    public static void main(String[] args) {
        System.out.print("2 ");
    }

    public static void main(String args) {
        System.out.print("3 " + args);
    }
}
0
Nash

はい! Javaの任意のクラスは複数のメインメソッドを持つことができます。オーバーロード(オーバーロードされたメソッドは同じ名前で異なるシグネチャを持つメソッド)と呼ばれます)次のようなパラメータを使用:-(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コンパイラによって識別される正しいメソッドシグネチャを含み、それだけをコンパイルして残りを残すためです。

0
Ramesh Pandey

答えはいいえだ; 「main」メソッドは1つしかありません。「main」は、「実行」できるエントリポイントを意味します。

例のようにオーバーロードされたバージョンをコーディングできますが、「実行」することはできません。

0
Bohemian

答えは「はい」ですが、次の3つの点を考慮する必要があります。

  1. 2つのメインメソッドパラメーターが同じであってはなりません

    例えば。

    • public static void main(int i)
    • public static void main(int i, int j)
    • public static void main(double j)
    • public static void main(String[] args)
  2. Javaの実際のメインメソッドは(String[] args)のメソッドです。したがって、実際の実行はpublic static void main(String [] args)から開始されるため、(String[] args)のメインメソッドは、子クラスではありません。

  3. 他のメインメソッドを実行するには、(String[] args)メインメソッド内から呼び出す必要があります。

同じことについての詳細なビデオはこちらです: https://www.youtube.com/watch?v=Qlhslsluhg4&feature=youtu.be

0
Charan Raj

同じスコープ内の2つのmain(String [] args)メソッドの可能性により、JVMに混乱が生じます。それらをオーバーロードメソッドとして使用することはできません。そのため、パラメータの観点からの署名は異なる必要があります。

0

1つのプログラムに複数のメインメソッドがある場合があります。ただし、JVMは常にString []引数のmain()メソッドを呼び出します。他のメソッドはオーバーロードメソッドとして機能します。これらのオーバーロードされたメソッドは、明示的に呼び出す必要があります。

0
Shashank Rimza