web-dev-qa-db-fra.com

Plusieurs méthodes main () en java

Je me demandais quel serait l'effet de la création de méthodes principales supplémentaires sur votre code.

Par exemple,

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

Après le démarrage initial du programme, foo sera créé et comportera une autre méthode principale publique. Cela provoquera-t-il des erreurs? 

12
guy8214

Cela ne causera aucune erreur. Ce n'est pas parce que vous initialisez un objet que la méthode principale soit exécutée. Java n'appellera initialement que la méthode principale de la classe qui lui est transmise, 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();
 }
}

That provoquerait une StackOverflowError, car vous appelez explicitement la méthode principale de TestClass, qui appellera ensuite la méthode principale à nouveau, et encore, et encore, et ....

En cas de doute, testez-le simplement :-)

35
Zach L

La méthode principale est statique, ce qui signifie qu'elle appartient à la classe plutôt qu'à l'objet. Donc, l'objet n'aura pas d'autre méthode principale à l'intérieur.

Vous pouvez appeler la méthode main sur les occurrences de l'objet, mais si vous le faites, c'est simplement une autre façon d'appeler TestClass.main () (et beaucoup, y compris moi, désapprouvent d'appeler une méthode statique sur une instance d'un objet. objet quand même.)

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.)

10
Michael Berry

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

Si vous avez plusieurs méthodes main- dans votre projet, vous spécifierez celle à lancer lors du démarrage de votre application.

7
MicSim

C'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 par some function 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 d’autres fonctions.

5
templatetypedef

Après avoir recherché une classe Java avec plusieurs méthodes main () ou dans des mots simples, surchargés avec des méthodes main (), je suis parvenu à mon propre exemple. Jetez un coup d'oeil s'il vous plait

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

}

J'ai testé ce code Java sur JDK 1.7 et fonctionne à merveille!

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

Tous les commentaires et suggestions sont très appréciés. Je ne suis qu'un développeur Java novice, désireux de développer mes compétences en Java.

Merci, PK

4
realPK

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.

3
Emil H

Vous ne pouvez avoir qu’une méthode principale dans une classe, mais vous pouvez appeler explicitement une méthode principale. 

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);
    }
}
1
Varun Vashista

lorsque vous exécutez votre classe Java, il recherchera toujours la signature public static void main (String args []) dans la classe. Donc supposez si vous appelez par  argument de ligne de commande, il cherchera la méthode Signature dans la classe et n'en invoquera pas tant que vous ne l'y aurez pas explicitement appelé 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 quand vous essayez la même chose de Éclipse il vous demandera quelle classe compiler. Moyens MainMethod1 ou Mainmethod2. Donc, si la classe a la signature exacte, elle peut être utilisée comme point d’entrée individuel pour démarrer l’application. Pour répondre à votre question, si vous supprimez la signature comme vous l’avez fait précédemment en modifiant l’argument de la méthode principale. Il agira comme une méthode normale.

0
vinod bazari

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

Par exemple, vous avez un 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);
    }
}

La compilation avec javac FirstClassMultiply.Java générera deux fichiers .class, le premier est FirstClassMultiply.class et le second est SecondClass.class.

Et pour pouvoir l'exécuter, vous devrez le faire pour les fichiers .class générés: Java FirstClassMultiply et Java SecondClass, pas le fichier de nom de fichier d'origine.

Veuillez noter quelques points supplémentaires:

  1. Vous pourrez exécuter SecondClass.class bien que sa classe ne soit pas publique dans le fichier d'origine!
  2. FirstClassMultiplysurcharge de la méthode principale de totalement acceptable, mais le seul point d’entrée de votre prog sera la principale méthode avec l'argument String args[].
0
Stas

Il s’agit du moteur d’exécution de la machine virtuelle Java. N'oubliez pas que vous écrivez >Java com.abc.MainClass sur l'invite de commande.

Ça explique tout. Si la méthode principale n’est pas trouvée ici, elle génère une erreur d’exécution. Erreur: Méthode principale introuvable dans la classe MainClass. À présent, si la méthode principale est trouvée ici, elle constitue le premier point lorsque les compteurs de programme doivent mapper et commencer à exécuter les instructions. Les classes référencées sont chargées puis, les méthodes référencées peuvent être appelées à l'aide des instances créées à l'intérieur. Ainsi, main est spécifique à une classe bien qu’une classe ne puisse avoir qu’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 () {} // surchargé dans la même classe.

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

0
hi.nitish