JavaRush /Blog Java /Random-ES /Mecanismo de anulación de métodos o Anulación en Java

Mecanismo de anulación de métodos o Anulación en Java

Publicado en el grupo Random-ES
¡Hola! Ya utilizas métodos en Java y sabes mucho sobre ellos. Probablemente te hayas encontrado con una situación en la que había muchos métodos en una clase con el mismo nombre pero con argumentos diferentes. Si recuerdas, en esos casos utilizamos el mecanismo de sobrecarga de métodos. Hoy veamos una situación diferente. Imagine que tenemos un método común, pero debería hacer cosas diferentes según la clase a la que se invocó. ¿Cómo implementar este comportamiento? Para resolverlo, tomemos una clase principal Animalque 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. Cómo funciona el mecanismo de anulación de métodos - 2 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:
  1. Creamos un método en cada clase descendiente con el mismo nombre que el método en la clase principal.
  2. 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".

  3. 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.
Veamos cómo funcionará esto en el programa:
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 Animaly 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). Cómo funciona el mecanismo de anulación de métodos - 3 La anulación tiene una serie de limitaciones:
  1. El método anulado debe tener los mismos argumentos que el método principal.

    Si un método voiceen una clase principal acepta como entrada String, el método anulado en la clase secundaria también debe aceptar como entrada String; 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!");
       }
    }

  2. 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!";
       }
    }

  3. 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!");
       }
    }
La anulación de métodos en Java es una de las herramientas para implementar la idea de polimorfismo (el principio de programación orientada a objetos, del que hablamos en la última conferencia). Por tanto, la principal ventaja de utilizarlo será la misma flexibilidad de la que hablamos anteriormente. Podemos construir un sistema de clases simple y lógico, cada una de las cuales tendrá un comportamiento específico (los perros ladran, los gatos maúllan), pero con una única interfaz: un método voice()para todos en lugar de un montón de métodos voiceDog(), voiceCat()etc.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION