Dois methods principais com assinaturas diferentes

Eu tenho aula seguinte.

public class Test { public static void main(Integer[] args) { System.out.println("This is not a main"); } public static void main(String[] args) { System.out.println("This is the main"); } } 

Aqui há dois methods main que são aceitar Integer[] e String [] como argumento de input. Minha pergunta é como a JVM sempre carrega o segundo método como método principal dessa class. Por que sempre considerar o argumento de input como array de String ?

Porque é isso que o Java sempre procura. Especificação da linguagem Java, Seção 12.1.4 :

O método main deve ser declarado public, static e void. Deve especificar um parâmetro formal (§8.4.1) cujo tipo declarado seja array de String

Porque Strings são o que você está passando para a linha de comando.

os 45 de

myProgram.exe 45

não é um inteiro. é uma string contendo os caracteres 4 e 5

Acontece que você pode usar uma string como "45" para representar um inteiro. É um pouco mais difícil fazer o contrário (pelo menos para o usuário)

Desde argumentos de linha de comando são sempre Strings .

Nós sempre inserimos argumentos de linha de comando como Strings . 🙂

Além do que os outros mencionaram, você pode usar var-args para implementar o array String.

 public static void main (String ...a) 

Para mais informações, consulte este documento

http://docs.oracle.com/javase/tutorial/getStarted/application/

E também

Usando int em vez de String: public static void main (int [] args)

Como outros já disseram, o método main sempre será chamado pela JVM com a sobrecarga que recebe um array de strings. Você está livre para fazer outras sobrecargas para esse método, se assim o desejar. Você pode até mesmo chamá-los você mesmo em seu código. É só que a VM procura especificamente por essa sobrecarga que usa uma matriz de strings.

Esta é a única assinatura reconhecida pela JVM como o principal método

 public static void main(String[] args) 

Você pode ter quantos principais methods sobrecarregados quiser, MAS somente o método com a assinatura acima será chamado pelo jvm

Argumentos de linha de comando são argumentos para o método main() que são passados ​​para ele em tempo de execução. Como o Java usa apenas argumentos da linha de comandos do tipo String , a JVM ignora o outro método main() que transmite o Integer.

A assinatura do método main em java é public static void main(String[] args) {} e é isso que o classloader da JVM carrega no início do programa. O outro main com um argumento Integer não será chamado, a menos que você o tenha feito manualmente dentro do main. Tente modificar seu código como mostrado abaixo e você notará que nada será chamado e seu programa não imprimirá nada.

 public class Test { public static void main(Integer[] args) { System.out.println("This is not a real main so nothing gets printed"); } } 

Btw, você pode escrever um método principal sobrecarregado com qualquer argumento que você deseja. Contanto que o argumento não seja String [] ou String … que são os mesmos, nada vai começar a rolar o programa.