Java main() Método: principal vacío estático público (String [] args)

En los programas Java, el punto desde donde el programa inicia su ejecución o simplemente el punto de entrada de los programas Java es el método main() . Por lo tanto, es uno de los métodos más importantes de Java y tener una comprensión adecuada de él es muy importante.

El compilador de Java o JVM busca el método principal cuando comienza a ejecutar un programa Java. La firma del método principal debe ser de una forma específica para que la JVM reconozca ese método como su punto de entrada. Si cambiamos la firma del método, el programa compila pero no ejecuta.

La ejecución del programa Java, se llama java.exe . El Java.exe a su vez hace llamadas a Java Native Interface o JNI, y cargan la JVM. El java.exe analiza la línea de comandos, genera una nueva array de strings e invoca el método main(). Se adjunta un subproceso de daemon al método principal, y este subproceso se destruye solo cuando el programa Java detiene la ejecución.

Java main() Method

Sintaxis: más común al definir el método main()

Java

// Java Program to demonstrate the
// syntax of the main() function
 
class GeeksforGeeks {
    public static void main(String[] args)
    {
        System.out.println("I am a Geek");
    }
}
Producción

I am a Geek

Explicación de salida:  cada palabra en la declaración principal de vacío estático público tiene un significado para la JVM. 

1. Público 

Es un modificador de acceso , que especifica desde dónde y quién puede acceder al método. Hacer público el método main() lo hace disponible globalmente. Se hace público para que JVM pueda invocarlo desde fuera de la clase, ya que no está presente en la clase actual.

Java

// Java Program to demonstrate the
// use of any other access modifier
// other than public
 
class GeeksforGeeks {
    private static void main(String[] args)
    {
        System.out.println("I am a Geek");
    }
}
Error: Main method not found in class, please define the main method as:
public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application

2. estática

Es una palabra clave que se asocia con un método, lo que lo convierte en un método relacionado con la clase. El método main() es estático para que JVM pueda invocarlo sin instanciar la clase. Esto también ahorra el desperdicio innecesario de memoria que habría sido utilizada por el objeto declarado solo para llamar al método main() por la JVM.

Java

// Java Program to demonstrate the
// error occurred when we dont use the
// static keyword in the main() method
 
class GeeksforGeeks {
    public void main(String[] args)
    {
        System.out.println("I am a Geek");
    }
}
Error: Main method is not static in class test, please define the main method as:
public static void main(String[] args)

3. Vacío 

Es una palabra clave y se usa para especificar que un método no devuelve nada. Como el método main() no devuelve nada, su tipo de retorno es void . Tan pronto como finaliza el método main() , el programa Java también finaliza. Por lo tanto, no tiene ningún sentido regresar desde el método main() ya que JVM no puede hacer nada con el valor de retorno.

Java

// Java Program to demonstrate the
// error occurred when we dont use the
// void return type in the main() method
 
class GeeksforGeeks {
    public static int main(String[] args)
    {
        System.out.println("I am a Geek");
        return 1;
    }
}
Error: Main method not found in class, please define the main method as:
public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application

4. principal 

Es el nombre del método principal de Java. Es el identificador que busca la JVM como punto de partida del programa java. No es una palabra clave.

Java

// Java Program to demonstrate the
// error occurred when we name the
// main() method as main.
 
class GeeksforGeeks {
    public static void myMain(String[] args)
    {
        System.out.println("I am a Geek");
    }
}
Error: Main method not found in class, please define the main method as:
public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application

5. Argumentos de string [] 

Almacena argumentos lineales de comandos de Java y es una array de tipo java.lang.String class. Aquí, el nombre de la array de strings es args pero no está fijo y el usuario puede usar cualquier nombre en su lugar. 

Java

// Java Program to demonstrate
// the working of String[] args
// in the main() method
 
class GeeksforGeeks {
   
      // Commamd-Line Code ->
    // javac GeeksforGeeks.java
    // java GeeksforGeeks 1 2 3
   
    public static void main(String[] args)
    {
        for (String elem : args)
            System.out.println(elem);
    }
}

Producción:

1
2
3 

Además de la firma de main mencionada anteriormente, puede usar public static void main(String args[]) o public static void main(String… args) para llamar a la función principal en Java. Se llama al método principal si su parámetro formal coincide con el de una array de strings.

¿Puede el método principal ser int? Si no, ¿por qué?

Java

class GeeksforGeeks {
 
public static int main(String[] args)
    {
 
        System.out.println("GeeksforGeeks");
    }
}

 
Java no devuelve int implícitamente, incluso si declaramos el tipo de retorno de main como int. Obtendremos un error en tiempo de compilación: 

prg1.java:6: error: missing return statement

   }

   ^

1 error

Java

class GeeksforGeeks {
 
   public static int main(String[] args) {
 
       System.out.println("GeeksforGeeks");
 
       return 0;
   }
 
}

Ahora, incluso si devolvemos 0 o un entero explícitamente nosotros mismos, desde int main. Obtenemos un error de tiempo de ejecución.

Error: Main method must return a value of type void in class GeeksforGeeks, please  
define the main method as:
  public static void main(String[] args)

Explicación: 

Los programas C y C++ que devuelven int desde main son procesos del sistema operativo. El valor int devuelto por main en C y C++ es el código de salida o el estado de salida. El código de salida del programa C o C++ ilustra por qué se terminó el programa. El código de salida 0 significa terminación exitosa. Sin embargo, el estado de salida distinto de cero indica un error. 

Por ejemplo , el código de salida 1 representa varios errores, como «dividir por cero».

El proceso padre de cualquier proceso hijo sigue esperando el estado de salida del hijo. Y después de recibir el estado de salida del hijo, limpia el proceso hijo de la tabla de procesos y libera los recursos asignados a él. Por eso es obligatorio que los programas C y C++ (que son procesos del sistema operativo) pasen su estado de salida del principal de forma explícita o implícita.

Sin embargo, el programa Java se ejecuta como un ‘hilo principal’ en JVM . El programa Java ni siquiera es un proceso del Sistema Operativo directamente. No hay interacción directa entre el programa Java y el sistema operativo. No hay asignación directa de recursos al programa Java directamente, o el programa Java no ocupa ningún lugar en la tabla de procesos. Entonces, ¿a quién debería devolver un estado de salida? Esta es la razón por la que el método principal de Java está diseñado para no devolver un estado int o exit.

Pero JVM es un proceso de un sistema operativo, y JVM se puede terminar con un cierto estado de salida. Con la ayuda de java.lang.Runtime.exit(int status) o System.exit(int status) .

¿Podemos ejecutar un programa Java sin el método principal?

Sí, podemos ejecutar un programa java sin un método principal usando un bloque estático.

Un bloque estático en Java es un grupo de declaraciones que se ejecuta solo una vez cuando ClassLoader carga la clase en la memoria. También se conoce como bloque de inicialización estático y va a la memoria de la pila.

class StaticBlock {
    static
    {
        System.out.println(
            "This class can be executed without main");
        System.exit(0);
    }
}

Publicación traducida automáticamente

Artículo escrito por raman_257 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *