2010-03-26 17 views
5

Java no permite primordial de los métodos estáticos pero,Los métodos estáticos y su anulando

class stat13 
{ 
    static void show() 
    { 
     System.out.println("Static in base"); 
    } 
    public static void main(String[] ar) 
    { 
     new next().show(); 
    } 
} 


class next extends stat13 
{ 
    static void show() 
    { 
     System.out.println("Static in derived"); 
    } 
} 

no es reemplazar hecho aquí?

+0

considere editar la pregunta ... el código no es tan legible. – RubyDubee

+0

gracias pgras por la edición de la pregunta ¿podría decirme simplemente cómo se formateó? – abson

Respuesta

4

Esto es "ocultar", no "anular". Para ver esto, cambiar el método de main a lo siguiente:

public static void main (String[] arghh) { 
    next n = new next(); 
    n.show(); 
    stat13 s = n; 
    s.show(); 
} 

Esto debería imprimir:

Static in derived 
Static in base 

Si había primordial verdadera pasando, a continuación, que se vería:

Static in derived 
Static in derived 

En general, se piensa que es un estilo incorrecto invocar un método estático usando un tipo de instancia ... como lo está haciendo ... porque es fácil pensar que está invocando un método de instancia y se confunde. n pensar que está ocurriendo una anulación Una herramienta de auditoría de código/código de estilo de Java generalmente indicará esto como un error de estilo/error potencial.

9

No, no está anulando nada, solo está ocultando el método original.

Desafortunadamente, Java le permite llamar a un método estático a través de una referencia. Su llamada más simplemente escribir como:

next.show(); 

importante destacar que este código todavía llamaría la versión original en stat13:

public static void showStat(stat13 x) 
{ 
    x.show(); 
} 
... 
showStat(new next()); 

En otras palabras, la unión con el método correcto de compilación se hace en hora, y no tiene nada que ver con el valor de x - que normalmente con anulación.

1

Java no da error de compilación para esto. pero este método no se comportará como lo espera ... mejor explicado here

0

La anulación ocurre cuando una clase hija proporciona su propia implementación para un método tal que se invocará la instancia de clase hija. La palabra operativa aquí es - instancia.

Los métodos estáticos se invocan en el contexto de la clase, p.

stat13.show(...); 

O

next.show(...); 

Fwiw, el código de la muestra no es un ejemplo de anular.

0

La anulación ocurre en el nivel del objeto. para ex obj1.overridedmenthod(). y no existe el concepto de anular un método de nivel de clase, es decir ... método estático ex: Class.overridedmethod().

y este concepto de anulación de un método estático se denomina método de ocultación.

prueba un ejemplo simple.

Cuestiones relacionadas