java中的多个main()方法

时间:2011-01-20 23:56:50

标签: java methods main

我想知道创建额外主要方法会对您的代码产生什么影响。

例如,

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

程序最初启动后,将创建foo,并在其中包含另一个公共main方法。这会导致任何错误吗?

10 个答案:

答案 0 :(得分:35)

它不会导致错误。仅仅因为你初始化一个对象,并不意味着主方法被执行。 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();
 }
}

会导致StackOverflowError,因为你明确地调用了TestClass的main方法,然后再次调用main方法,再次,再次调用.... / p>

如果有疑问,只需测试一下: - )

答案 1 :(得分:10)

main方法是static,这意味着它属于类而不是对象。所以对象根本就没有其他主要方法。

你可以在对象的实例上调用main方法,但是如果你这样做,它实际上只是调用TestClass.main()的另一种方式(并且包括我在内的许多人不赞成调用静态方法)无论如何,对象的实例。)

如果您在同一个程序中引用多个主要方法,那么这也不是问题。简单地指定主类,并执行其主要方法来启动程序(在jar文件的情况下,这是清单文件中的main-class属性。)

答案 2 :(得分:7)

它不会有额外的main - 方法,因为mainstatic。所以每节课一次。

如果项目中有多个main - 方法,您将在启动应用程序时指定要启动的方法。

答案 3 :(得分:5)

这很好。使用多个main方法不会导致任何问题。首次启动Java程序时,执行从用户指定的类中的某些函数main或.jar文件开始。程序开始运行后,所有其他名为main的函数基本上都被忽略或被视为与其他函数一样。

答案 4 :(得分:4)

在搜索具有多个main()方法的Java类或简单的单词,重载的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()");
  }

}

我在JDK 1.7上测试了这个Java代码并且像魅力一样工作!

你需要“public static void main(String args [])”来开始,然后你可以在这个main中调用重载的main方法,它应该可以正常工作。

任何评论和建议都非常感谢。我只是一个愿意开发Java技能的Java开发人员。

谢谢, PK

答案 5 :(得分:3)

不,您可以在项目中拥有任意数量的主要方法。由于您在启动程序时指定了要使用的那个,因此不会引起任何冲突。

答案 6 :(得分:1)

一个类中只能有一个main方法,但是你可以将一个main方法显式调用另一个方法

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

答案 7 :(得分:0)

当您运行Java类时,它将始终在类中查找签名 public static void main(String args [])。因此,假设您通过命令行参数进行调用,它将在类中查找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");
  }
 }

但是当你从 eclipse 尝试相同的时候,它将要求编译哪个类。表示MainMethod1或Mainmethod2。因此,如果te类具有确切的签名,则可以将它们用作启动应用程序的单独入口点。  回到你的问题,如果你通过改变主要方法的参数来删除上面的签名。它将作为一种常规方法

答案 8 :(得分:0)

所有关于JVM的执行引擎。请记住,您在cmd提示符下写了>java com.abc.MainClass

它解释了一切。如果在此处找不到main方法,则会抛出运行时错误:MainClass类中找不到主方法。 现在,如果在此处找到main方法,它将作为程序计数器必须映射并开始执行指令时的第一个点。然后加载引用的类,可以使用在里面创建的实例调用引用的方法。因此,main是类特定的,尽管一个类只能有一个main方法。 请注意,main方法的签名永远不会改变。 你可以在同一个类中有两个重载的主方法,比如

  

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

     

public static void main(){} //在同一个类中重载。

在静态绑定期间,原始主要由执行引擎解析和识别。

答案 9 :(得分:0)

另一个需要考虑的有趣点是java文件中有两个不同的类。

例如,您有两个类的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进行编译会生成两个.class个文件,第一个为FirstClassMultiply.class,第二个为SecondClass.class

为了运行它,您需要为生成的.class文件执行此操作:java FirstClassMultiplyjava SecondClass,而不是原始文件名文件。

请注意几点:

  1. 您可以运行SecondClass.class虽然它在原始文件中没有公开上课!
  2. FirstClassMultiply overloading主要方法 是完全正常,但唯一的入口点到您的编程 将是String args[]参数的主要方法。