Pregunta

¿Alguien puede explicarme por qué Java le permite acceder a métodos estáticos y miembros desde una instancia? Un mal ejemplo, si tengo una clase llamada RedShape y tiene un método estático llamado getColor () que devuelve '' rojo '', ¿por qué Java le permite llamar al método estático desde una instancia de RedShape? Para mí, esto parece violar algunos de los conceptos centrales del diseño del lenguaje OO. Al menos, debería venir con una advertencia del compilador.

Gracias de antemano.

Editar:

En particular, te pregunto cuándo tienes algo como

RedShape test = new RedShape();
test.getColor();

donde getColor es un método estático de la clase RedShape. Esto no tiene ningún sentido que esté permitido y no da una advertencia del compilador en la línea de comando a través de javac. Veo que está `` totalmente desaconsejado '', pero tenía curiosidad por saber si había una razón técnica o razonable detrás de por qué está permitido fuera de `` porque C ++ lo permite ''.

¿Fue útil?

Solución

Realmente no hay ninguna razón por la que realmente puedas hacer esto.

Mi única suposición era que le permitiría anular los métodos estáticos, pero no puede .

Si intenta el siguiente escenario:

Banana tiene un método estático llamado 'prueba' (esto imprime 'banana') Apple extiende Banana y '' anula '' el método estático llamado 'prueba' (esto imprime 'manzana')

y haces algo como esto:

public static void main(String[] args) {
    Apple apple = new Apple();
    Banana banana = new Banana();
    Banana base = new Apple();

    apple.test();
    banana.test();
    base.test();
}

El resultado resultante es:

apple
banana
banana

Así que efectivamente, es bastante inútil.

Otros consejos

No veo nada malo al llamar a un método estático desde una instancia. ¿Qué está mal con eso? En particular, con bastante frecuencia hay métodos que son útiles dentro de la lógica de una clase, pero que en realidad no necesitan manipular la instancia en sí.

I do objeto a llamar a un método estático a través de una referencia de instancia. Ejemplo clásico:

Thread thread = new Thread(...);
thread.sleep(5000); // Doesn't do what it looks like

Esto viene con una advertencia del compilador en algunos IDEs, ciertamente en Eclipse, suponiendo que lo encienda. (Java / Compilador / Errores y advertencias / Estilo de código / Acceso no estático al miembro estático). Personalmente considero que eso es un error en el diseño de Java. (Es uno de los errores que C # logró evitar copiar).

El acceso a métodos estáticos le permite compartir valores entre instancias de la misma clase o incluso obtener los valores sin necesidad de crear una instancia de clase.

Hay casos en que es conveniente y no hay violación del lenguaje OO.

Apuesto a que es porque los diseñadores originales estaban transfiriendo la capacidad de C ++, y para el momento 20/20 en retrospectiva, era un problema de compatibilidad con versiones anteriores.

Eso, o porque cuando llamas a un método dentro de una clase, a pesar de que no tienes que prefijar todo con this. el compilador lo inserta (o equivalente) incluso para métodos estáticos. Si los métodos estáticos no se pueden llamar desde instancias, entonces agregar this. en el frente podría ser un problema (o forzaría a los codificadores a agregar el nombre de la clase en el frente de los métodos estáticos cuando quisieran usarlos) dentro de una instancia real).

De todos modos, las respuestas son especulativas a menos que hagamos que uno de los primeros desarrolladores de lenguaje responda.

public class MyClass {
    public static String myString;
}


public class AnotherClass {
   public void doSomething() {
       doAnotherThing();
   }
   public static doAnotherThing() {
       MyClass.myString = "something";
   }

Aquí estamos accediendo a la variable estática desde un método no estático (indirectamente) llamando al método estático desde un método no estático.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top