Accediendo a miembros estáticos de una clase desde una instancia
En Java es posible acceder a miembros estáticos (ya sean métodos o propiedades) de una clase desde una instancia de la misma (al contrario de lo que ocurre en C# o Ruby, por ejemplo). Nada mejor que mostrarlo en código para verlo:
String cadena = "cadena";
// el método valueOf es un método estático de la clase String
cadena.valueOf("otra cadena");
Esto está permitido, aunque el compilador lanza un warning para advertir de la situación; es algo que debería evitarse y que muchos piensan es un error de diseño de Java.
Lo curioso y algo que puede llevar a malentendidos es que no hace falta que la variable tenga una referencia a una instancia, ya que el acceso al método estático se hace a través del tipo de la variable.
public class Test {
static String cadena;
public static void main(String[] args) {
System.out.println(cadena.valueOf("cadena")); // imprime "cadena"
}
}
O más chocante (aunque viene a ser lo mismo de arriba):
String cadena = null;
cadena.valueOf("cadena"); // funciona!
Un ejemplo con enumerados (los valores de un enumerado son instancias estáticas del tipo del enumerado):
enum Animals { MONKEY, DONKEY }
Animals a;
void doSomething() {
System.out.println(a.MONKEY.DONKEY.MONKEY); // y así podríamos seguir...
}



[...] que realmente está pasando guarda relación con el “fallo” de diseño de Java en el acceso a los miembros estáticos. La llamada a method1 se hace sobre el tipo sin importar si la variable tiene una referencia a una [...]
Sobreescribir métodos estáticos en Java « AOWS
21 Mayo, 2009 a 21:10