Estoy confundido sobre la diferencia entre anular y esconderse en Java. ¿Alguien puede proporcionar más detalles sobre cómo se diferencian? Leí el Tutorial de Java pero el código de muestra todavía me dejó confundido.
Para ser más claro, lo entiendo bien. Mi problema es que no veo cómo la ocultación es diferente, excepto por el hecho de que uno está en el nivel de instancia mientras que el otro está en el nivel de clase.
Mirando el código del tutorial de Java:
public class Animal {
public static void testClassMethod() {
System.out.println("Class" + " method in Animal.");
}
public void testInstanceMethod() {
System.out.println("Instance " + " method in Animal.");
}
}
Entonces tenemos una subclase Cat
:
public class Cat extends Animal {
public static void testClassMethod() {
System.out.println("The class method" + " in Cat.");
}
public void testInstanceMethod() {
System.out.println("The instance method" + " in Cat.");
}
public static void main(String[] args) {
Cat myCat = new Cat();
Animal myAnimal = myCat;
Animal.testClassMethod();
myAnimal.testInstanceMethod();
}
}
Entonces dicen:
El resultado de este programa es el siguiente:
Método de clase en Animal.
El método de instancia en Cat.
Para mí, el hecho de que llamar a un método de clase testClassMethod()
directamente desde la Animal
clase ejecuta el método en Animal
clase es bastante obvio, no hay nada especial allí. Luego llaman a la testInstanceMethod()
de una referencia a myCat
, por lo que nuevamente es bastante obvio que el método ejecutado es el de la instancia de Cat
.
Por lo que veo, la ocultación de llamadas se comporta como anular, entonces, ¿por qué hacer esa distinción? Si ejecuto este código usando las clases anteriores:
Cat.testClassMethod();
Obtendré:
el método de clase en Cat.
Pero si elimino el testClassMethod()
de Cat, obtendré:
El método de clase en Animal.
Lo que me muestra que escribir un método estático, con la misma firma que en el padre, en una subclase prácticamente anula.
Ojalá esté dejando en claro dónde estoy confundido y alguien pueda arrojar algo de luz. ¡Muchas gracias de antemano!