La sobrecarga es un polimorfismo en tiempo de compilación. ¿De Verdad

Conozco la diferencia sintáctica entre anulación y sobrecarga. Y también sé que anular es el polimorfismo en tiempo de ejecución y la sobrecarga es el polimorfismo en tiempo de compilación. Pero mi pregunta es: "¿La sobrecarga es realmente un polimorfismo en tiempo de compilación? ¿La llamada al método realmente se resuelve en tiempo de compilación?". Para aclarar mi punto, consideremos una clase de ejemplo.

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");
    }
}

Desde todos los métodosgreetMe(), greetMe(String name), wishLuck() son públicos, todos pueden ser anulados (incluido uno sobrecargado), ¿verdad? Por ejemplo

public class FancyGreeter extends Greeter {
    public void greetMe() {
        System.out.println("***********");
        System.out.println("*  Hello  *");
        System.out.println("***********");
    }
}

Ahora, considere el siguiente fragmento:

Greeter greeter = GreeterFactory.getRandomGreeter();
greeter.greetMe();

LosgetRandomGreeter()l método @ devuelve una @ aleatorGreeter objeto. Puede devolver un objeto deGreeter, o cualquiera de sus subclases, comoFancyGreeter oGraphicalGreeter o cualquier otro. LosgetRandomGreeter() creará los objetos usandonew o cargue dinámicamente el archivo de clase y cree el objeto usando la reflexión (creo que es posible con la reflexión) o cualquier otra forma que sea posible. Todos estos métodos deGreeter puede o no ser anulado en subclases. Por lo tanto, el compilador no tiene forma de saber si un método particular (sobrecargado o no) se anula. ¿Derecho? Además, wikipedia dice en Funciones virtuales:

En Java, todos los métodos no estáticos son por defecto "funciones virtuales". Solo los métodos marcados con la palabra clave final, que no se pueden anular, junto con los métodos privados, que no se heredan, no son virtuales.

Desde entonces, las funciones virtuales se resuelven en tiempo de ejecución utilizando el envío dinámico de métodos, y dado que todos los métodos no privados y no finales son virtuales (ya sea sobrecargados o no), deben resolverse en tiempo de ejecución. ¿Derecho

Entonces, ¿cómo se puede resolver la sobrecarga en tiempo de compilación? ¿O hay algo que no entendí bien o me estoy perdiendo?

Respuestas a la pregunta(8)

Su respuesta a la pregunta