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.