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
Respuesta
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.
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 :) –
@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'? –
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.
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.
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)
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());
'static'? ¿no? métodos estáticos sin 'estática'? –
- 1. C# Método estático vs instancia de objeto
- 2. compilador de C#: no se puede acceder método estático en un contexto no estático
- 3. No se puede acceder campo no estático
- 4. No se puede acceder al método de la clase complementaria del objeto complementario
- 5. ¿Cómo puedo acceder al método de clase y al método de instancia en ruby?
- 6. Clase anidada: no se puede acceder al campo no estático en el contexto estático
- 7. ¿Cómo se burlan de objeto en un método estático
- 8. Invocación de un método estático utilizando la reflexión
- 9. ¿Por qué mi método estático oculta mi método de instancia?
- 10. Usando método estático vs. método de objeto
- 11. No se puede llamar al mismo método estático del método idéntico de la misma clase
- 12. Acceso al método estático al constructor no estático?
- 13. ¿Por qué Java permite el acceso de un miembro estático con una instancia de objeto
- 14. Cómo sincronizar el método estático en java
- 15. No se puede acceder al archivo - WebClient.DownloadFile
- 16. ¿Cómo crear objetos utilizando un método de fábrica estático?
- 17. ¿Llamando al método estático en una clase?
- 18. Se necesita una referencia de objeto para acceder al miembro no estático
- 19. ¿Bloqueo de método sincronizado de Java en objeto o método?
- 20. cómo acceder al objeto de ventana padre utilizando jquery?
- 21. Sincronización en el método estático y de instancia
- 22. ¿Llamar método estático de instancia en PHP, desaprobación futuro?
- 23. No se puede hacer una referencia estática al método no estático (Android getApplicationContext())
- 24. ¿No se puede llamar al método estático de la clase como nombre de variable?
- 25. clase derivada Llamando al método estático de la clase base en su propio método estático
- 26. ¿Es posible acceder a una variable de instancia a través de un método estático?
- 27. ¿Cómo acceder a un método estático en C#?
- 28. Objeto versus diseño de método estático
- 29. Llamar al método estático genérico en PowerShell
- 30. C# no se puede acceder a un objeto eliminado
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