Explicación del Método main() en Java
1. Introducción
Cada programa necesita un lugar para comenzar su ejecución; hablando de programas en Java, ese lugar es el método main.
Estamos tan acostumbrados a escribir el método main durante nuestras sesiones de código que ni siquiera prestamos atención a sus detalles. En este breve artículo, analizaremos como funciona el método main y mostraremos algunas otras formas de escribirlo.
2. Firma Común
La plantilla más común del método main es:
public static void main(String[] args) { }
Así es como lo hemos aprendido, así es como la IDE autocompleta el código para nosotros. Pero esa no es la única forma que este método puede asumir, existen algunas variantes válidas que podemos usar y no todos los desarrolladores prestan atención a este hecho.
Antes de sumergirnos en esas firmas de método, repasemos el significado de cada palabra clave de la firma común:
- public: modificador de acceso, significa visibilidad global.
- static: el método se puede acceder directamente desde la clase, no tenemos que instanciar un objeto para tener una referencia y usarlo.
- void: significa que este método no devuelve un valor.
- main: el nombre del método, es el identificador que la JVM busca al ejecutar un programa Java.
En cuanto al parámetro args, representa los valores recibidos por el método. Así es como pasamos argumentos al programa cuando lo ejecutamos por primera vez.
El parámetro args es una array de Strings. En el siguiente ejemplo:
java CommonMainMethodSignature foo bar
estamos ejecutando un programa Java llamado CommonMainMethodSignature y pasando 2 argumentos: foo y bar. Esos valores se pueden acceder dentro del método main como args[0] (con el valor foo) y args[1] (con el valor bar).
En el siguiente ejemplo, estamos comprobando args para decidir si cargar parámetros de prueba o de producción:
public static void main(String[] args) {
if (args.length > 0) {
if (args[0].equals("test")) {
// cargar parámetros de prueba
} else if (args[0].equals("production")) {
// cargar parámetros de producción
}
}
}
Siempre es bueno recordar que las IDE también pueden pasar argumentos al programa.
3. Diferentes Formas de Escribir un Método main()
Veamos algunas formas diferentes de escribir el método main. Aunque no son muy comunes, son firmas válidas.
Ten en cuenta que ninguna de estas es específica del método main, se pueden usar con cualquier método de Java, pero también son una parte válida del método main.
Los corchetes cuadrados pueden colocarse cerca de String, como en la plantilla común, o cerca de args en cualquiera de sus lados:
public static void main(String []args) { }
public static void main(String args[]) { }
Los argumentos se pueden representar como varargs:
public static void main(String...args) { }
Incluso podemos agregar strictfp para el método main, que se utiliza para la compatibilidad entre procesadores al trabajar con valores de punto flotante:
public strictfp static void main(String[] args) { }
synchronized y final también son palabras clave válidas para el método main, pero no tendrán un efecto aquí.
Por otro lado, final se puede aplicar a args para evitar que el array se modifique:
public static void main(final String[] args) { }
Para finalizar estos ejemplos, también podemos escribir el método main con todas las palabras clave mencionadas anteriormente (que, por supuesto, probablemente nunca usarás en una aplicación práctica):
final static synchronized strictfp void main(final String[] args) { }
4. Tener Más de un Método main()
También podemos definir más de un método main dentro de nuestra aplicación.
De hecho, algunas personas lo usan como una técnica de prueba primitiva para validar clases individuales (aunque los frameworks de prueba como JUnit son mucho más adecuados para esta actividad).
Para especificar cuál de los métodos main debe ejecutar la JVM como punto de entrada de nuestra aplicación, usamos el archivo MANIFEST.MF. Dentro del manifiesto, podemos indicar la clase principal:
Main-Class: mypackage.ClaseConMetodoMain
Esto se usa principalmente al crear un archivo .jar ejecutable. Indicamos qué clase tiene el método main para iniciar la ejecución, a través del archivo de manifiesto ubicado en META-INF/MANIFEST.MF (codificado en UTF-8).
5. Conclusión
Este tutorial describió los detalles del método main y algunas otras formas en que puede presentarse, incluso las que no son muy comunes para la mayoría de los desarrolladores.
Ten en cuenta que, aunque todos los ejemplos que hemos mostrado son válidos en cuanto a sintaxis, sirven principalmente con fines educativos y la mayoría del tiempo usaremos la firma común para hacer nuestro trabajo.