2010-09-28 9 views
6
class A { public static void main(String[] args) 
{ A a = new A(); 
    B b = new B(); 
    A ab = new B(); 
    System.out.format("%d %d %d %d %d %d", a.x, b.x, ab.x, a.y, b.y, ab.y); } 
    int x = 2; 
    int y = 3; 
    A(int x) { this.x = x; } 
    A() { this(7); } } 

class B extends A { 
    int y = 4; 
    B() { super(6); 
    } 

Hola a todos, estaba viendo algunos ejemplos de mi curso y encontré este problema que me dejó perplejo.
que dan cuenta de que que este código debe imprimir "7 6 6 3 4 3"Clases reales vs aparentes en Java

Pero ¿por qué es ab.y igual a 3? ¿No es el tipo de objeto "real" ab de la clase B? ¿Qué me llevaría entonces a creer que ab.y sea 4?

Respuesta

8

Porque está accediendo a los campos directamente, y no a través de métodos getter.

No puede anular campos, solo métodos.

La clase B tiene un campo y además del de la clase principal A. Los dos campos no interfieren entre sí, lo que se obtiene se determina en tiempo de compilación (por el tipo conocido por el compilador).

Si dice

A ab = new B(); 

continuación

ab.y 

se compilará para mirar el campo y declarado en la clase A. Esto no se envía en tiempo de ejecución a la clase de la instancia real. Sería lo mismo con un método estático.

Si lo hace

B ab = new B(); 

Luego se llega al campo en la clase B.

+0

De acuerdo, eso aclara mucho, ¡gracias! –