variable usar sirve que para metodos metodo estaticos cuando clase java override method-overriding function-overriding

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.

  1. ¿Pueden los métodos estáticos ser anulados? En caso afirmativo, ¿cómo puede @Override ?
  2. Si los métodos estáticos no pueden anularse, ¿cómo es posible que mi tercer bloque de código funcione correctamente?
  3. 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.

  1. 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.

  2. 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!

  1. 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 clave final 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.