简体   繁体   中英

Multiple main() methods in java

I was wondering what the effect of creating extra main methods would do to your code.

For example,

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

After the program initially starts up, foo will be created and it would have another public main method inside it. Will that cause any errors?

It will cause no errors. Just because you initialize an object, doesn't mean the main method gets executed. Java will only initially call the main method of the class passed to it, like

>java TestClass

However , doing something like:

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

Or

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();
 }
}

That would cause a StackOverflowError , because you are explicitly calling TestClass's main method, which will then call the main method again, and again, and again, and....

When in doubt, just test it out :-)

The main method is static, which means it belongs to the class rather than the object. So the object won't have another main method inside it at all.

You could call the main method on instances of the object, but if you do that it's literally just another way of calling TestClass.main() (and it's frowned upon by many, including me, to call a static method on an instance of an object anyway.)

If you're referring to multiple main methods in the same program, then this isn't a problem either. The main class is simply specified and its main method is executed to start the program (in the case of a jar file this is the main-class attribute in the manifest file.)

It won't have an additional main -method, as main is static . So it's once per class.

If you have multiple main -methods in your project, you will specify which one to launch when starting your application.

This is perfectly fine. Having multiple main methods doesn't cause any problems. When you first start a Java program, execution begins in some function called main in a class specified by the user or by the .jar file. Once the program has started running, all the other functions called main are essentially ignored or treated like other functions.

After searching for a Java Class with multiple main() methods or in plain words, overloaded main() methods, I came up with an example of my own. Please have a look

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()");
  }

}

I tested this Java Code on JDK 1.7 and works like a charm !

You need "public static void main(String args[])" to start with and then you can call overloaded main methods inside this main and it should work for sure.

Any comments and suggestion are highly appreciated. I am just a novice Java Developer willing to develop my Java skills.

Thanks, PK

No, you can have any number of main-methods in a project. Since you specify which one you want to use when you launch the program it doesn't cause any conflicts.

You can have only one main method in one class, But you can call one main method to the another explicitly

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);
    }
}

when you run your Java class it will always look for the signature in the class. So suppose if you invoking by , it will look for the method Signature in the class and will not invoke other until if u explicitly inoke it by its class name. 调用,它将在类中查找Signature方法,并且除非您通过其类名明确地将其引入,否则不会调用其他方法。

 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");
  }
 }

But when you try the same from it will ask for which class to compile. 尝试相同的 ,它将要求编译哪个类。 Means MainMethod1 or Mainmethod2. So if te class has the exact signature they can be used as individual entry point to start the application. Coming to your question, If you remove the signature as u did above by changing the argument if main method. .

It is all about the execution engine of JVM. Remember, you write >java com.abc.MainClass on cmd prompt.

It explains everything. If main method is not found here it throws a run time Error:Main Method Not Found in class MainClass. Now if main method is found here, it acts as the first point when Program Counters have to map and start executing the instructions. Referred classes are loaded then, referred methods may be called using the instances created inside. So, main is class specific though one class can have only one main method. Please note, main method's signature never changes. You can have two overloaded main methods in same class , like

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

public static void main() {} //overloaded in same class.

During Static binding, the original main is resolved and identified by execution engine.

Another interesting point to consider is a case where you have two different classes in of java file.

For example, you have Java file with two classes:

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);
    }
}

Compiling it with javac FirstClassMultiply.java will generate two .class files, first one is FirstClassMultiply.class and second one is SecondClass.class

And in order to run it you will need to do it for the generated .class files: java FirstClassMultiply and java SecondClass , not the original filename file.

Please note a couple of additional points:

  1. You will be able to run SecondClass.class although it's class wasn't public in the original file!
  2. FirstClassMultiply overloading of the main method of is totally fine , but, the only entry point to your prog will be the main method with String args[] argument.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM