2011-09-23 11 views
6

Duplicar posible:
Why doesn't Java allow overriding of static methods?¿Hay alguna razón legítima para ocultar los métodos estáticos?

¿Hay alguna razón legítima por la que se podría querer una clase derivada a anulación ocultar un método de la clase base static?

+5

No pueden sustituirse. Ellos pueden estar ocultos. – BalusC

+0

Eche un vistazo a este hilo - http://stackoverflow.com/questions/2223386/why-doesnt-java-allow-overriding-of-static-methods – adatapost

+0

@BalusC Semántica ... En cualquier caso, no creo que nadie ha respondido la pregunta. – NullUserException

Respuesta

6

Terminología aparte, los métodos estáticos en Java tienen un tipo de relación primordial, implícita en la sección de compatibilidad binaria 13.4.12. Si T se extiende S, S declarada m(), T.m() puede referirse a un método en T o S, dependiendo de si m() se declara en T; y está bien agregar o eliminar m() de T, sin romper ningún código que llame a T.m(). (Esto implica que la instrucción invokestatic de JVM realiza una especie de búsqueda de método dinámico en la cadena de la clase superior)

Sin embargo, esto no es más que un problema. Es realmente peligroso si el significado de T.m() cambia silenciosamente porque ahora apunta a un método diferente. (Los métodos de instancia heredarán los contratos para que no haya ningún problema; no existe tal comprensión en los métodos estáticos.)

Por lo tanto, esta "característica" no se debe utilizar nunca; el lenguaje no debería haberlo habilitado para comenzar.

La buena práctica: si llamamos a T.m(), m() debe declararse en T; y nunca debería eliminarse de T sin eliminar todo T.m() primero.

+0

Totalmente de acuerdo en que nunca deben ser utilizados. Sin embargo, es * posible *. ¿Puedes pensar en algún ejemplo legítimo del mundo real? En mi carrera en Java nunca los he encontrado. – BalusC

+0

Nunca los he encontrado, por lo que debe ser raro que las personas "anulen" los métodos estáticos. Creo que lo aprendí por primera vez cuando investigaba otra pregunta difícil http://stackoverflow.com/questions/6643648 – irreputable

+0

+1 para la explicación. Pero esto es exactamente lo que deseo saber por qué es posible en absoluto, si esto no parece lógico (al menos para la mayoría de nosotros). – Saket

4

Los métodos estáticos no pueden ser sobreescritos

Con el fin de reemplazar un método, el método primero debe ser heredado. Si el método no es heredado, no hay posibilidad de anularlo. Por lo tanto, nunca puede anular un método privado ya que no se heredan.

Cuestiones relacionadas