Animal
que denota animales y creemos un método en ella voice
: " voz ":
public class Animal {
public void voice() {
System.out.println("¡Voz!");
}
}
Aunque acabamos de empezar a escribir el programa, lo más probable es que puedas ver el problema potencial: hay muchos animales en el mundo y todos “hablan” de manera diferente: los gatos maúllan, los patos graznan, las serpientes silban. Nuestro objetivo es simple: evitar crear un montón de métodos para emitir un voto. En lugar de crear métodos voiceCat()
para maullar, voiceSnake()
silbar, etc., queremos que voice()
la serpiente silbe, el gato maúlle y el perro ladre cuando se llame al método. Podemos lograr esto fácilmente utilizando el mecanismo de anulación de métodos (Override en Java) . Wikipedia ofrece la siguiente explicación del término "anulación": La anulación de métodos en la programación orientada a objetos es una de las características de un lenguaje de programación que permite que una subclase o clase secundaria proporcione una implementación específica de un método ya implementado en una de las superclases. o clases para padres. Es, en general, correcto. La anulación le permite tomar un método de una clase principal y escribir su propia implementación de este método en cada clase descendiente. La nueva implementación "reemplazará" al padre en la clase secundaria. Veamos cómo se ve esto con un ejemplo. Creemos 4 clases sucesoras para nuestra clase Animal
:
public class Bear extends Animal {
@Override
public void voice() {
System.out.println("Р-р-р!");
}
}
public class Cat extends Animal {
@Override
public void voice() {
System.out.println("¡Maullar!");
}
}
public class Dog extends Animal {
@Override
public void voice() {
System.out.println("¡Guau!");
}
}
public class Snake extends Animal {
@Override
public void voice() {
System.out.println("Ш-ш-ш!");
}
}
Un pequeño truco para el futuro: para anular los métodos de la clase principal, vaya al código de la clase descendiente en Intellij IDE a, presione Ctrl+O y seleccione " Anular métodos... " en el menú. Acostúmbrate a usar teclas de acceso rápido desde el principio, ¡acelerará la escritura de programas! Para establecer el comportamiento que queríamos, hicimos algunas cosas:
- Creamos un método en cada clase descendiente con el mismo nombre que el método en la clase principal.
-
Le dijimos al compilador que nombramos el método igual que en la clase principal por una razón: queríamos anular su comportamiento. Para este "mensaje" al compilador, ponemos una anotación @Override en el método .
La anotación @Override colocada encima de un método le dice al compilador (y a los programadores que leen su código también): “Todo está bien, esto no es un error ni mi olvido. Recuerdo que ese método ya existe y quiero anularlo". - Escribimos la implementación que necesitábamos para cada clase descendiente. Cuando se le llama, una serpiente
voice()
debe silbar, un oso debe gruñir, etc.
public class Main {
public static void main(String[] args) {
Animal animal1 = new Dog();
Animal animal2 = new Cat();
Animal animal3 = new Bear();
Animal animal4 = new Snake();
animal1.voice();
animal2.voice();
animal3.voice();
animal4.voice();
}
}
Salida de la consola: ¡ Guau! ¡Maullar! ¡Rrrr! ¡Shh! ¡Genial, todo funciona como debería! Creamos 4 variables de referencia de la clase principal Animal
y las asignamos a 4 objetos diferentes de las clases descendientes. Como resultado, cada objeto se comporta de manera diferente. Para cada una de las clases descendientes, el método anulado voice()
reemplazó al método "nativo" voice()
de la clase Animal
(que simplemente envía "¡Voz!" a la consola). La anulación tiene una serie de limitaciones:
-
El método anulado debe tener los mismos argumentos que el método principal.
Si un método
voice
en una clase principal acepta como entradaString
, el método anulado en la clase secundaria también debe aceptar como entradaString
; de lo contrario, el compilador arrojará un error:public class Animal { public void voice(String s) { System.out.println("¡Voz! " + s); } } public class Cat extends Animal { @Override//¡error! public void voice() { System.out.println("¡Maullar!"); } }
-
El método anulado debe tener el mismo tipo de retorno que el método principal.
De lo contrario, recibiremos un error de compilación:
public class Animal { public void voice() { System.out.println("¡Voz!"); } } public class Cat extends Animal { @Override public String voice() { //¡error! System.out.println("¡Maullar!"); return "¡Maullar!"; } }
-
El modificador de acceso de un método anulado tampoco puede diferir del "original":
public class Animal { public void voice() { System.out.println("¡Voz!"); } } public class Cat extends Animal { @Override private void voice() { //¡error! System.out.println("¡Maullar!"); } }
voice()
para todos en lugar de un montón de métodos voiceDog()
, voiceCat()
etc.
GO TO FULL VERSION