2011-01-20 5 views
11

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

Например,

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

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

ответ

32

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

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

+0

Мудрые слова: D Спасибо! – guy8214

5

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

+0

Я думаю, что ОП спрашивает, воссозданы ли основные методы каждый раз, когда объект этого класса создается, а не имеет несколько объявленных основных методов в той же области. – berry120

+0

Я думаю, это можно интерпретировать в любом случае, и оба объяснения полезны. Просто мое мнение, конечно. – duffymo

+0

Справедливо, я согласен, что оба объяснения полезны в любом случае. Это как раз то, как я впервые прочитал :-) – berry120

3

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

+0

_if У меня есть несколько основных_ **, как указать, какой из них использовать первым? ** –

6

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

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

10

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

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

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

4

После поиска 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

+0

Я тоже пробовал что-то вроде этого. _ Даже если у нас есть несколько основных методов, но главный метод с аргументом (String args []) выполняется first_. ** Есть ли способ сначала запустить другой основной метод? ** –

+1

@RishabhAgarwal Ваша среда выполнения Java ищет * основной метод с помощью (String args []) * при загрузке вашего класса с основным методом. Я не знаю ни одного механизма, чтобы его переопределить. – realPK

0

при запуске класса Java, он всегда будет искать для подписи государственной статической силы основных (String арг []) в классе. Предположим, что если вы вызываете аргумент командной строки , он будет искать метод Signature в классе и не будет вызывать другого до тех пор, пока u не будет явно inoke его именем класса.

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 class имеет точную подпись, они могут использоваться как отдельная точка входа для запуска приложения. Приходит к вашему вопросу, если вы удалили подпись, как и вы сделали, изменив аргумент, если основной метод. Он будет действовать как обычный метод.

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

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

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

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

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

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

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 FirstClassMultiply и java SecondClass, а не исходный файл файла.

Пожалуйста, обратите внимание, пару дополнительных очков:

  1. Вы сможете запустить SecondClass.class хотя это класс не был публичным в оригинальном файле!
  2. FirstClassMultiplyoverloading основного метода от того, является совершенно нормально, но, то только точка входа на ваш прог будет основным методом с String args[] аргументом.
Смежные вопросы