Clases e Interfaces#

Objetivo#

Proporcionar a los estudiantes una comprensión sólida de los conceptos de objetos, interfaces y clases abstractas en Java. Los estudiantes aprenderán cómo utilizar estos elementos para diseñar software modular, flexible y mantenible. Al finalizar, los estudiantes serán capaces de diferenciar entre clases concretas, abstractas e interfaces, y aplicarlos en la creación de aplicaciones Java.

Clases Abstractas en Java#

Una clase abstracta no puede utilizarse para crear objetos. Una clase abstracta puede contener métodos abstractos que se implementan en subclases concretas.

Las clases abstractas en Java son clases que no pueden ser instanciadas directamente y están diseñadas para ser extendidas por otras clases. Estas clases pueden contener tanto métodos abstractos (sin implementación) como métodos concretos (con implementación). Las clases abstractas permiten la creación de una jerarquía de clases con comportamiento común.

Definición#

  • Una clase abstracta se define utilizando la palabra clave abstract.

  • Las clases hijas deben proporcionar la implementación de todos los métodos abstractos de la clase padre.

abstract class Animal {
  String name;
  abstract void hacerSonido(); // Método abstracto
  
  public void dormir() {
      System.out.println("El animal está durmiendo.");
  }
}

class Perro extends Animal {
  public void hacerSonido() {
      System.out.println("El perro ladra.");
  }
}

public class TestAnimal {
  public static void main(String[] args) {
      Animal perro = new Perro();
      perro.hacerSonido();
      perro.dormir();
  }
}

// Agregue aquí su código
// Animal animal = new Animal()

Ejercicio Práctico#

  • Crear una clase abstracta Figura con un método abstracto calcularArea.

  • Extender la clase abstracta con las clases Circulo y Rectangulo, proporcionando la implementación de calcularArea y calcularPerimetro.

  • Instanciar objetos de Circulo, Rectangulo, Triangulo, y otro de gusto. Además, calcular sus áreas.

// Agregue aquí su código

Interfaces en Java#

Una interfaz es una construcción similar a una clase para definir operaciones comunes para objetos.

Las interfaces en Java son contratos que definen un conjunto de métodos que una clase debe implementar. A diferencia de las clases, las interfaces no pueden contener implementación de métodos (antes de Java 8) y no pueden tener atributos no finales. Son utilizadas para asegurar que una clase cumple con ciertos requisitos de comportamiento, independientemente de la jerarquía de herencia.

Definición#

  • Una interfaz se define utilizando la palabra clave interface.

  • Las clases que implementan una interfaz deben proporcionar la implementación concreta de todos sus métodos.

interface Volador {
  public String name = "Volador";
  void volar(); // Método abstracto
}

class Pajaro implements Volador {
  public void volar() {
      System.out.println("El pájaro está volando."+ name);
  }
}

public class Main {
  public static void main(String[] args) {
      Volador pajaro = new Pajaro();
      pajaro.volar();
      //pajaro.name;
  }
}

// Agregue aquí su código
Main main = new Main();
main.main(new String[] {});
El pájaro está volando.Volador
// Volador vol = new Volador()

Ejercicio Práctico#

  • Crear una interfaz Comible con un método comer.

  • Implementar la interfaz en una clase Ensalada, Pasta, etc.

  • Crear un objeto de Ensalada y demostrar el uso de la interfaz Comible.

// Agregue aquí su código

Clase Abstracta vs Interfaz#

Las clases abstractas son similares a las interfaces. No se pueden instanciar y pueden contener una mezcla de métodos declarados con o sin implementación. Sin embargo, con las clases abstractas puedes declarar campos que no sean static y final, y definir métodos concretos públicos, protegidos y privados. Con las interfaces, todos los campos son automáticamente públicos, estáticos y finales, y todos los métodos que declares o definas (como métodos por defecto) son públicos. Además, sólo puedes extender una clase, sea abstracta o no, mientras que puedes implementar cualquier número de interfaces.

¿Qué debe utilizar, clases abstractas o interfaces?

  • Considere el uso de clases abstractas si alguna de estas afirmaciones se aplica a su situación:

    • Desea compartir código entre varias clases estrechamente relacionadas.

    • Esperas que las clases que extienden tu clase abstracta tengan muchos métodos o campos comunes, o requieran modificadores de acceso distintos de public (como protected y private).

    • Desea declarar campos no estáticos o no finales. Esto le permite definir métodos que pueden acceder y modificar el estado del objeto al que pertenecen.

  • Considere la posibilidad de utilizar interfaces si alguna de estas afirmaciones se aplica a su situación:

    • Espera que clases no relacionadas implementen su interfaz. Por ejemplo, las interfaces Comparable y Clonable son implementadas por muchas clases no relacionadas.

    • Desea especificar el comportamiento de un tipo de datos concreto, pero no le preocupa quién implementa su comportamiento.

    • Desea aprovechar las ventajas de la herencia múltiple de tipo.

Trulli
Tomado de Abstract Methods and Classes
Tomado de Difference between Abstract class and Interface in Java 8? Answer

Why not override instead of using abstract class?

Ejercicio#

Taller 2

Diseñar un sistema de gestión para una librería utilizando objetos, interfaces y clases abstractas en Java.

Instrucciones

  1. Crear una interfaz GestiónProducto con métodos como vender y mostrarDetalles.

  2. Crear una clase abstracta Producto que implemente la interfaz y añada un método abstracto calcularPrecio.

  3. Extender Producto en clases concretas como Libro, Revista, y CD, implementando los métodos abstractos y específicos para cada tipo de producto.

  4. Crear un programa principal donde se instancien los objetos y se demuestren sus comportamientos, como vender productos y mostrar sus detalles.

Entregables

  • Código fuente en Java que implementa el sistema de gestión de la librería.

Conclusión#

En esta clase, hemos explorado tres conceptos fundamentales en Java: objetos, interfaces y clases abstractas. Cada uno de estos elementos juega un papel crucial en la programación orientada a objetos, permitiendo la creación de software más modular y adaptable. Los objetos encapsulan datos y comportamientos, las interfaces permiten definir contratos de comportamiento, y las clases abstractas proporcionan una estructura común para diferentes implementaciones. Comprender y aplicar correctamente estos conceptos es esencial para cualquier desarrollador de Java que busque crear aplicaciones robustas y escalables.

Recursos Adicionales#

Guías y Tutoriales#

Videos#