2011-01-20 5 views
11

Je me demandais quel serait l'effet de la création de méthodes principales supplémentaires sur votre code.Plusieurs méthodes main() dans java

Par exemple,

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

Après le démarrage du programme initialement jusqu'à, foo sera créé et il aurait une autre méthode publique principale à l'intérieur. Cela causera-t-il des erreurs?

Répondre

32

Cela ne provoquera aucune erreur. Tout simplement parce que initialise un objet, ne signifie pas que la méthode principale est exécutée. Java n'appeler d'abord la principale méthode de la classe qui lui est passé, comme

>java TestClass

Cependant, faire quelque chose comme:

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

Ou

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

Ce provoquerait un StackOverflowError, parce que vous êtes exp appelant licitement principale méthode de TestClass, qui sera ensuite appeler la méthode principale encore, et encore, et encore, et ....

En cas de doute, testez juste sur :-)

+0

Mots sages: D Merci! – guy8214

5

Ceci est parfaitement bien. Avoir plusieurs méthodes main ne pose aucun problème. Lorsque vous démarrez un programme Java pour la première fois, l'exécution commence en par une fonction appelée main dans une classe spécifiée par l'utilisateur ou par le fichier .jar. Une fois que le programme a démarré, toutes les autres fonctions appelées main sont essentiellement ignorées ou traitées comme les autres fonctions.

+0

Je pense que le PO demande si les méthodes principales sont recréées chaque fois qu'un objet de cette classe est instancié plutôt que d'avoir plusieurs méthodes principales déclarées dans la même portée. – berry120

+0

Je pense qu'il pourrait être interprété de toute façon, et avoir les deux explications est utile. Juste mon avis bien sûr. – duffymo

+0

Assez juste, je suis d'accord avoir les deux explications est utile de toute façon. C'est comme ça que je l'ai lu pour la première fois :-) – berry120

3

Non, vous pouvez avoir un nombre quelconque de méthodes principales dans un projet. Puisque vous spécifiez celui que vous voulez utiliser lorsque vous lancez le programme, cela ne provoque aucun conflit.

+0

_si j'ai plusieurs main_ ** comment spécifier lequel utiliser en premier? ** –

6

Il n'aura pas de main -méthode supplémentaire, car main est static. Donc c'est une fois par classe.

Si vous avez plusieurs méthodes main dans votre projet, vous devrez spécifier lequel lancer au démarrage de votre application.

10

La méthode principale est statique, ce qui signifie qu'elle appartient à la classe plutôt qu'à l'objet. L'objet n'aura donc pas du tout une autre méthode principale. Vous pouvez appeler la méthode principale sur les instances de l'objet, mais si c'est le cas c'est littéralement une autre façon d'appeler TestClass.main() (et il est mal vu par beaucoup, y compris moi, d'appeler une méthode statique sur Une instance d'un objet de toute façon.)

Si vous faites référence à plusieurs méthodes principales dans le même programme, alors ce n'est pas un problème non plus. La classe principale est simplement spécifiée et sa méthode principale est exécutée pour démarrer le programme (dans le cas d'un fichier jar, il s'agit de l'attribut main-class du fichier manifeste.)

4

Après la recherche d'un Java Classe avec plusieurs méthodes main() ou en mots simples, les méthodes main() surchargées, je suis venu avec un exemple de la mienne.S'il vous plaît jeter un oeil

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

}

Je l'ai testé ce code Java sur JDK 1.7 et fonctionne comme un charme!

Vous devez "public static void principal (String args [])" pour commencer, puis vous pouvez appeler des méthodes principales surchargées à l'intérieur de cette main et cela devrait fonctionner à coup sûr.

Tous les commentaires et suggestions sont très appréciés. Je suis juste un développeur Java novice prêt à développer mes compétences Java.

Merci, PK

+0

J'ai aussi essayé quelque chose comme ça. _Même si nous avons plusieurs méthodes principales mais la méthode principale avec argument (String args []) est exécutée first_. ** Existe-t-il un moyen d'exécuter une autre méthode principale en premier? ** –

+1

@RishabhAgarwal Votre exécution Java recherche la méthode * principale avec (String args []) * lorsque votre classe avec la méthode principale est chargée. Je ne suis au courant d'aucun mécanisme pour le contourner. – realPK

0

lorsque vous exécutez votre classe Java, il sera toujours chercher la signature public static void main (String args []) dans la classe. Supposons donc que si vous invoquez par l'argument de la ligne de commande, il recherchera la méthode Signature dans la classe et n'invoquera pas other tant que vous ne l'avez pas explicitement nommé par son nom de classe.

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

Mais lorsque vous essayez même de éclipse il demandera quelle classe de compiler. Signifie MainMethod1 ou Mainmethod2. Donc, si la classe a la signature exacte, ils peuvent être utilisés comme point d'entrée individuel pour démarrer l'application. En arrivant à votre question, Si vous supprimez la signature comme vous l'avez fait ci-dessus en changeant l'argument si méthode principale. Il agira comme une méthode normale.

1

Vous pouvez avoir qu'une seule méthode principale dans une classe, mais vous pouvez appeler une méthode principale pour l'autre explicitement

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

Il est tout au sujet du moteur d'exécution de la machine virtuelle Java. Rappelez-vous, vous écrivez >java com.abc.MainClass sur l'invite cmd.

Il explique tout. Si la méthode principale n'est pas trouvée ici, elle lance un temps d'exécution Error: Main Method Not Found dans la classe MainClass. Maintenant, si la méthode principale est trouvée ici, elle agit comme le premier point où les compteurs de programmes doivent correspondre et commencer à exécuter les instructions. Les classes référées sont alors chargées, les méthodes référées peuvent être appelées en utilisant les instances créées à l'intérieur. Ainsi, main est spécifique à la classe, bien qu'une classe puisse avoir une seule méthode principale. Veuillez noter que la signature de la méthode principale ne change jamais. Vous pouvez avoir deux méthodes principales surchargées dans la même classe, comme

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

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

Au cours de la liaison statique, le principal est résolu d'origine et identifié par le moteur d'exécution.

0

Un autre point intéressant à considérer est un cas où vous avez deux classes différentes de fichier java.

Par exemple, vous avez le fichier Java avec deux 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); 
    } 
} 

Compiler avec javac FirstClassMultiply.java va générer deux .class fichiers, premier est FirstClassMultiply.class et deuxième est SecondClass.class

Et afin d'exécuter il vous faudra le faire pour les fichiers .class générés: java FirstClassMultiply et java SecondClass, pas le fichier original.

S'il vous plaît noter quelques points supplémentaires:

  1. Vous serez en mesure d'exécuter SecondClass.class bien que sa classe n'a pas été public dans le fichier original!
  2. FirstClassMultiplyoverloading de la principale méthode de est tout à fait bien , mais le seul point d'entrée à votre prog sera la principale méthode avec l'argument String args[].