certificação não é um de meus objetivos (ainda), por isso não sei se esta mensagem está dentro dos objetivos deste fórum, mas achei a questão ( de um tópico do gd comp.lang.java, recomendo uma leitura diária das discussões) interessante:
pq qdo o main executar o printIt, ele não vai saber qual o tipo de argumento, portanto não saberá qual metodo chamar…
R
renan_danielPJ
Acho que erro não dá não…
Acho que ambos metodos são iguais, pq vc pode ter uma String, ou vc pode ter um Object de String…
Acho
Se tivesse apenas um método, qualquer um dos dois do código, ele imprimiria normal, agora entre os dois, eu não sei qual realmente ele imprime…
Flw
F
fabianoruyPJ
Acho que imprime o primeiro (“String: null”).
Não dá erro pq String é um Object e o compilador procura o mais específico (String).
Só acho que isso não é Polimorfismo, certo? É apenas sobrecarga de nomes!
T+
Fabiano B. Ruy
M
matheusPJ
acho q vai dar erro de runtime!
R
renan_danielPJ
“fabianoruy”:
o compilador procura o mais específico (String).
Fabiano B. Ruy
Eu não sabia que ele procurava o mais específico, se ele procura o mais específico, ele vai imprimir “String:null”.
F
fabianoruyPJ
É, eu já havia caido nessa!
Se fossem duas classes de hierarquias diferentes (tipo String e Integer), daria erro de compilação!
O tal do compilador é bom mesmo!
T+
Fabiano B. Ruy
Porque quando há métodos de nomes iguais, porém com atributos diferentes, em tempo de execução ele sempre assumirá o método mais específico, conforme foi dito.
É uma regra que eu acho meio sem sentido, facílimo de confudir-se e sem muito propósito.
S
spierPJ
“fabianoruy”:
Acho que imprime o primeiro (“String: null”).
Não dá erro pq String é um Object e o compilador procura o mais específico (String).
Bingo
Só acho que isso não é Polimorfismo, certo?
Provavelmente! Coisa de rookie! :oops:
é isso mesmo?
A resposta:
[quote]There is a rule in the JLS about this. In the case of two or more
possible methods matching, the one that is selected is the one whose
parameter types most closely match the argument types in the method
call. In the case of the argument being null without a typecast, the
method with the most specific parameter types is selected.
In your code, String is more specific than Object, because String is a
subclass of Object. So therefore the compiler chooses printIt(String).
If you had two methods whose parameter types were equally specific,
for example printIt(String) and printIt(List), you would get a compiler
error. Likewise if you had two methods with two parameters, and neither
had both more specific than the other. For example printIt(Object,
String) and printIt(String, Object).