Prefacio
Estamos muy familiarizados con las funciones principales de Java. Creo que todos los que han aprendido el idioma Java pueden escribir hábilmente la función de entrada de este programa. Sin embargo, por qué las funciones principales se escriben de esta manera, ¿qué significa cada palabra clave? Quizás no todos puedan responderlo fácilmente. También encontré este problema durante mis estudios. Al buscar información en línea y agregar mi propia práctica, finalmente obtuve algo de experiencia. No me atrevo a conservarlo y lo escribí para compartirlo con todos.
Método Main () en Java
La máquina virtual Java encuentra el programa en ejecución que debe iniciarse a través del método principal, y verifica si la clase donde se encuentra la función principal está cargada por la máquina virtual Java. Si no está cargado, cargue la clase y cargue todas las otras clases relacionadas. Por lo tanto, cuando el programa se está ejecutando, el primer método para ejecutar es main() . Normalmente, si desea ejecutar un método de clase, primero debe instanciar un objeto de esta clase y luego pasar " Nombre del objeto. Nombre del método () ", Pero debido a que Main es el punto de entrada del programa, el objeto no se ha instanciado en este momento, el método principal se declara estático, por lo que este método puede llamarse directamente a través del nombre de clase". Nombre del método () ".
Antes de mirar el método Main () en Java, primero veamos la aplicación Java más simple Helloworld. Usaré este ejemplo para ilustrar el misterio del método main() en la clase Java. El código del programa es el siguiente:
/ *** Explicación detallada del método main () en Java*/ public class Helloworld {public static void main (string args []) {system.out.println ("¡Hola mundo!"); }}1. Hablemos primero sobre la categoría:
Hay main() en la clase Helloworld, lo que significa que esta es una aplicación Java que comienza y se ejecuta directamente a través del JVM.
Como es una clase, Java permite que las clases no estén sujetas a limitaciones de palabras clave públicas. Por supuesto, la definición de la clase solo puede limitarse a palabras clave públicas o ilimitadas (el valor predeterminado).
2. Hablemos del método principal ()
El método main() se declara como: public static void main(String args[]) . Debe definirse así, esta es la especificación de Java.
¿Por qué se define así? Tiene algo que ver con la operación del JVM.
Cuando hay main() en una clase, ejecutar el comando "Nombre de clase Java" iniciará la máquina virtual para ejecutar el método principal en la clase.
Dado que el JVM primero llamará al método principal al ejecutar esta aplicación Java. Al llamar, el objeto de esta clase no se instancia, sino que se llama directamente a través del nombre de la clase, por lo que debe limitarse a la estática pública.
Para el método principal en Java, JVM tiene restricciones y no puede tener un valor de retorno, por lo que el tipo de valor de retorno es nulo.
También hay un parámetro de entrada en el método principal, que es el tipo de cadena [], que también es la especificación Java. main() debe tener un parámetro de entrada, y los detalles de la clase deben ser String[] . En cuanto al nombre de la matriz de cadenas, se puede establecer por usted mismo. Según los hábitos, el nombre de esta matriz de cadenas es generalmente consistente con el nombre del parámetro Mian en el ejemplo de la especificación Sun Java, y se llama Args.
Por lo tanto, main() debe ser: " public static void main(String 字符串数组参数名[]) ".
3. El método principal () puede lanzar una excepción
Por lo tanto, se puede lanzar una excepción en main() , y una excepción también se puede declarar en main() .
Por ejemplo, lo siguiente es correcto:
Public Class TestMain {public static void main (string [] args) lanza la excepción {System.out.println ("jajajajajajaja"); arrojar una nueva excepción (""); }}Resultado de ejecución: jajajaja excepción en hilo "principal" java.lang.exception: en starting.testmain.main (testMain.java:11) en sun.reflect.nativemethodaccessorImpl.invoke0 (método nativo) en sun.reflect.nativemethodaccessorsiMpl.invoke (natives Sun.reflect.DelegatingMethodacCessorImpl.invoke (delegación deMethodAccessorImpl.java:25) en java.lang.reflect.method.invoke (método.java:585) en com.intellij.rt.execution.application.appmain.main (appmain.Java:90)
4. La función de la matriz de parámetros de cadena en el método main ()
En main() , la matriz de parámetros de cadena funciona para recibir parámetros de entrada de línea de comando, y los parámetros de la línea de comando están separados por espacios.
Aquí hay un ejemplo para ver cómo inicializar y usar esta matriz.
/ *** Imprima los parámetros de entrada en el método principal*/ public class testMain {public static void main (string args []) {system.out.println ("Imprime parámetros de entrada en el método principal!"); para (int i = 0; i <args.length; i ++) {system.out.println (args [i]); }}} Método de ejecución y resultados de la operación
D:/Study/Basetest/Src> Javac testMain.java D:/Study/Basetest/Src> Java TestMain 1 2 3 Imprima los parámetros de entrada en el método principal! 1 2 3
5. Dar otra versión de Helloworld
/ *** La versión pervertida de Helloworld.hehe*/ public class Helloworld2 {static {System.out.println ("¡Hola Wordld!"); } public static void main (string args []) {system.exit (0); }} El método main() ejecuta el contenido de la oración " System.exit(0); ", con el propósito de hacer que el programa termine normalmente. ¿Dónde "Helloworld!" imprimir desde? El secreto se imprime en estática, porque el contenido del bloque de código estático se llamará antes de la llamada principal.
VI. Ejemplo
La máquina virtual comienza llamando al método principal de una clase especificada, pasándola a un parámetro de matriz de cadenas principal, de modo que la clase especificada esté cargada, vinculando otros tipos utilizados por la clase e inicializándolos. Por ejemplo, para el programa:
clase pública HelloApp {public static void main (String [] args) {System.out.println ("¡Hola mundo!"); para (int i = 0; i <args.length; i ++) {system.out.println (args); }}}Después de la compilación, escriba el modo de línea de comando: Java HelloApp Ejecute la máquina virtual
La máquina virtual Java se iniciará llamando al método de HelloApp Main y pasará a Main una matriz que contiene tres cuerdas "Ejecutar", "Virtual" y "Máquina". Ahora describimos brevemente los pasos que las máquinas virtuales pueden tomar al ejecutar HelloApp.
Comencé a tratar de ejecutar el método principal de la clase HelloApp y descubrí que la clase no estaba cargada, lo que significa que la máquina virtual no contiene actualmente el representante binario de la clase. Entonces, la máquina virtual usó classloader para tratar de encontrar un representante de este tipo binario. Si este proceso falla, se lanza una excepción. Después de cargar la clase, antes de que se llame el método principal, la clase HelloApp debe estar vinculada a otros tipos e inicializarse. El enlace consta de tres etapas: inspección, preparación y análisis. Verifique los símbolos y la semántica de la clase principal cargada, prepárese para crear dominios estáticos de la clase o interfaz e inicialice estos dominios a los valores predeterminados estándar, y el análisis es responsable de verificar las referencias simbólicas de la clase principal a otras clases o interfaces. Es opcional en este paso. La inicialización de la clase es la ejecución de la función de inicialización estática y el constructor de inicialización del dominio estático declarado en la clase. La clase principal de una clase debe inicializarse antes de que se inicialice.
Todo el proceso es el siguiente:
Resumir
Como especificación especial, el método principal es muy diferente de los métodos ordinarios y tiene muchas limitaciones. Comprender sus principios requiere aprender conocimiento relacionado con JVM. Es un obstáculo importante para el aprendizaje en Java. Lo anterior es el resumen del principio y el uso de Main compilado por el editor. Espero que te sea útil. Si tiene alguna pregunta, puede dejar un mensaje para comunicarse.