Concepto | Descripción | Snippet |
---|---|---|
Herencia | Es la capacidad de una clase hija para heredar atributos y métodos de una clase padre. |
|
Método super | Referencia al método de la clase padre. Se usa para llamar al constructor o método de la clase padre. |
|
Sobreescritura | Es la capacidad de una clase hija para redefinar el comportamiento de un método heredado de la clase padre. |
|
Polimorfismo | Es la capacidad de un objeto para tomar diferentes formas. Se logra mediante la sobreescritura de métodos en clases hijas. |
|
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. |
|
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. |
|
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:
- Permite crear métodos abstractos (sin implementación) y métodos con implementación.
- Puede tener propiedades y métodos privados.
- Se puede heredar de una sola clase abstracta, pero se pueden implementar múltiples interfaces.
- La clase abstracta puede proporcionar una implementación por defecto de algunos métodos.
Interfaz:
- Sólo permite definir métodos abstractos.
- No permite definir propiedades ni métodos privados.
- Se puede implementar múltiples interfaces en una sola clase.
- Una interfaz define un contrato que debe ser implementado por la clase que la implementa.
El constructor de una clase
Este tema he preferido tratarlo en el apartado de anatomía de una función