2012-09-04 21 views
7

Si tengo dos clases, A y B,Java llamando al método subclase cuando se trata de utilizar el método de la clase padre

public class A { 
    public int test() { 
     return 1; 
    } 
} 

public class B extends A{ 
    public int test() { 
     return 2; 
    } 
} 

Si hago: A a1 = new B(), luego vuelve a1.test() 2 en vez de 1 como se desee. ¿Es esto solo una peculiaridad de Java, o hay alguna razón para este comportamiento?

+1

Esto se llama 'enlace dinámico', también debe conocer el' enlace estático'. Se vuelve un poco más complicado cuando intenta anular (de hecho ocultar) los campos en lugar de métodos. Encontrará muchas preguntas sobre esto en SO o google. –

Respuesta

3

No, eso es correcto (es debido a un polimorfismo). Todas las llamadas a métodos operan en objetos, no en tipos de referencia.

Aquí su objeto es del tipo B, por lo que se llamará al método de prueba class B.

+0

Gracias, esto es en lo que estaba confundido. Estaba esperando un comportamiento basado en el tipo de referencia. –

5

Esto se llama polymorphism. En tiempo de ejecución, se llamará al método correcto de acuerdo con el tipo "real" de a1, que es B en este caso.

como Wikipedia pone muy bien:

El uso principal de polimorfismo en la industria ( teoría de la programación orientada a objetos) es la capacidad de los objetos que pertenecen a diferentes tipos para responder a método, campo o propiedad llamadas del mismo nombre, cada una según un comportamiento específico del tipo apropiado. El programador (y el programa) no tiene que conocer el tipo exacto de el objeto de antemano, por lo que el comportamiento exacto se determina en en tiempo de ejecución (esto se conoce como enlace tardío o enlace dinámico).

+0

+1 para polimorfismo –

0

Comportamiento previsto. El método test() en la clase B está reemplazando el método test() de clase A.

0

Para

A a1 = new B(); 

a1 está apuntando hacia el objeto de B que es el tipo real en tiempo de ejecución. De ahí que el valor se imprime del objeto B.

0
A obj = new A(); 
obj.test() 

volverá 1

A obj = new B(); 
obj.test() 

devolverá 2

B obj = new B(); 
obj.test() 

devolverá 2

Como se ha dicho en otras respuestas así es como el polimorfismo funciona

This puesto puede hacer las cosas un poco más claro

0

Java utiliza vinculante (o el enlace en tiempo ) dinámico, por lo que el método de B se llama, no A. Esto es lo opuesto a enlace estático. Hay un buen ejemplo here.

0

Declaras tu objeto como A pero tu instancia es B. Entonces el método que se llamará es de clase B.B extiende A (podemos decir que A es padre para B) si va a comentar la prueba de método en B y luego recuerda este método, en este caso el método invocado será la prueba de clase A y devolverá 1.

2

Esto es polymorphism y más específicamente en Java overriding. Si desea invocar el método de prueba de Clase A de la Clase B, necesita usar super para invocar el método de superclase. por ejemplo:

public class B extends A{ 
    public int test() { 
     return super.test(); 
} 
Cuestiones relacionadas