2011-07-07 16 views
12

He estado leyendo una sección sobre la estática en la guía de estudio SCJP, y menciona lo siguiente:¿Qué significa redefinir los métodos estáticos en Java?

métodos estáticos no pueden ser anulados, pero pueden ser redefinido

Lo ¿la redefinición significa realmente? ¿Es un caso de tener un método estático que existe tanto en padres como en hijos, con la misma firma, sin embargo, están referenciados por separado por sus nombres de clase? Tales como:

class Parent 
{ 
    static void doSomething(String s){}; 
} 

class Child extends Parent 
{ 
    static void doSomething(String s){}; 
} 

referencia como: Parent.doSomething(); y Child.doSomething();?

Además, ¿lo mismo se aplica a las variables estáticas, o solo a los métodos estáticos?

Respuesta

17

Simplemente significa que las funciones no son virtuales. Como ejemplo, supongamos que tiene un objeto de tipo (tiempo de ejecución) Child que se referencia desde una variable de tipo Parent. A continuación, si se invoca doSomething, el método de los padres doSomething se invoca:

Parent p = new Child(); 
p.doSomething(); //Invokes Parent.doSomething 

Si los métodos eran no estático, doSomething del Niño anularía la de los padres y child.doSomething habría sido invocado.

Lo mismo vale para los campos estáticos.

6

Estático significa que hay uno por clase, en lugar de uno por objeto. Esto es cierto para ambos métodos y variables.

Un campo estático implicaría que hay uno de estos campos, sin importar cuántos objetos de esa clase se creen. Por favor, eche un vistazo a Is there a way to override class variables in Java? para la cuestión de anular un campo estático. En resumen: un campo estático no puede ser anulado.

Considera:

public class Parent { 
static int key = 3; 

public void getKey() { 
    System.out.println("I am in " + this.getClass() + " and my key is " + key); 
} 
} 

public class Child extends Parent { 

static int key = 33; 

public static void main(String[] args) { 
    Parent x = new Parent(); 
    x.getKey(); 
    Child y = new Child(); 
    y.getKey(); 
    Parent z = new Child(); 
    z.getKey(); 
} 
} 

I am in class tools.Parent and my key is 3 
I am in class tools.Child and my key is 3 
I am in class tools.Child and my key is 3 

Clave nunca regresa como 33. Sin embargo, si se reemplaza getKey y añadir al niño, entonces los resultados serán diferentes.

@Override public void getKey() { 
System.out.println("I am in " + this.getClass() + " and my key is " + key); 
} 
I am in class tools.Parent and my key is 3 
I am in class tools.Child and my key is 33 
I am in class tools.Child and my key is 33 

Al anular el método getKey, puede acceder a la clave estática del elemento secundario.

0

En la respuesta de rajah9 Si ahora hacemos los dos métodos estáticos tanto en padres e hijos:

public static void getKey() { 
     System.out.println("I am in and my key is " + key); 
    } 

Dos cosas a tener en cuenta ahora: No se puede utilizar 'this.getClass()' y la alerta 'El getKey método estático() de la Parent tipo se debe tener acceso de una manera estática también

Parent z = new Child(); 
    z.getKey(); 

dará la salida

I am in class tools.Parent and my key is 3 

en lugar de

I am in class tools.Parent and my key is 33 
Cuestiones relacionadas