usar - public static java
Si los métodos estáticos no pueden anularse, ¿cómo funciona aquí(para Java)? (3)
Según entendí, las variables estáticas y los métodos estáticos son de una clase, no de los objetos de la clase. Por lo tanto, la Override
de un método estático no funcionará en Java, ya que para anular necesitamos que se cree una instancia de una clase. Pero hoy intenté algo que contradecía mi conocimiento de Java.
Por favor, siga este código:
class Parent{
public static void doIt(){
System.out.println("In static method ''doit'' of class Parent ");
}
}
class Child extends Parent{
public static void doIt(){
System.out.println("In static method ''doit'' of class Child ");
}
}
public class StaticPractise{
public static void main(String[] args){
Parent.doIt();
Child.doIt();
}
}
El resultado de la implementación anterior es:
D:/Rahul Shivsharan/MyPractise/JAVA>java StaticPractise
In static method ''doit'' of class Parent
In static method ''doit'' of class Child
A partir de este resultado, puedo entender que aunque la clase Child
amplía la clase Parent
, los métodos doit
son individuales para cada clase, ya que son static
. Por lo tanto, no se permite su anulación.
Ahora, por favor, siga el siguiente código, donde @Override
se agrega al método doIt
del niño:
class Parent{
public static void doIt(){
System.out.println("In static method ''doit'' of class Parent ");
}
}
class Child extends Parent{
@Override // Adding this annotation here
public static void doIt(){
System.out.println("In static method ''doit'' of class Child ");
}
}
public class StaticPractise{
public static void main(String[] args){
Parent.doIt();
Child.doIt();
}
}
El resultado del código anterior proporciona un error de compilación de la siguiente manera:
D:/Rahul Shivsharan/MyPractise/JAVA>javac StaticPractise.java
StaticPractise.java:31: error: method does not override or implement a method from a supertype
@Override
^
1 error
Aquí dice claramente que la Override
no se puede aplicar en métodos static
ya que no se anulan.
Ahora, por favor, siga el siguiente código, donde el Child
no tiene ningún método doIt
:
class Parent{
public static void doIt(){
System.out.println("In static method ''doit'' of class Parent ");
}
}
class Child extends Parent{ /* no doIt method */ }
public class StaticPractise{
public static void main(String[] args){
Parent.doIt();
Child.doIt();
}
}
El resultado es:
D:/Rahul Shivsharan/MyPractise/JAVA>java StaticPractise
In static method ''doit'' of class Parent
In static method ''doit'' of class Parent
¿Por qué se compila y ejecuta el código anterior? Esperaba un error de compilación para el método doit
para la clase Child, y esperaba "Method not found". No entiendo.
También por favor siga el código a continuación. Aquí, el método doIt
en Parent
ahora es final
.
class Parent{
public static final void doIt(){ // now final
System.out.println("In static method ''doit'' of class Parent ");
}
}
class Child extends Parent{
public static void doIt(){
System.out.println("In static method ''doit'' of class Parent ");
}
}
public class StaticPractise{
public static void main(String[] args){
Parent.doIt();
Child.doIt();
}
}
La salida después de ejecutar el código anterior es la siguiente:
D:/Rahul Shivsharan/MyPractise/JAVA>javac StaticPractise.java
StaticPractise.java:30: error: doIt() in Child cannot override doIt() in Parent
public static void doIt(){
^
overridden method is static,final
1 error
D:/Rahul Shivsharan/MyPractise/JAVA>
Lo que esperaba era que el código anterior funcionara bien ya que los métodos de doit
son estáticos en cada clase, por lo que incluso una palabra clave final
no debería generar ningún error de compilación ya que el método es static
.
Explíqueme cómo funciona la anulación de métodos en clases estáticas en Java.
- ¿Pueden los métodos estáticos ser anulados? En caso afirmativo, ¿cómo puede
@Override
? - Si los métodos estáticos no pueden anularse, ¿cómo es posible que mi tercer bloque de código funcione correctamente?
- Si no se pueden anular los métodos estáticos, ¿cómo es que la palabra clave
final
marca la diferencia?
Aunque no se recomienda hacer 3 preguntas en una publicación, todavía estoy dispuesto a responderlas.
Los métodos estáticos no pueden anularse porque no tiene sentido hacer eso. En su caso, si desea anular el método estático, puede llamar al método y agregar su propia implementación después de eso o simplemente crear otro método.
Ahora que sabe que los métodos estáticos no pueden anularse. ¿Pero estás preguntando por qué funciona el tercer código? El tercer código es el código con
clase pública Child extends Parent {}
¿derecho? Aunque los métodos estáticos no pueden anularse, se pueden heredar . Lo que estás haciendo es heredar Parent
así que está completamente bien!
- Ahora déjame decirte, en tu primer ejemplo de código ocultas el método en la clase para
Parent
, sin anular. Es por eso que obtienes la salida. Una palabra clavefinal
significa que el método nunca se puede cambiar, ni siquiera esconder. Asi que es por eso.
En primer lugar, hay diferentes mecanismos involucrados aquí: anulación y sombreado (también llamado ocultación) .
1) Los métodos estáticos no pueden anularse ya que están adjuntos a la clase en la que están definidos. Sin embargo, puede ocultar / ocultar un método estático como lo hace con su clase principal / Child
. Esto significa que el método se reemplaza en la clase Child
pero todavía está disponible en la clase Parent
.
Se hace más obvio que no está anulando cuando llama a los métodos estáticos de instancias de esas clases (y no utiliza la invocación Class.staticMethod()
).
Parent parent = new Parent();
Child child1 = new Child();
Parent child2 = new Child();
parent.StaticMethod();
child1.StaticMethod();
child2.StaticMethod();
la salida es
Static method from Parent
Static method from Child
Static method from Parent
La respuesta es el envío de los métodos. Puedes agarrar el código fuente aquí
2) El envío encuentra el método en la clase Parent
. No hay despacho dinámico ya que el tipo de tiempo de ejecución se utiliza para encontrar el manejador del método. Utiliza el tipo de tiempo de compilación. Recuerde : Llamar a los métodos estáticos de las instancias se considera una mala práctica, ya que pueden suceder cosas como las anteriores y es fácil pasarlas por alto.
3) Con el final
, declara que el método no puede ser anulado ni sombreado / oculto.
Estás confundiendo overriding con hiding