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.
No pueden sustituirse. Ellos pueden estar ocultos. – BalusC
Eche un vistazo a este hilo - http://stackoverflow.com/questions/2223386/why-doesnt-java-allow-overriding-of-static-methods – adatapost
@BalusC Semántica ... En cualquier caso, no creo que nadie ha respondido la pregunta. – NullUserException