Несколько методов main () в java

мне было интересно, что эффект создания дополнительных основных методов сделает с вашим кодом.

например,

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

после первоначального запуска программы будет создан foo, и внутри него будет другой общедоступный основной метод. Это вызовет какие-либо ошибки?

10 ответов


это не вызовет ошибок. Только потому, что ты!--5-->инициализации объект, не означает, что метод main выполняется. Java будет только первоначально вызывать основной метод переданного ему класса, например

>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, потому что вы явно вызываете метод main TestClass, который затем вызовет main метод снова, и снова, и снова, и снова....

когда сомневаетесь, просто проверьте его: -)


метод main является статическим, что означает, что он принадлежит к классу, а не объекту. Таким образом, объект не будет иметь другого основного метода внутри него вообще.

вы можете вызвать метод main на экземплярах объекта, но если вы это сделаете, это буквально еще один способ вызова TestClass.main () (и многие, включая меня, не одобряют вызов статического метода на экземпляре объекта в любом случае.)

Если вы ссылаетесь на несколько основных методов в одном и том же программа, тогда это тоже не проблема. Основной класс просто указан, и его основной метод выполняется для запуска программы (в случае файла jar это атрибут основного класса в файле манифеста.)


у него не будет дополнительного main-метод, as main is static. Так что один раз за класс.

если у вас есть несколько main-методы в вашем проекте вы укажете, какой из них запускать при запуске приложения.


Это прекрасно. Имея несколько main методы не вызывают никаких проблем. При первом запуске программы Java выполнение начинается в некоторые


после поиска класса 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 []) " для начала, а затем вы можете вызвать перегруженные основные методы внутри этого main, и он должен работать наверняка.

любые комментарии и предложения высоко ценятся. Я просто начинающий разработчик Java, готовый развивать свои навыки Java.

спасибо, PK


нет, вы можете иметь любое количество основных методов в проекте. Поскольку вы указываете, какой из них вы хотите использовать при запуске программы, это не вызывает конфликтов.


вы можете иметь только один основной метод в одном классе, но вы можете вызвать один основной метод другому явно

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

когда вы запускаете свой класс Java, он всегда будет искать подпись public static void main (String args []) в классе. Поэтому предположим, если вы вызываете аргумент командной строки, он будет искать сигнатуру метода в классе и не будет вызывать другое, пока 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. Поэтому, если класс te имеет точную подпись, их можно использовать в качестве отдельной точки входа для запуска приложения. Переходя к вашему вопросу, если вы удалите подпись, как это было сделано выше, изменив аргумент, если основной метод. он будет действовать как обычный метод.


это все о механизме выполнения JVM. Помните, вы пишете >java com.abc.MainClass в командной строке cmd.

Это все объясняет. Если метод main не найден здесь, он выдает ошибку времени выполнения: метод Main не найден в классе MainClass. Теперь, если метод main найден здесь, он действует как первая точка, когда счетчики программы должны сопоставить и начать выполнять инструкции. Затем загружаются ссылочные классы, а также могут вызываться ссылочные методы с использованием экземпляров, созданных внутри. Итак, main-это класс конкретно хоть один класс может иметь только один основной способ. Обратите внимание, что подпись основного метода никогда не меняется. вы можете иметь два перегруженных основных методов в одном классе, как

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

public static void main () {} / / перегружен в том же классе.

во время статической привязки исходный main разрешается и идентифицируется механизмом выполнения.


еще один интересный момент для рассмотрения-это случай, когда у вас есть два разных класса в файле 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 FirstClassMultiply и java SecondClass, не исходное имя файла файл.

обратите внимание на несколько дополнительных моментов:

  1. вы сможете работать SecondClass.class хотя это класс не был публичным в исходном файле!
  2. FirstClassMultiply перегрузка основной способ это нормально, но только точка входа к вашему prog будет основным методом с