2011-01-20 21 views
11

Me preguntaba qué efecto le causaría a su código el efecto de crear métodos principales adicionales.Múltiples métodos main() en java

Por ejemplo,

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

Después de que el programa comienza inicialmente, foo será creado y habría otro método principal público dentro de él. ¿Eso causará algún error?

Respuesta

32

No causará errores. El hecho de que inicialice un objeto, no significa que se ejecute el método principal. Java sólo se llamará inicialmente el método principal de la clase que se le pasa, como

>java TestClass

Sin embargo, haciendo algo como:

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

O

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

Eso causaría un StackOverflowError, porque está exp llamando lícitamente principal método de TestClass, que a su vez llama al método principal de nuevo, y de nuevo, y de nuevo, y ....

En caso de duda, sólo prueba que fuera :-)

+0

Palabras sabias: D ¡Gracias! – guy8214

5

Esto está perfectamente bien. Tener múltiples métodos main no causa ningún problema. Cuando inicia por primera vez un programa Java, la ejecución comienza en , alguna función llamada main en una clase especificada por el usuario o por el archivo .jar. Una vez que el programa ha comenzado a ejecutarse, todas las demás funciones llamadas main se ignoran o tratan como otras funciones.

+0

Creo que el OP pregunta si los métodos principales se vuelven a crear cada vez que se crea una instancia de un objeto de esa clase en lugar de tener múltiples métodos principales declarados en el mismo ámbito. – berry120

+0

Creo que podría interpretarse de cualquier manera, y tener ambas explicaciones es útil. Sólo mi opinión, por supuesto. – duffymo

+0

Justo lo suficiente, estoy de acuerdo en que tener ambas explicaciones es útil de todos modos. Es solo la primera vez que lo leí :-) – berry120

3

No, puede tener cualquier cantidad de métodos principales en un proyecto. Ya que especifica cuál quiere usar cuando inicia el programa, no causa ningún conflicto.

+0

_si tengo varios main_ ** cómo especificar cuál usar primero? ** –

6

No tendrá un main -method adicional, ya que main es static. Entonces es una vez por clase

Si tiene múltiples main -métodos en su proyecto, usted especificará cuál lanzar al iniciar su aplicación.

10

El método principal es estático, lo que significa que pertenece a la clase en lugar del objeto. Entonces el objeto no tendrá otro método principal dentro.

Puede llamar al método principal en las instancias del objeto, pero si lo hace, es literalmente otra forma de llamar a TestClass.main() (y está mal visto por muchos, incluido yo, para llamar a un método estático en una instancia de un objeto de todos modos.)

Si se refiere a múltiples métodos principales en el mismo programa, entonces esto tampoco es un problema. La clase principal simplemente se especifica y su método principal se ejecuta para iniciar el programa (en el caso de un archivo jar este es el atributo de clase principal en el archivo de manifiesto.)

4

Después de buscar un Java Clase con múltiples métodos main() o en palabras simples, métodos main() sobrecargados, se me ocurrió un ejemplo mío.Por favor, eche un vistazo

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

}

Probé este código Java en el JDK 1.7 y funciona como un encanto!

Necesita "public static void main (String args [])" para comenzar y luego puede llamar a los métodos principales sobrecargados dentro de este main y debería funcionar con seguridad.

Cualquier comentario y sugerencia son muy apreciados. Solo soy un desarrollador de Java principiante dispuesto a desarrollar mis habilidades de Java.

Gracias, PK

+0

También intenté algo como esto. _Aunque tenemos múltiples métodos principales, pero el método principal con argumento (String args []) se ejecuta primero_. ** ¿Hay alguna forma de ejecutar otro método principal primero? ** –

+1

@RishabhAgarwal El tiempo de ejecución de Java busca el * método principal con (String args []) * cuando se carga su clase con el método principal. No conozco ningún mecanismo para anularlo. – realPK

0

al ejecutar la clase Java que siempre buscará la firma void Main públicas estáticas (args String []) en la clase. Supongamos que si invoca por el argumento de la línea de comando, buscará el método Signature en la clase y no invocará a otro hasta que lo explícitamente ingrese por su nombre de clase.

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

Pero cuando intenta lo mismo de Eclipse le pedirá qué clase de compilar. Significa MainMethod1 o Mainmethod2. Entonces, si la clase tiene la firma exacta, pueden usarse como punto de entrada individual para iniciar la aplicación. Al llegar a su pregunta, si elimina la firma como lo hizo anteriormente, cambie el argumento si es el método principal. Actuará como un método normal.

1

Usted puede tener sólo un método principal de una clase, pero se puede llamar a un método principal a la otra de manera explícita

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

Es todo sobre el motor de ejecución de JVM. Recuerde, escriba >java com.abc.MainClass en el indicador de cmd.

Lo explica todo. Si el método principal no se encuentra aquí arroja un tiempo de ejecución Error: Método principal no encontrado en la clase MainClass. Ahora, si el método principal se encuentra aquí, actúa como el primer punto cuando los Contadores de Programa tienen que mapear e iniciar la ejecución de las instrucciones. Las clases referidas se cargan, los métodos referidos se pueden llamar usando las instancias creadas en el interior. Entonces, main es específico de clase aunque una clase puede tener solo un método principal. Tenga en cuenta que la firma del método principal nunca cambia. Puede tener dos métodos principales sobrecargado en misma clase, como

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

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

durante la unión estática, el principal original está resuelta e identificada por motor de ejecución.

0

Otro punto interesante a considerar es un caso donde tienes dos clases diferentes en el archivo java.

Por ejemplo, usted tiene archivos Java con dos clases:

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

Compilarlo con javac FirstClassMultiply.java generará dos .class archivos, primero es FirstClassMultiply.class y segundo es SecondClass.class

Y con el fin de ejecutar tendrá que hacerlo para los archivos .class generados: java FirstClassMultiply y java SecondClass, no el archivo de nombre de archivo original.

Tenga en cuenta un par de puntos adicionales:

  1. Usted será capaz de ejecutar SecondClass.class aunque de clase no era pública en el archivo original!
  2. FirstClassMultiplyoverloading del método principal de es totalmente bien, pero, al único punto de entrada a su prog será el principal método con String args[] argumento.