Iagovar

Chuleta de Clases en Java

Herencia, el método súper, sobreescritura, polimorfismo, clases abstractas, interfaces
Concepto Descripción Snippet
Herencia Es la capacidad de una clase hija para heredar atributos y métodos de una clase padre.
class Animal {...} class Perro extends Animal {...}
Método super Referencia al método de la clase padre. Se usa para llamar al constructor o método de la clase padre.
class Animal {...} class Perro extends Animal {public Perro() { super(); ...}}
Sobreescritura Es la capacidad de una clase hija para redefinar el comportamiento de un método heredado de la clase padre.
class Animal { public void hablar() {...} } class Perro extends Animal {public void hablar() {...} }
Polimorfismo Es la capacidad de un objeto para tomar diferentes formas. Se logra mediante la sobreescritura de métodos en clases hijas.
Animal animal = new Perro(); animal.hablar();
Clases abstractas Son clases que no pueden ser instanciadas, pero sirven como base para otras clases. Contienen métodos abstractos que deben ser implementados por las clases hijas.
abstract class Animal { public abstract void hablar(); } class Perro extends Animal {public void hablar() {...} }
Interfaces Son un conjunto de métodos y constantes que deben ser implementados por una clase. Permiten una forma de definir un comportamiento que deben tener ciertas clases.
interface Hablador { public void hablar(); } class Perro implements Hablador {public void hablar() {...} }

Herencia

Es una relación entre dos clases, donde una clase se deriva de otra clase existente. La clase que se deriva se llama la clase hija y la clase de la cual se deriva se llama la clase padre. La clase hija hereda todos los atributos y métodos de la clase padre.


class Animal {
  public void makeSound() {
    System.out.println("El animal hace un sonido");
  }
}

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

El método súper

Es una palabra clave que se utiliza para hacer referencia a la clase padre. Se utiliza para llamar al método de la clase padre desde la clase hija.

    
  class Animal {
    public void makeSound() {
      System.out.println("El animal hace un sonido");
    }
  }

  class Perro extends Animal {
    @Override
    public void makeSound() {
      super.makeSound();
      System.out.println("El perro ladra");
    }
  }
  
  

Sobreescritura

Es una técnica en la que una clase hija proporciona una nueva implementación para un método que ya existe en la clase padre.

La anotación @Override se utiliza para indicar que se está sobreescribiendo un método, y de esta forma si el compilador detecta que no hay un método con el mismo nombre en la clase padre, nos avisará, en lugar de interpretarlo como un método nuevo.

Hay quien dice que también ayuda a una mayor legibilidad del código, pero es cuestión de gustos.


class Animal {
  public void makeSound() {
    System.out.println("El animal hace un sonido");
  }
}

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

Polimorfismo

Es una característica de la programación orientada a objetos que permite que un objeto de una clase derivada tenga un comportamiento diferente a su clase base.

En Java, el polimorfismo se logra mediante la sobreescritura de métodos en clases hijas y la implementación de interfaces.


class Animal {
  void emitirSonido() {
    System.out.println("Sonido genérico de animal");
  }
}

class Perro extends Animal {
  void emitirSonido() {
    System.out.println("Guau");
  }
}

class Gato extends Animal {
  void emitirSonido() {
    System.out.println("Miau");
  }
}

public class Main {
  public static void main(String[] args) {
    Animal perro = new Perro();
    Animal gato = new Gato();
    perro.emitirSonido(); // imprime "Guau"
    gato.emitirSonido(); // imprime "Miau"
  }
}

Clases abstractas

Las clases abstractas en Java son clases que no pueden ser instanciadas directamente.

Se utilizan como una base común para otras clases y deben ser extendidas para poder ser instanciadas. Las clases abstractas pueden tener métodos abstractos, que no tienen una implementación y deben ser sobreescritos por clases hijas.


abstract class Animal {
  abstract void emitirSonido();
}

class Perro extends Animal {
  void emitirSonido() {
    System.out.println("Guau");
  }
}

class Gato extends Animal {
  void emitirSonido() {
    System.out.println("Miau");
  }
}

public class Main {
  public static void main(String[] args) {
    Animal perro = new Perro();
    Animal gato = new Gato();
    perro.emitirSonido(); // imprime "Guau"
    gato.emitirSonido(); // imprime "Miau"
  }
}

Este ejemplo puede parecer el mismo que el de polimorfismo, pero fíjate bien en la clase Animal. El método emitirSonido() está vacío en la clase abstracta, e insisto, dicha clase no se puede instanciar, sólo las hijas que la extienden.

Interfaces

Las interfaces en Java son un tipo de clase que solo contiene métodos abstractos y variables constantes.

Las clases que implementan una interfaz deben proporcionar una implementación para todos sus métodos.

Las interfaces permiten definir un comportamiento que debe ser implementado por múltiples clases, sin importar su jerarquía de herencia.


interface Animales {
   public void comunicarse();
   public void dormir();
}

class Perro implements Animales {
   public void comunicarse() {
      System.out.println("El perro ladra");
   }

   public void dormir() {
      System.out.println("El perro duerme");
   }
}

class Gato implements Animales {
   public void comunicarse() {
      System.out.println("El gato maulla");
   }

   public void dormir() {
      System.out.println("El gato duerme");
   }
}

¿Qué casos de uso tienen las interfaces?

Cuando uno quiere que diferentes clases implementen una serie de métodos, pero estas clases no tienen una relación jerárquica entre ellos, puede ser un dolor de cabeza.

Para esto se inventaron las interfaces, que permiten establecer una estructura de métodos común independientemente de qué posición jerárquica ocupe la clase que implemente, facilitando así las cosas sin tener que comerse el tarro con las herencias.

Clases abstractas VS Interfaces

La interfaz se utiliza cuando sólo se desea declarar qué métodos y miembros DEBE tener una clase. Cualquiera que implemente la interfaz tendrá que declarar e implementar los métodos enumerados por la interfaz.

Si además quieres tener una implementación por defecto, utiliza la clase abstracta. Cualquier clase que extienda la clase abstracta tendrá que implementar sólo sus métodos y miembros abstractos, y tendrá alguna implementación por defecto de los otros métodos de la clase abstracta, que puedes anular o no.

Por último, puedes implementar tantas interfaces como quieras, pero sólo extender una clase (sea abstracta o no). Tenlo en cuenta antes de elegir.

Traducido de aquí.

Clase abstracta:

Interfaz:

El constructor de una clase

Este tema he preferido tratarlo en el apartado de anatomía de una función

Más info