web-dev-qa-db-ja.com

javaの複数のmain()メソッド

追加のメインメソッドを作成すると、コードにどのような影響があるのでしょうか。

例えば、

public class TestClass {
    public static void main (String[] args){
        TestClass foo = new TestClass();
    }
}

プログラムが最初に起動した後、fooが作成され、その中に別のpublic mainメソッドが含まれます。エラーが発生しますか?

12
guy8214

エラーは発生しません。 initializeオブジェクトであっても、メインメソッドが実行されるわけではありません。 Javaは、最初に、それに渡されたクラスのmainメソッドのみを呼び出します。

>Java TestClass

ただし、次のようなことをします:

public class TestClass
{
 public static void main (String[] args)
 {
  TestClass foo = new TestClass();
  foo.main(args);
 }
}

または

public class TestClass
{
 public TestClass()
 {
   //This gets executed when you create an instance of TestClass
   main(null);
 }

 public static void main (String[] args)
 {
  TestClass foo = new TestClass();
 }
}

ThatStackOverflowErrorを引き起こします。これは、TestClassのmainメソッドを明示的に呼び出しているため、mainメソッドが再度呼び出され、もう一度、そして....

疑わしいときは、テストしてください:-)

35
Zach L

メインメソッドは静的です。つまり、オブジェクトではなくクラスに属しています。そのため、オブジェクトには内部に別のメインメソッドがまったくありません。

オブジェクトのインスタンスでmainメソッドを呼び出すこともできますが、これを行うと、文字通りTestClass.main()を呼び出す別の方法になります(そして、私を含む多くの人が、とにかくオブジェクト。)

同じプログラムで複数のメインメソッドを参照している場合、これも問題ではありません。メインクラスは単純に指定され、そのmainメソッドが実行されてプログラムが開始されます(jarファイルの場合、これはマニフェストファイルのメインクラス属性です)。

10
Michael Berry

mainmainであるため、追加のstaticメソッドはありません。クラスごとに1回です。

プロジェクトに複数のmain- methodsがある場合、アプリケーションの起動時に起動するメソッドを指定します。

7
MicSim

これはまったく問題ありません。複数のmainメソッドがあっても問題は発生しません。 Javaプログラムを初めて起動すると、ユーザーまたは.jarファイルで指定されたクラスのmainと呼ばれるsome関数で実行が開始されます。プログラムが実行を開始すると、mainと呼ばれる他のすべての関数は基本的に無視されるか、他の関数と同様に扱われます。

5
templatetypedef

Java複数のmain()メソッドを含むクラス、または簡単に言えば、多重定義されたmain()メソッドを検索した後、私は自分のサンプルを思いつきました。ぜひご覧ください。

public class MultipleMain{

  public static void main(String args[]){
      main(1);
      main('c');
      main("MyString");
  }

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

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

}

私はこれをテストしましたJava JDK 1.7のコードで、魅力のように動作します!

最初に「public static void main(String args [])」が必要であり、このメイン内でオーバーロードされたメインメソッドを呼び出すことができ、確実に機能するはずです。

コメントや提案は大歓迎です。私は初心者ですJava開発者は自分のJavaスキルを開発する用意があります。

ありがとう、PK

4
realPK

いいえ、プロジェクトには任意の数のメインメソッドを含めることができます。プログラムを起動するときに使用するものを指定するため、競合は発生しません。

3
Emil H

1つのクラスに含めることができるメインメソッドは1つだけですが、あるメインメソッドを別のクラスに明示的に呼び出すことができます。

class Expmain
{
    public static void main(String[] ar)
    {
        System.out.println("main 1");
    }
}

class Expmain1
{
    public static void main(String[] ar)
    { 
        System.out.println("main 2");
        Expmain.main(ar);
    }
}
1
Varun Vashista

Java=クラスを実行すると、常に署名を探します public static void main(String args []) クラスで。だから、あなたが コマンドライン引数、それはクラスでメソッドSignatureを探し、uがクラス名で明示的にそれを呼び出すまで、他を呼び出しません。

 class MainMethod1{
 public static void main(String[] ags){
   System.out.println("Hi main 1");
   testig2 y = new testig2();
//in this case MainMethod1 is invoked/.......
 // String[] a = new String[10];
 // testig2.main(a);
  }

 }   
 class MainMethod2{
   public static void main(String[] ags){
   System.out.println("Hi main 2");
  }
 }

しかし、同じことをしようとすると 日食 コンパイルするクラスを尋ねます。 MainMethod1またはMainmethod2を意味します。したがって、クラスに正確なシグネチャがある場合、それらはアプリケーションを起動するための個別のエントリポイントとして使用できます。あなたの質問に来て、もしあなたがメインメソッドifの引数を変更することで上記のように署名を削除した場合 通常の方法として機能します

0
vinod bazari

考慮すべきもう1つの興味深い点は、Javaファイルに2つの異なるクラスがある場合です。

たとえば、2つのクラスを含むJavaファイルがあります。

public class FirstClassMultiply {

    public static void main (String args[]){
        System.out.println("Using FirstClassMultiply");
        FirstClassMultiply mult = new FirstClassMultiply();
        System.out.println("Multiple is :" + mult.multiply(2, 4));
    }
    public static void main (int i){
        System.out.println("Using FirstClassMultiply with integer argument");
        FirstClassMultiply mult = new FirstClassMultiply();
        System.out.println("Multiply is :" + mult.multiply(2, 5));
    }

    int multiply(int a, int b) {
        return (a * b);
    }
}

class SecondClass {

    public static void main(String args[]) {
        System.out.println("Using SecondClass");

        FirstClassMultiply mult = new FirstClassMultiply();
        System.out.println("Multiply is :" + mult.multiply(2, 3));

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

javac FirstClassMultiply.Javaでコンパイルすると、2つの.classファイルが生成されます。1つ目はFirstClassMultiply.classで、2つ目はSecondClass.classです。

そしてそれを実行するには、生成された.classファイル:Java FirstClassMultiplyJava SecondClassに対して実行する必要があります。元のファイル名ファイルではありません。

いくつかの追加の点に注意してください:

  1. 元のファイルではクラスは公開されていませんでしたが、SecondClass.classを実行できます!
  2. FirstClassMultiplyoverloading のメインメソッドのは完全に細かいが、progへのエントリポイントのみが、String args[]引数を持つメインメソッドになります。
0
Johnny

それはすべてJVMの実行エンジンに関するものです。覚えておいてください、あなたは>Java com.abc.MainClass on cmdプロンプト。

それはすべてを説明します。ここでmainメソッドが見つからない場合は、ランタイムクラスError:Main Method Not Found in class MainClassがスローされます。ここでmainメソッドが見つかった場合、プログラムカウンターがマップして命令の実行を開始する最初のポイントとして機能します。参照されたクラスがロードされ、内部で作成されたインスタンスを使用して参照されたメソッドが呼び出されます。したがって、メインはクラス固有ですが、1つのクラスはメインメソッドを1つしか持つことができません。メインメソッドのシグネチャは変更されないことに注意してください。 同じクラスで2つのオーバーロードされたメインメソッドを持つことができますのように

public static void main(String [] args){}

public static void main(){} //同じクラスでオーバーロードされます。

静的バインディング中、元のメインは解決され、実行エンジンによって識別されます。

0
hi.nitish