¿Cómo selecciona una instancia polimórfica sus métodos?

Tengo problemas para comprender el comportamiento de este código. a se define como una A, c se define como una C. Luego, al final de la clase pública, a = c. Cuando un llama al método display (), alcanza la versión C del mismo. Pero cuando a llama a f () solo alcanza la versión A, a pesar del hecho de que los primeros argumentos (byte y long) son más compatibles con long que float.

Es un ejercicio de un libro, pero la explicación es escasa o inexistente.

class A{
    public void display(){
        System.out.println("I am an A ");
    }

    public void f(double x){
        System.out.println("A.f(double = " + x + ") ");
    }
}

class C extends A{
    public void display(){
        System.out.println("I am a C ");}

    public void f(long q){
        System.out.println("C.f(long = " + q + ") ");}
    }


public class PolySurStack{
    public static void main(String Args[]){
        byte bb =1; long q = 4; float x = 5.f;

        System.out.println(" ** A **");
        A a = new A(); a.display();
        a.f(bb); a.f(x);

        System.out.println();
        System.out.println(" ** C **");
        C c = new C(); c.display();
        c.f(bb); c.f(q); c.f(x);
        System.out.println();
        a = c; a.display();
        a.f(bb); a.f(q); a.f(x);
    }
} 
Respuesta 1

Acabo de encontrar esto en otro foro:

Sobrecarga: (mismo nombre de función pero firma diferente)

  1. Dos o más métodos que tienen el mismo nombre con diferente disposición en la misma clase se conocen como sobrecarga.

  2. La sobrecarga se utiliza cuando desea ampliar la funcionalidad.

  3. La sobrecarga se conoce como polimorfismo en tiempo de compilación

Anulación: (mismo nombre de función pero misma firma)

  1. Dos o más métodos que tienen el mismo nombre de método y la misma disposición en la clase principal y la clase secundaria se conocen como anulación.

  2. La anulación se utiliza cuando desea reutilizar la funcionalidad existente.

  3. La anulación se conoce como polimorfismo de tiempo de ejecución

Entonces, la respuesta a mi pregunta parece ser que la resolución de anulación (como para display ()) ocurre en el tiempo de ejecución (aquí después de a = c) mientras que la resolución de sobrecarga (como para f ()) ocurre en el momento de la compilación, cuando a todavía es un A.

Yo creo que.

También encontré esta página: https://beginnersbook.com/2013/04/runtime-compile-time-polymorphism/

ser claro y altamente relevante para este tema.

Respuesta: 2

El método seleccionado por el compilador depende del tipo declarado, no del tipo de tiempo de ejecución.
La primera serie que declara como variable Asolo puede invocar métodos A (cualquiera que sea el tipo de tiempo de ejecución instanciado como Aderiva de Object):

A a = new A(); 
a.f(bb); a.f(x);

Para la segunda serie, el compilador vincula los métodos con el parámetro más específico que coincide con la invocación, ya que Ces a, Apor lo que el compilador puede vincular cualquier método público de estos aquí:

C c = new C(); 
c.f(bb); c.f(q); c.f(x);   

Pero en el último fragmento de código que probablemente se cuestiona, se arefiere Ccomo objeto de tiempo de ejecución pero Acomo tipo declarado:

A a = new A(); 
// ...
a = c; 
a.f(bb); a.f(q); a.f(x);

Por lo tanto, solo Ase pueden invocar los métodos definidos en .

Respuesta: 3

Tengo un servlet que envía el archivo al cliente. ¿Es posible agregar una redirección para iniciar la descarga y redirigir al usuario a otra página html? Este es mi código: vacío protegido ...

Tengo algunos archivos en la subcarpeta de activos, como /assets/abc/0.txt o /assets/abc/3.txt Estoy usando el siguiente código. AssetManager mngr = getAssets (); Cadena [] índice = nulo; Cadena [] archivos = mngr ....

Una especie de problema extraño aquí: cada vez que configuro el modo de prueba a través de xml, recibo los anuncios de prueba esperados en mi emulador. Sin embargo, cuando trato de hacer lo mismo mediante programación, parece que obtengo anuncios reales. De acuerdo ...

Se está ejecutando una tarea Gradle classesPipeline en Eclipse. Esta tarea ensambla archivos .class dependiendo de la tarea de clases estándar, luego intenta ejecutar un archivo por lotes. Todo va bien hasta que ...