2012-02-23 8 views
33

tengo 3 clases:Si sobrescribe un campo en una subclase de una clase, la subclase tiene dos campos con el mismo nombre (y tipo diferente)?

public class Alpha { 
    public Number number; 
} 

public class Beta extends Alpha { 
    public String number; 
} 

public class Gama extends Beta { 
    public int number; 
} 

¿Por qué compilar el siguiente código? Y, ¿por qué pasa la prueba sin ningún error de tiempo de ejecución?

@Test 
public void test() { 
    final Beta a = new Gama(); 
    a.number = "its a string"; 
    ((Alpha) a).number = 13; 
    ((Gama) a).number = 42; 

    assertEquals("its a string", a.number); 
    assertEquals(13, ((Alpha) a).number); 
    assertEquals(42, ((Gama) a).number); 
} 
+2

Y? funciona así. Si necesita anular, debe usar métodos setter/getter. El campo público es casi siempre una mala idea. – kan

Respuesta

45

Las variables miembro no se pueden anular como los métodos. Las variables number en sus clases Beta y Gama son que ocultan (no anula) la variable miembro number de la superclase.

Al realizar la conversión, puede acceder al miembro oculto en la superclase.

36

campos no puede ser anulado ; en primer lugar, no se accede polimórficamente; solo declaras un campo nuevo en cada caso.

Compila porque en cada caso el tipo de tiempo de compilación de la expresión es suficiente para determinar cuales campo llamado number que significa.

En la programación del mundo real, usted evitar esto por dos medios:

  • El sentido común: los campos de sombreado hace que su código sea más difícil de leer, por lo que simplemente no hacerlo
  • Visibilidad: si usted hace que todos sus campos sean privados, las subclases no los conocerán de todos modos
Cuestiones relacionadas