Declarar un método en subclase que ya está presente en clase de padres se conoce como anulación de método. La anulación se realiza para que una clase secundaria pueda dar su propia implementación a un método que ya proporciona la clase principal. En este caso, el método de la clase principal se denomina método de anulación y el método de la clase secundaria se denomina método de anulación. En esta guía, veremos qué método anula en Java y por qué lo usamos.

Ejemplo de sustitución de método

Tomemos un ejemplo simple para entender esto. Tenemos dos clases: una clase para niños y una clase para padres humanos. La Boy la clase se extiende Human clase. Ambas clases tienen un método común void eat(). La clase Boy está dando su propia implementación a eat() método o, en otras palabras, está anulando el eat() método.

El propósito de la anulación del método es claro aquí. La clase Child quiere proporcionar su propia implementación para que cuando llame a este método, imprima Boy está comiendo en lugar de Human está comiendo.

class Human{
   //Overridden method
   public void eat()
   {
      System.out.println("Human is eating");
   }
}
class Boy extends Human{
   //Overriding method
   public void eat(){
      System.out.println("Boy is eating");
   }
   public static void main( String args[]) {
      Boy obj = new Boy();
      //This will call the child class version of eat()
      obj.eat();
   }
}

Producción:

Boy is eating

Ventaja de anular el método

La principal ventaja de anular el método es que la clase puede proporcionar su propia implementación específica a un método heredado. sin siquiera modificar el código de la clase principal.

Esto es útil cuando una clase tiene varias clases secundarias, por lo que si una clase secundaria necesita usar el método de la clase principal, puede usarlo y otras clases que quieran tener una implementación diferente pueden usar la funcionalidad de anulación para realizar cambios sin tocar el código padre de la clase.

leer  Interfaces de etiqueta o marcador Java

Reemplazo del método y envío del método dinámico

El método Overriding es un ejemplo de polimorfismo en tiempo de ejecución. Cuando una referencia a la clase principal apunta al objeto de la clase secundaria, la llamada al método anulado se determina en tiempo de ejecución, porque durante la llamada al método qué método (clase principal o clase secundaria) se va a ejecutar está determinado por el tipo de objeto . Este proceso en el que la llamada al método reemplazado se resuelve en tiempo de ejecución se conoce como envío de método dinámico. Veamos un ejemplo para entender esto:

class ABC{
   //Overridden method
   public void disp()
   {
	System.out.println("disp() method of parent class");
   }	   
}
class Demo extends ABC{
   //Overriding method
   public void disp(){
	System.out.println("disp() method of Child class");
   }
   public void newMethod(){
	System.out.println("new method of child class");
   }
   public static void main( String args[]) {
	/* When Parent class reference refers to the parent class object
	 * then in this case overridden method (the method of parent class)
	 *  is called.
	 */
	ABC obj = new ABC();
	obj.disp();

	/* When parent class reference refers to the child class object
	 * then the overriding method (method of child class) is called.
	 * This is called dynamic method dispatch and runtime polymorphism
	 */
	ABC obj2 = new Demo();
	obj2.disp();
   }
}

Producción:

disp() method of parent class
disp() method of Child class

En el ejemplo anterior, llamar al método disp () usando el segundo objeto (obj2) es polimorfismo en tiempo de ejecución (o envío de método dinámico).
Nota: Al enviar el método dinámico, el objeto puede llamar a los métodos sobrescritos de la clase secundaria y todos los métodos no sobrescritos de la clase base, pero no puede llamar a los métodos que se acaban de declarar en la clase secundaria. En el ejemplo anterior, el objeto obj2 está llamando al disp(). Sin embargo, si intenta llamar al newMethod() (que se declaró recientemente en la clase Demo) usando obj2, entonces daría un error de compilación con el siguiente mensaje:

Exception in thread "main" java.lang.Error: Unresolved compilation 
problem: The method xyz() is undefined for the type ABC

Reglas de método que anulan en Java

  1. Lista de argumentos: la lista de argumentos del método anulado (método de la clase secundaria) debe coincidir con el método anulado (el método de la clase principal). Los tipos de datos de los argumentos y su secuencia deben coincidir exactamente.
  2. El modificador de acceso del método reemplazado (método de subclase) no puede ser más restrictivo que el método reemplazado de la clase principal. Por ejemplo, si el modificador de acceso al método de la clase principal es público, el método de anulación (método de clase secundaria) no puede tener un modificador de acceso predeterminado, seguro y privado, porque los tres modificadores de acceso son más restrictivos para el público.
    Por ejemplo, esto es No permitido ya que el método disp de la clase secundaria es más restrictivo (protegido) que la clase base (pública)

    class MyBaseClass{
       public void disp()
       {
           System.out.println("Parent class method");
       }
    }
    class MyChildClass extends MyBaseClass{
       protected void disp(){
          System.out.println("Child class method");
       }
       public static void main( String args[]) {
          MyChildClass obj = new MyChildClass();
          obj.disp();
       }
    }

    Producción:

    Exception in thread "main" java.lang.Error: Unresolved compilation 
    problem: Cannot reduce the visibility of the inherited method from MyBaseClass

    Sin embargo, este es un escenario perfectamente válido ya que el público es menos restrictivo que el protegido. El mismo modificador de acceso también es válido.

    class MyBaseClass{
       protected void disp()
       {
           System.out.println("Parent class method");
       }
    }
    class MyChildClass extends MyBaseClass{
       public void disp(){
          System.out.println("Child class method");
       }
       public static void main( String args[]) {
          MyChildClass obj = new MyChildClass();
          obj.disp();
       }
    }

    Producción:

    Child class method
  3. los métodos privado, estático y final no se pueden anular ya que son locales de la clase. Sin embargo, los métodos estáticos se pueden volver a declarar en la subclase; en este caso, el método de la subclase actuará de manera diferente y no tendrá nada que ver con el mismo método estático que la clase principal.
  4. Anular el método (método de la clase secundaria) puede generar excepciones no comprobadas, independientemente de si el método anulado (método de la clase principal) arroja una excepción o no. Sin embargo, el método invalidado no debe generar excepciones comprobadas nuevas o mayores que las declaradas por el método invalidado. Discutiremos esto en detalle con el ejemplo en el próximo tutorial.
  5. El enlace de métodos anulados se produce en tiempo de ejecución, lo que se conoce como enlace dinámico.
  6. Si una clase está ampliando una clase abstracta o implementando una interfaz, debe anular todos los métodos abstractos a menos que la clase en sí sea una clase abstracta.
leer  Java - constructor parametrizado con ejemplo

Súper palabra clave en sustitución de métodos

La palabra clave super se utiliza para llamar al método / constructor de la clase principal. super.myMethod() llama al método myMethod () de la clase base while super() llama al constructor de la clase base. Veamos el uso de super en el método Overriding.
Como sabemos, anulamos un método en la clase secundaria, luego llamamos al método usando el objeto de la clase secundaria llama al método anulado. Usando super podemos llamar al método anulado como se muestra en el siguiente ejemplo:

class ABC{
   public void myMethod()
   {
	System.out.println("Overridden method");
   }	   
}
class Demo extends ABC{
   public void myMethod(){
	//This will call the myMethod() of parent class
	super.myMethod();
	System.out.println("Overriding method");
   }
   public static void main( String args[]) {
	Demo obj = new Demo();
	obj.myMethod();
   }
}

Producción:

Class ABC: mymethod()
Class Test: mymethod()

Como puede ver al usar la palabra clave super, podemos acceder al método anulado.

Por avivcas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *