2011-07-29 10 views
5

Pregunta simple. Hice una clase llamada Tester1 que amplía otra llamada Tester2. Tester2 contiene una cadena pública llamada 'ABC'.Java - utilizando la palabra clave 'super'

Aquí es Tester1:

public class Tester1 extends Tester2 
{ 
    public Tester1() 
    { 
     ABC = "Hello"; 
    } 
} 

Si en lugar de cambiar la línea 5 a

super.ABC = "Hello"; 

¿Todavía estoy haciendo exactamente lo mismo?

+2

Esa es en realidad una buena pregunta. Es bastante común saber cómo 'super' funciona con métodos anulados, pero los campos son diferentes. –

Respuesta

8

Sí. Solo hay una variable ABC dentro de tu objeto. Pero, por favor, no hagas públicos los campos en primer lugar. Los campos deberían ser casi siempre privados.

Si declarado una variable dentro de ABCTester1 así, entonces que habría una diferencia - en el campo Tester1 haría ocultar el campo en Tester2, pero utilizando super todavía estaría refiriendo al campo dentro de Tester2. Pero tampoco hagas eso: ocultar variables es una manera muy rápida de hacer que el código no se pueda mantener.

Código de ejemplo:

// Please don't write code like this. It's horrible. 
class Super { 
    public int x; 
} 

class Sub extends Super { 
    public int x; 

    public Sub() { 
     x = 10; 
     super.x = 5; 
    } 

} 

public class Test { 
    public static void main(String[] args) { 
     Sub sub = new Sub(); 
     Super sup = sub; 
     System.out.println(sub.x); // Prints 10 
     System.out.println(sup.x); // Prints 5 
    } 
} 
+0

A menos que sea estático. El OP en realidad no dijo que no era estático, pero el tono indicaba que probablemente no lo era. :) –

+0

@Ray: Sí, supongo que no es estático ... –

+0

No es estático. ¡Gran ejemplo y explicación! – WildBamaBoy

1

Lo primero es que la variable ABC debe declararse en la clase Tester2. Si es así, entonces lo eres.

+0

Supongo que solo importaría si Tester1 tuviera una variable miembro ABC que estuviera sombreando la variable ABC de la superclase. – Kevin

1

eres. Dado que ABC es visible para Tester1 (la clase secundaria), se supone que se declara todo menos privado y es por eso que es visible para una subclase. En este caso, usar super.ABC simplemente refuerza el hecho de que la variable se define en el padre.

Si, por otro lado, ABC se ha marcado como privado en la clase principal, no habría forma de acceder a esa variable desde una clase secundaria, incluso si se usa super (sin usar un reflejo refinado, por supuesto) .

Otra cosa a tener en cuenta, es que si la variable se hubiera definido como privada en la clase principal, podría definir una variable con el mismo nombre exacto en la clase secundaria. Pero, de nuevo, super no le otorgará acceso a la variable principal.

2

Sí, el supercalificador no es necesario pero funciona igual. Para aclarar:

public static class Fruit { 

    protected String color; 
    protected static int count; 
} 

public static class Apple extends Fruit { 

    public Apple() { 
     color = "red"; 
     super.color = "red"; // Works the same 
     count++; 
     super.count++; // Works the same 
    } 
} 
Cuestiones relacionadas