Postado em

na

Método main() Java

Você já tentou entender por que o método main() Java é público, estático e void? Por que seu nome é main? O que acontece dentro da JVM quando você invoca o método main()? Qual é o propósito do método main? Vamos descobrir.

Desde o Java 21, podemos criar métodos main() de instância que não requerem os modificadores de acesso public e static, bem como, os argumentos do método são opcionais.

Se não criamos a classe sem nome, a discussão neste artigo ainda se aplica.

1. Sintaxe do Método main() Java

Comecemos relembrando a sintaxe do método main no Java.

class Main
{
public static void main(String[] args)
{
System.out.println("Olá Mundo!!");
}
}

2. Por que o Método main do Java é público?

Esta é uma grande questão e talvez a mais difícil de responder. Eu tentei muito encontrar uma boa razão para esta pergunta em todo o bom material de aprendizado ao meu alcance, mas nada foi suficiente.

Então, minha análise diz (como muitos outros): o método main é público para que ele possa ser acessível em qualquer lugar e a todo objeto que possa desejar usá-lo para iniciar a aplicação.

Aqui, não estou dizendo que o JDK/JRE teve essa mesma razão exata porque java.exe ou javaw.exe (para Windows) podem usar a Interface Nativa do Java (JNI) para executar o método de invocação para chamar o método main(), então eles podem tê-lo invocado, de qualquer maneira, independentemente de qualquer modificador de acesso.

Uma segunda maneira de responder a isso é outra pergunta, por que não público? Todos os métodos e construtores em Java têm algum modificador de acesso. O método main() também precisa de um. Não há razão para que não seja público e seja qualquer outro modificador (padrão/protegido/privado).

Observe que se não tornarmos o método main() público, não haverá erro de compilação. Você terá erro em tempo de execução porque o método main() correspondente não está presente. Lembre-se de que toda a sintaxe deve corresponder para executar o método main().

class Main
{
void static main(String[] args)
{
System.out.println("Olá Mundo!!");
}
}

Saída do programa:

Erro: Método principal não encontrado na classe Main, por favor, defina o método principal como: public static void main(String[] args)

3. Por que static?

Outra grande questão a considerar é: suponhamos que não tenhamos o método main como static. Agora, para invocar qualquer método, é necessário uma instância dele, certo?

Além disso, o Java pode ter construtores sobrecarregados, algo comum a todos nós. No entanto, surge a dúvida: qual construtor deveria ser usado e de onde viriam os parâmetros para os construtores sobrecarregados? Estas são apenas mais perguntas difíceis, que ajudaram os designers do Java a decidir e ter o método main como static.

É importante observar que, se não tornarmos o método main() static, não haverá erro de compilação. Contudo, ocorrerá um erro em tempo de execução.

class Main
{
public void main(String[] args)
{
System.out.println("Olá Mundo!!");
}
}

Saída do programa:

Erro: O método principal não é estático na classe main, por favor, defina o método principal como: public static void main(String[] args)

4. Por que void?

Então, não há utilidade em retornar algum valor para a JVM, que na verdade invoca este método. Simplesmente não precisa de nenhum valor de retorno.

A única coisa que a aplicação gostaria de comunicar ao processo que a invocou é a terminação normal ou anormal. Isso já é possível usando System.exit(int). Um valor não zero significa terminação anormal, caso contrário, tudo estava bem.

5. Por que o nome é main?

Não há razão definitiva. Vamos supor que seja porque já estava em uso com a linguagem C e C++. Então, a maioria dos desenvolvedores já estava familiarizada com esse nome.

Caso contrário, não há outra boa razão.

6. O que acontece internamente quando você invoca o método main?

O que acontece internamente quando você invoca o método main? O objetivo do método main no Java é ser o ponto de início da execução do programa.

Quando você executa java.exe, então há algumas chamadas de Interface Nativa do Java (JNI). Essas chamadas carregam o DLL que é realmente a JVM (isso mesmo – java.exe NÃO é a JVM). JNI é a ferramenta que usamos quando precisamos fazer uma ponte entre o mundo da máquina virtual e o mundo de C, C++, etc. O inverso também é verdadeiro. Não é possível realmente executar uma JVM sem usar JNI.

Basicamente, java.exe é um aplicativo C super simples que analisa a linha de comando, cria uma nova matriz de Strings na JVM para armazenar esses argumentos, analisa o nome da classe que você especificou como contendo o main(), usa chamadas de JNI para encontrar o próprio método main(), então invoca o método main(), passando a nova matriz de strings recém-criada como parâmetro.

Isso é muito, muito parecido com o que você faz quando usa a reflexão em Java, apenas usa chamadas de função nativa com nomes confusos em vez disso.

Seria perfeitamente legal você escrever sua própria versão de java.exe (o código-fonte é distribuído com o JDK), e fazê-lo fazer algo completamente diferente.

7. Código nativo do método main() em java.c

Código nativo do método main() em java.c Baixe e extraia o arquivo fonte jar e confira ../launcher/java.c. É algo assim:

/*
* Get the application's main class.
*/
if (jarfile != 0) {
mainClassName = GetMainClassName(env, jarfile);
... ...

mainClass = LoadClass(env, classname);
if(mainClass == NULL) { /* exception occured */
... ...

/* Get the application's main method */
mainID = (*env)->GetStaticMethodID(env, mainClass, "main", "([Ljava/lang/String;)V");
... ...

{/* Make sure the main method is public */
jint mods;
jmethodID mid;
jobject obj = (*env)->ToReflectedMethod(env, mainClass, mainID, JNI_TRUE);
... ...

/* Build argument array */
mainArgs = NewPlatformStringArray(env, argv, argc);
if (mainArgs == NULL) {
ReportExceptionDescription(env);
goto leave;
}

/* Invoke main method. */
(*env)->CallStaticVoidMethod(env, mainClass, mainID, mainArgs);
}

8. Resumo

O método main do Java é usado por todos os desenvolvedores e todos conhecem a sintaxe básica para escrevê-lo. No entanto, muito poucos entendem completamente a razão correta e a maneira como funciona.

Neste post, obtivemos um entendimento muito básico das coisas por trás do método main, que é o ponto de partida primário de uma aplicação.

Posts recentes