2011-02-12 33 views
23

En Java, se crean métodos estáticos para acceder a él sin ninguna instancia de objeto. Tiene algo de sentido para mí. Pero recientemente me encontré con una cosa extraña: el método estático en Java también se puede acceder a través de su instancia de objeto. Esto me parece bastante extraño. ¿Alguien de ustedes sabe por qué esta característica es proporcionada por Java? ¿Cuál es la importancia de permitir el acceso a los métodos estáticos, así como sin instancia?Se puede acceder al método estático en Java utilizando la instancia de objeto

+1

Cerca: [qué-isnt-llamar-a-electricidad estática método por caso vía-de-una-instancia-un-error-para-la-java-co] (http://stackoverflow.com/questions/610458/why-isnt-calling-a-static-method-by-way-of -an-instance-an-error-for-the-java-co) – nawfal

Respuesta

16

Una ventaja de esto es que le permite tomar un método de instancia y convertirlo en un método estático sin tener que modificar ningún código existente (que no sea la clase) y así permitir la compatibilidad con versiones anteriores. Lo he encontrado útil tantas veces que me he encontrado con métodos de utilidad que se pueden convertir en estáticos: puedo agregar el modificador static y continuar mi camino.

+1

No pensé en esta perspectiva. Sí, como dijiste, ofrece una opción de compatibilidad extrema. Es aventurero y emocionante comprender la forma en que se especifica Java. Gracias una vez más :) –

+0

@Nate W. entonces, la compatibilidad con versiones anteriores es ... si llamaste un método que utilizara referencia, ¿el método llamado puede ser estático o no estático? si el uso de referencia de objeto y el uso del nombre de clase para llamar a los métodos estáticos son los mismos, entonces, si el método tiene ** palabra clave ** sincronizada ¿se bloqueará en un 'objeto' o en 'clase.objeto'? –

5

Semánticamente idénticos. El compilador es lo suficientemente inteligente como para saber a qué te refieres (es decir, acceder al método estático a través de la clase). Los IDE le darán una advertencia diciéndole que es de mala educación :)

Mire this question for more details. Como dicen, puede ser engañoso y es por eso que los IDEs te darán una advertencia.

2

Está permitido por especificación, pero no es recomendable. Además, más IDE como Eclipse marcan el acceso a un método estático en una instancia de objeto con una advertencia.

0

si bien es malo, tampoco hay una razón convincente para prohibirlo.

o.f(); 

por lo que tenemos que encontrar un método denominado f en el ámbito de o. Se podría argumentar que una estática f es, por supuesto, también en el ámbito de o, a pesar de que f está definido en realidad para un mayor alcance (o 's de clase)

-2

Otra agradable (aunque un poco hackear-y), característica que le da usted es la capacidad de esencialmente pasar referencias de clase en forma de objetos. Así que decir, por ejemplo, que tiene la siguiente:

public abstract class Animal { 
    public String name() { return "animal"; } 
} 

public class Dog extends Animal { 
    public String name() { return "dog"; } 
} 

Si a continuación, ejecuta el siguiente:

Animal a = new Dog(); 
System.out.println(a.name()); 

... se obtiene:

dog 

Lo que esto significa en la práctica es que llamar a métodos estáticos a través de objetos instanciados proporciona a Java una forma de funciones de primera clase. Usted define la función "escribir" utilizando una clase base abstracta, y luego crea una instancia de cualquier función del tipo apropiado anulando el método estático en una clase secundaria. A continuación, utiliza los objetos como si fueran simplemente contenedores para el método estático en cuestión.

Para hacer esto más concreto, imagina que queríamos tener una función que realiza una determinada cadena de codificación en una matriz de cadenas, y queremos que tome como argumento una función que realiza la codificación en una sola cadena. Queremos que el argumento varíe en función de qué codificación se desea. Sin funciones de primera clase, esto es imposible de hacer directamente.Sin embargo, llamar a métodos estáticos en los objetos nos proporciona una solución alternativa:

public abstract class EncodingType { 
    public String encode(String s) { return s; } 
} 

public class Base64Encoding extends EncodingType { 
    public String encode(String s) { base64Encode(s); } // Assume "base64Encode" is defined 
} 

public class Rot13Encoding extends EncodingType { 
    public String encode(String s) { rot13Encode(s); } // Assume "rot13Encode" is defined 
} 

public class Encoder { 
    public String[] encodeArray(String[] s, EncodingType enc) { 
     for (int i = 0; i < s.length; i++) { 
      s[i] = enc.encode(s[i]); 
     } 
     return s; 
    } 
} 

Usted lo llamaría así:

Encoder e = new Encoder(); 
String[] strs = { ... }; 
strs = e.encodeArray(strs, new Rot13Encoding()); 
+0

'static'? ¿no? métodos estáticos sin 'estática'? –

Cuestiones relacionadas