Несколько методов main () в Java - PullRequest
12 голосов
/ 21 января 2011

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

Например,

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

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

Ответы [ 10 ]

35 голосов
/ 21 января 2011

Это не вызовет ошибок. То, что вы инициализируете объект, не означает, что основной метод выполняется. 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, потому что вы явно вызываете основной метод TestClass, который затем будет вызывать основной метод снова, и снова, и снова, и ....

Если сомневаешься, просто проверь: -)

10 голосов
/ 21 января 2011

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

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

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

7 голосов
/ 21 января 2011

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

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

5 голосов
/ 21 января 2011

Это прекрасно.Наличие нескольких main методов не вызывает никаких проблем.При первом запуске Java-программы выполнение начинается в некоторой функции с именем main в классе, указанном пользователем или файлом .jar.После запуска программы все остальные функции, называемые main, по существу игнорируются или обрабатываются как другие функции.

4 голосов
/ 20 ноября 2011

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

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

Спасибо, PK

3 голосов
/ 21 января 2011

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

1 голос
/ 18 апреля 2015

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

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);
    }
}
0 голосов
/ 03 апреля 2017

Еще один интересный момент для рассмотрения - это случай, когда у вас есть два разных класса в 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 перегрузка основного метода из совершенно нормально , но единственная точка входа для вашей программы будет основным методом с аргументом String args[].
0 голосов
/ 14 марта 2017

Все дело в двигателе исполнения JVM. Помните, что вы пишете >java com.abc.MainClass в командной строке.

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

public static void main (аргументы String []) {}

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

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

0 голосов
/ 28 декабря 2014

при запуске вашего Java-класса он всегда будет искать сигнатуру public static void main (String args []) в классе.Поэтому предположим, что если вы вызываете с помощью аргумента командной строки , он будет искать метод Signature в классе и не будет вызывать другой до тех пор, пока вы явно не вызовете его по имени класса.* Но когда вы попробуете то же самое из eclipse , он спросит, какой класс компилировать.Означает MainMethod1 или Mainmethod2.Поэтому, если у класса есть точная подпись, его можно использовать как отдельную точку входа для запуска приложения.Переходя к вашему вопросу, если вы удалите подпись, как вы сделали выше, изменив аргумент метода main. Он будет действовать как обычный метод .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...