Prefácio
Estamos muito familiarizados com as principais funções em Java. Acredito que todos que aprenderam o idioma Java podem escrever habilmente a função de entrada deste programa. No entanto, por que as principais funções são escritas dessa maneira, o que cada palavra -chave significa? Talvez nem todos possam responder facilmente. Eu também encontrei esse problema durante meus estudos. Ao procurar informações on -line e adicionar minha própria prática, finalmente obtive alguma experiência. Não ouso guardá -lo e escrevi para compartilhá -lo com todos.
Método Main () em Java
A máquina virtual Java encontra o programa em execução que precisa ser iniciado através do método principal e verifica se a classe onde a função principal está localizada é carregada pela máquina virtual Java. Se não estiver carregado, carregue a classe e carregue todas as outras classes relacionadas. Portanto, quando o programa está em execução, o primeiro método a ser executado é main() . Normalmente, se você deseja executar um método de classe, deve primeiro instantar um objeto dessa classe e depois passar " Nome do objeto. Nome do método () ", mas como o principal é o ponto de entrada do programa, o objeto não foi instanciado no momento, o método principal é declarado como estático, para que esse método possa ser chamado diretamente através do nome" da classe ". nome do método () ".
Antes de observar o método Main () em Java, vamos primeiro olhar para o aplicativo Java mais simples Helloworld. Vou usar este exemplo para ilustrar o mistério do método main() na classe Java. O código do programa é o seguinte:
/ *** Explicação detalhada do método main () em java*/ public classe helloworld {public static void main (string args []) {System.out.println ("Hello World!"); }}1. Vamos falar sobre a categoria primeiro:
Existe main() na classe Helloworld, o que significa que este é um aplicativo Java que começa e corre diretamente através da JVM.
Como é uma classe, o Java permite que as aulas não estejam sujeitas a restrições de palavras -chave públicas. Obviamente, a definição da classe só pode ser limitada a palavras -chave públicas ou ilimitadas (o padrão).
2. Vamos falar sobre o método principal ()
O método main() é declarado como: public static void main(String args[]) . Deve ser definido assim, esta é a especificação Java.
Por que é definido assim? Tem algo a ver com a operação da JVM.
Quando houver main() em uma classe, a execução do comando "Java Class Name" iniciará a máquina virtual para executar o método principal da classe.
Como a JVM chamará primeiro o método principal ao executar este aplicativo Java. Ao ligar, o objeto desta classe não é instanciado, mas é chamado diretamente através do nome da classe, por isso precisa ser limitado à estática pública.
Para o método principal em Java, a JVM possui restrições e não pode ter um valor de retorno, portanto o tipo de valor de retorno é nulo.
Há também um parâmetro de entrada no método principal, que é o tipo String [], que também é a especificação Java. main() deve ter um parâmetro de entrada e os detalhes da classe devem ser String[] . Quanto ao nome da matriz de string, isso pode ser definido sozinho. De acordo com os hábitos, o nome dessa matriz de string é geralmente consistente com o nome do parâmetro Mian no exemplo de especificação Sun Java e é nomeado args.
Portanto, main() do método deve ser: " public static void main(String 字符串数组参数名[]) ".
3. O método principal () pode lançar exceção
Portanto, uma exceção pode ser lançada no método main() , e uma exceção também pode ser declarada no método main() .
Por exemplo, o seguinte está correto:
classe pública testmain {public static void main (string [] args) lança exceção {System.out.println ("hahahahahahahahaha"); lançar uma nova exceção (""); }}Resultado em execução: hahahahaha exceção no tópico "main" java.lang.Exception: no manutenest.testmain.main (testmain.java:11) em sun.reflect.nativemethodaccessorImpl.inVoke0 (método nativo) em sun.refLect.EfLativeLativeTEnpl.Invoke0 (método nativo) em sun.refLect.Eflato sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:90) Process finished with exit code 1
4. A função da matriz de parâmetros de string no método main ()
No método main() , as funções da matriz de parâmetros da string para receber os parâmetros de entrada da linha de comando e os parâmetros da linha de comando são separados por espaços.
Aqui está um exemplo para ver como inicializar e usar essa matriz.
/ *** Parâmetros de entrada de impressão no método principal*/ public classe testMain {public static void main (string args []) {System.out.println ("Imprimir parâmetros de entrada no método principal!"); for (int i = 0; i <args.length; i ++) {System.out.println (args [i]); }}} Método de execução e resultados de operação
D:/estudo/bastetest/src> javac testmain.java d:/estudo/bastest/src> java testmain 1 2 3 Imprima os parâmetros de entrada no método principal! 1 2 3
5. Dê outra versão do Helloworld
/ *** A versão pervertida do helloworld.hehe*/ public class Helloworld2 {static {System.out.println ("Hello Wordld!"); } public static void main (string args []) {System.exit (0); }} O método main() executa o conteúdo da frase " System.exit(0); ", com o objetivo de tornar o programa normalmente. Onde "Helloworld!" imprimir? O segredo é impresso em estática, porque o conteúdo do bloco de código estático será chamado antes da chamada principal.
Vi. Exemplo
A máquina virtual inicia chamando o método principal de uma classe especificada, passando -a para o parâmetro principal de uma matriz de string, para que a classe especificada seja carregada, vinculando outros tipos usados pela classe e inicializando -os. Por exemplo, para o programa:
public for (int i = 0; i <args.length; i ++) {System.out.println (args); }}}Após a compilação, digite no modo de linha de comando: java helloapp run machine virtual
A máquina virtual Java será iniciada chamando o método de Helloapp de principal e passado para a principal uma matriz contendo três strings de "corrida", "virtual" e "máquina". Agora descrevemos brevemente as etapas que as máquinas virtuais podem tomar ao executar o HelloApp.
Comecei a tentar executar o método principal da classe HelloApp e descobri que a classe não estava carregada, o que significa que a máquina virtual atualmente não contém o representante binário da classe. Portanto, a máquina virtual usou o carregador de classe para tentar encontrar um representante tão binário. Se esse processo falhar, uma exceção será lançada. Depois que a classe é carregada, antes que o método principal seja chamado, a classe HelloApp deve estar vinculada a outros tipos e inicializada. O link consiste em três estágios: inspeção, preparação e análise. Verifique os símbolos e a semântica da classe principal carregada, prepare -se para criar domínios estáticos da classe ou interface e inicializar esses domínios para valores padrão padrão, e a análise é responsável por verificar as referências simbólicas da classe principal para outras classes ou interfaces. É opcional nesta etapa. A inicialização da classe é a execução da função de inicialização estática e o construtor de inicialização do domínio estático declarado na classe. A classe pai de uma classe deve ser inicializada antes de ser inicializada.
Todo o processo é o seguinte:
Resumir
Como especificação especial, o método principal é muito diferente dos métodos comuns e possui muitas limitações. Compreender seus princípios requer o aprendizado de conhecimento relacionado à JVM. É um grande obstáculo para aprender em Java. O exposto acima é o resumo do princípio e o uso do principal compilado pelo editor. Espero que seja útil para você. Se você tiver alguma dúvida, pode deixar uma mensagem para se comunicar.