Polimorfismo confuso en Java

Así es como funciona en breve:
tiempo de compilación

  • El compilador define la firma requerida para el método solicitado.
  • Una vez que se define la firma, el compilador comienza a buscarla en la clase de tipo
  • Si encuentra algún método candidato compatible con la firma requerida, de lo contrario, devuelve un error

Tiempo de ejecución

  • Durante la ejecución, JVM comienza a buscar el método candidato con la firma exactamente definida durante el tiempo de compilación.
  • La búsqueda del método ejecutable en realidad comienza desde la clase de implementación de objeto real (que puede ser una subclase de la clase de tipo) y navega por toda la jerarquía.

Su lista se define con el tipo Gadget.

for (Gadget gadget : l) {
        gadget.switchon();
    }

Cuando solicite gadget.switchon();el compilador, buscará el switchon()método en la clase Gadget y, como está allí, simplemente se confirma que la firma del candidato es switchon().

Durante la ejecución, la JVM buscará un switchon()método de la Clase de teléfonos inteligentes y es por eso que muestra el mensaje correcto.

Esto es lo que sucede en el segundo ciclo for

DemoPersonnel p = new DemoPersonnel();
    for (Gadget gadget : l) {
        p.demo(gadget);
    }

La firma en este caso es para ambos objetos demo(Gadget g), es por eso que demo(Gadget g)se ejecuta el método de ambas iteraciones .

¡Espero eso ayude!

Respuesta 1

1. No debería importar. Debido a que está extendiendo Gadget, si no anula y llama a switchon () desde un teléfono inteligente, diría "¡Gadget se está encendiendo!". Cuando tienes una interfaz y una clase padre con el mismo método, realmente no importa.

2.El primer bucle funciona y el segundo no debido a la forma en que Java mira los objetos. Cuando llama a un método desde un objeto, toma el método directamente de ese objeto y, por lo tanto, sabe si es un teléfono inteligente o un dispositivo. Cuando envía un teléfono inteligente o un gadget a un método sobrecargado, todo en esa clase se llama un gadget, ya sea realmente un teléfono inteligente o no. Debido a esto, utiliza el método de gadget. Para que esto funcione, querrá usar esto en el método de demostración (Gadget g) de DemoPersonnel:

if(gadget instanceof Smartphone){
    System.out.println("Demoing a gadget");
}else{
    System.out.println("Demoing a smartphone");
} 

Lo siento, no tengo un enlace a un tutorial, aprendí a través de una combinación de AP Computer Science y experiencia.

Respuesta: 2

Respondiendo primero la pregunta 2: en el segundo bucle, pasa un objeto escrito como Gadget, por lo tanto, la mejor coincidencia en la clase de demostración es el método que toma un gadget. Esto se resuelve en tiempo de compilación.

para la pregunta 1: la anotación no hace la diferencia. solo indica que está anulando (implementando) el método en la interfaz.

Respuesta: 3
  1. Para el compilador, Smartphone hereda la "implementación" del método switchon () de Gadget y luego Smartphone anula la implementación heredada con su propia implementación. Por otro lado, la interfaz conmutable dicta que Smartphone proporcione una implementación de la definición del método switchon () y que se cumplió con la implementación anulada en Smartphone.

  2. El primer caso funciona como esperaba porque es un caso de polimorfismo, es decir, tiene un contrato y dos implementaciones: una en Gadget y otra en Smartphone; donde más tarde ha "anulado" la implementación anterior. El segundo caso "no debería" funcionar como lo espera, porque solo hay un contrato y una implementación. Tenga en cuenta que "no está anulando" el método demo (), en realidad está "sobrecargando" el método demo (). Y, sobrecarga significa dos definiciones de método únicas "diferentes" que solo comparten el "mismo nombre". Por lo tanto, es un caso de un contrato y una implementación, cuando llama a demo () con el parámetro Gadget, porque el compilador hará coincidir el nombre del método con los tipos de parámetros de método exactos y al hacerlo llamará "métodos diferentes"

Respuesta: 4

sobre la segunda pregunta: en Java, el despacho dinámico de métodos ocurre solo para el objeto al que se llama el método, no para los tipos de parámetros de métodos sobrecargados.

Aquí hay un enlace a la especificación del lenguaje java .

Como dice:

Cuando se invoca un método (§15.12), el número de argumentos reales (y cualquier argumento de tipo explícito) y los tipos en tiempo de compilación de los argumentos se utilizan, en tiempo de compilación, para determinar la firma del método que se invocará ( §15.12.2). Si el método que se va a invocar es un método de instancia, el método real que se invocará se determinará en tiempo de ejecución, utilizando la búsqueda dinámica de métodos (§15.12.4).

básicamente: el tipo de tiempo de compilación de los parámetros del método se usa para determinar la firma del método que se llamará

En el tiempo de ejecución, la clase del objeto al que se llama el método determina qué implementación se llama a ese método, teniendo en cuenta que puede ser una instancia de una subclase del tipo declarado que anula el método.

En su caso, cuando crea el objeto de una clase secundaria por new child (); y pasarlo al método sobrecargado, tiene un tipo de superclase asociado. Por lo tanto, se llama al método sobrecargado con el objeto padre.

Respuesta: 5

Hay muchas formas de convertir una cadena en un objeto entero. Cuál es el más eficiente entre los siguientes: Integer.valueOf () Integer.parseInt () org.apache.commons.beanutils.converters ...

clase Cartón {Cuento = 200; CardBoard go (CardBoard cb) {cb = nulo; volver cb; } public static void main (String [] args) {CardBoard c1 = new CardBoard (); Cartón c2 = ...

En un proyecto Java, hay dos archivos java con método principal. Las rutas absolutas para estos dos archivos java son: C: \ Desktop \ project1 \ src \ com \ pre \ moveposition1.java y C: \ Desktop \ project1 \ src \ com \ ...

Necesito enviar un pedido de red corto para un servidor de juegos que estoy escribiendo usando Java. Leí sobre el pedido de red, pero no pude encontrar ningún detalle sobre un corto que se envía antes de los datos. Alguien podria ...