CodeGym /Blog Java /Random-ES /Clases y métodos abstractos de Java
Autor
Pavlo Plynko
Java Developer at CodeGym

Clases y métodos abstractos de Java

Publicado en el grupo Random-ES
Los métodos abstractos son una poderosa herramienta de Java y le dan a este lenguaje orientado a objetos aún más capacidades cuando se trata de polimorfismo. Se puede usar un método abstracto de Java para crear un marco básico para un programa completo y permitirle ajustarlo según sea necesario.Método abstracto de Java y usted - 1

¿Qué es un método abstracto?

Un método abstracto es un método que no tiene implementación. Es decir, solo tiene una declaración, por lo que conoce el nombre, el tipo de devolución y las variables que aceptará. Aquí hay un ejemplo de un método abstracto básico:

public abstract int example(int a1, int a2);
Cuando observa este método, puede ver que devuelve un número entero y acepta dos números enteros como argumento. Lo que no se puede decir es cómo se implementa este método. Eso es porque para implementarlo, tienes que anularlo. Al crear un método abstracto en Java, debe cumplir con algunas pautas o su programa no se compilará correctamente. Recordar:
  • Los métodos abstractos de Java no tienen implementación. Es decir, nunca deben ir seguidos de llaves y un cuerpo que indique cómo se utilizará el método. Solo se termina con un punto y coma.

  • Si crea un método abstracto, solo se puede poner en una clase abstracta. Es decir, no puede tener una clase concreta que tenga un método abstracto dentro de ella.
    i. Como nota al margen, si tiene una clase abstracta, puede contener constructores. Sin embargo, no tiene que tener un método abstracto.

  • Cuando una clase concreta extiende una clase abstracta, también debe implementar todos los métodos abstractos de la clase principal o no puede ser concreta y debe declararse abstracta.

Esos dos últimos pueden ser un poco confusos, así que aclaremos eso de inmediato.

Ampliación de clases abstractas de Java

Digamos que queremos escribir un programa sobre formas básicas que devuelvan el perímetro y el área. Entonces creamos una clase abstracta principal. Pero debido a que cada forma tiene sus propias reglas, cada una debe calcularse de manera diferente, por lo que escribimos la clase Forma abstracta de esta manera:

abstract class Shape {
  		String shapeName = " ";
  		Shape(String name) { 
    			this.shapeName = name; 
  		} 

abstract double area();
  		abstract double perimeter();
}
Ahora, si realmente queremos usar estos métodos abstractos, tenemos que extender la forma abstracta de la clase principal de Java y luego instanciar los métodos. Por lo tanto, cada clase concreta debe implementar los métodos abstractos de área y perímetro.

class Quadrilateral extends Shape  
{ 
    double length, width; 
      
    Quadrilateral(double l, double w, String name) 
    { 
        super(name); 
        this.length = l; 
        this.width = w; 
    } 
      
    @Override
    public double perimeter()  
    { 
        return ((2*length)+(2*width));
    } 
      
    @Override
    public double area()  
    { 
        return (length*width); 
    } 
}

Implementing the Quadrilateral class would then look like this
class Main
{ 
    public static void main (String[] args)  
    { 
      
        // creating a Quadrilateral object using Shape as reference 
        Shape rectangle = new Quadrilateral(3,4, "Rectangle"); 
        System.out.println("Area of rectangle is " + rectangle.area()); 
        System.out.println("Perimeter of rectangle is " + rectangle.perimeter());
  
    } 
} 
La salida de la consola se ve así:

Area of rectangle is 12.0
Perimeter of rectangle is 14.0
Tenga en cuenta que la clase Quadrilateral no tiene que instanciar el constructor Shape(String name) de la clase principal Shape . Eso es porque no es un método abstracto. Sin embargo, si solo implementaste un área o un perímetro en una clase, la nueva clase tendría que ser abstracta porque no incluía ambos. También puede usar métodos abstractos en Interfaces.

Métodos abstractos de Java con interfaces

Repasemos rápidamente qué es una interfaz y en qué se diferencia de una clase abstracta. En una interfaz, cualquier variable declarada en una interfaz es pública, estática y final. Las clases abstractas, por otro lado, solo tienen variables no finales. Todo en una interfaz es público por defecto. Una clase abstracta puede tener privado, protegido, público, etc. Finalmente, una clase no extiende una interfaz, la implementa. Antes de JDK 8, una interfaz no podía tener nada más que métodos abstractos. Ahora, una interfaz puede tener métodos predeterminados y estáticos. Debido a esto, las mejores prácticas se han alejado del uso de métodos abstractos como plantillas ampliables y se han centrado en las interfaces y su implementación. Entonces, si tuviera que crear Shape como una interfaz y luego implementarla como Quadrilateral, ¿cómo sería? Primero, tendría que eliminar el constructor Shape(String name) . Se vería así con solo los dos métodos abstractos:

interface Shape {

  abstract double area();
  abstract double perimeter();
}


So the Quadrilateral class would then look like this:
class Quadrilateral implements Shape {  

  double length, width; 
      
    	  Quadrilateral(double l, double w) {
    
    	    this.length = l; 
    	    this.width = w; 
    	  } 
      
    	  @Override
    	  public double perimeter() {
     
    	    return ((2*length)+(2*width));
    	  } 
      
    	  @Override
    	  public double area() {
    
   	    return (length*width); 
    	  } 
}
Finalmente, usar el nuevo Cuadrilátero , ya que implementa la interfaz Shape , sería muy similar:

class Main
{ 
    public static void main (String[] args)  
    { 
      
        // creating a Quadrilateral object using Shape as reference 
        Shape rectangle = new Quadrilateral(3,4); 
        System.out.println("Area of rectangle is " + rectangle.area()); 
        System.out.println("Perimeter of rectangle is " + rectangle.perimeter());
  
    } 
}
Y la impresión de la consola se vería así:

Area of rectangle is 12.0
Perimeter of rectangle is 14.0
Si desea explorar más sobre las diferencias entre las interfaces y las clases abstractas, puede encontrar más información aquí.

Pero, ¿por qué usar métodos abstractos de Java?

Hay muchas razones por las que se utilizan métodos abstractos en Java y por las que debería sentirse cómodo usándolos. Aquí hay tres razones rápidas por las que debe usarlos cuando sea apropiado.
  1. Evite la duplicación de esfuerzos: mire hacia atrás en nuestra codificación de ejemplo; imagine que usted y su equipo necesitaron crear clases para formas que no sean un rectángulo. ¿Cuántas formas diferentes hay que se te ocurran para diseñar esa clase? ¿Diez? ¿Quince? Y ese es un problema simple. Imagina algo mucho más complejo. Usted y su equipo podrían idear cientos de formas. Entonces se enfrentaría a la abrumadora tarea de entretejerlos en un programa coherente. Esto nos lleva al siguiente punto: definir la implementación.

  2. Los métodos abstractos en Java permiten la definición de uso e implementación: cuando usa una clase o interfaz abstracta y, por diseño, métodos abstractos, está definiendo cómo otras personas interactuarán con su interfaz. Eso les permite saber qué variables deberían usar y qué tipos de retorno pueden esperar.
    Si bien pueden anularlos y crear clases concretas que implementen su interfaz de maneras únicas, aún establece el uso principal de su código. Si alguien quiere implementar Forma, entonces tiene que anular o implementar tanto el perímetro como el área.

  3. Legibilidad y depuración: tener métodos abstractos mejorará la legibilidad de su código. Cuando escribe una clase que implementa una interfaz, sabe qué buscar. Usted sabe que cada método abstracto en la interfaz estará en la implementación, y eso hace que sea más fácil de leer y rastrear cualquier error. Los métodos abstractos son solo el comienzo de aprender a usar correctamente el polimorfismo en Java y otros lenguajes orientados a objetos. Cuando comience a comprenderlos y usarlos, comenzará un capítulo completamente nuevo en su viaje de codificación.

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION