Overloading é um polimorfismo em tempo de compilação. Realmente
Conheço a diferença sintática entre substituir e sobrecarregar. E também sei que substituir é polimorfismo em tempo de execução e sobrecarregar é polimorfismo em tempo de compilação. Mas minha pergunta é: "A sobrecarga é realmente um polimorfismo em tempo de compilação? A chamada de método está realmente resolvendo em tempo de compilação?". Para esclarecer meu argumento, vamos considerar um exemplo de class
public class Greeter {
public void greetMe() {
System.out.println("Hello");
}
public void greetMe(String name) {
System.out.println("Hello " + name);
}
public void wishLuck() {
System.out.println("Good Luck");
}
}
Como todos os métodosgreetMe(), greetMe(String name), wishLuck()
são públicos, todos eles podem ser substituídos (incluindo um sobrecarregado), certo? Por exemplo
public class FancyGreeter extends Greeter {
public void greetMe() {
System.out.println("***********");
System.out.println("* Hello *");
System.out.println("***********");
}
}
Agora, considere o seguinte trecho:
Greeter greeter = GreeterFactory.getRandomGreeter();
greeter.greetMe();
OgetRandomGreeter()
retorna um método aleatórioGreeter
objeto. Pode retornar um objeto deGreeter
ou qualquer uma de suas subclasses, comoFancyGreeter
ouGraphicalGreeter
ou qualquer outro. OgetRandomGreeter()
criará os objetos usandonew
ou carregar dinamicamente o arquivo de classe e criar objeto usando reflexão (acho que é possível com reflexão) ou de qualquer outra maneira possível. Todos esses métodos deGreeter
pode ou não ser substituído nas subclasses. Portanto, o compilador não tem como saber se um método específico (sobrecarregado ou não) foi substituído. Certo? Além disso, a wikipedia diz em Funções virtuais:
Em Java, todos os métodos não estáticos são, por padrão, "funções virtuais". Somente os métodos marcados com a palavra-chave final, que não podem ser substituídos, e os métodos privados, que não são herdados, não são virtuais.
Desde que as funções virtuais são resolvidas em tempo de execução usando o envio dinâmico de métodos e, como todos os métodos não particulares e não finais são virtuais (sobrecarregados ou não), eles devem ser resolvidos em tempo de execução. Certo
Então, como a sobrecarga ainda pode ser resolvida em tempo de compilação? Ou há algo que eu entendi errado ou estou perdendo?