Interfaces#
Una interfaz es un tipo de contrato que define métodos que una clase debe implementar. Las interfaces permiten a las clases que no están relacionadas heredar comportamientos comunes.
Ejemplo de una interfaz en Java:
interface Volador {
void volar();
}
class Pajaro implements Volador {
public void volar() {
System.out.println("El pájaro está volando.");
}
}
class Avion implements Volador {
public void volar() {
System.out.println("El avión está volando.");
}
}
public class Main {
public static void main(String[] args) {
Volador pajaro = new Pajaro();
pajaro.volar();
Volador avion = new Avion();
avion.volar();
}
}
Aquí, tanto Pajaro
como Avion
implementan la interfaz Volador
, asegurando que ambos tengan el comportamiento volar()
.
// Probar los códigos aquí
Características en detalle:#
Definición de métodos#
Las interfaces permiten declarar métodos sin proporcionar una implementación. Estos métodos son abstractos por defecto, aunque desde Java 8 también pueden contener métodos predeterminados (con implementación) y métodos estáticos.
Las clases que implementan una interfaz están obligadas a proporcionar la implementación de estos métodos abstractos.
Ejemplo de un método abstracto en una interfaz:
interface Animal {
void hacerSonido(); // método abstracto
}
Métodos predeterminados (default)#
Desde Java 8, las interfaces pueden contener métodos con una implementación usando la palabra clave
default
. Esto permite extender las interfaces sin romper las clases que las implementan.Ejemplo:
interface Animal {
default void respirar() {
System.out.println("Este animal respira.");
}
void hacerSonido(); // método abstracto
}
Métodos estáticos#
También desde Java 8, las interfaces pueden definir métodos estáticos que pueden ser invocados sin necesidad de una instancia de la interfaz.
Ejemplo:
interface Animal {
static void informacionGeneral() {
System.out.println("Los animales son seres vivos.");
}
}
public class Main {
public static void main(String[] args) {
Animal.informacionGeneral(); // llamada a método estático
}
}
Atributos en una interfaz#
Los atributos en una interfaz son siempre públicos, estáticos y finales (
public static final
). Esto significa que son constantes que no pueden cambiar su valor una vez asignados.Ejemplo:
interface Constantes {
int MAX_VELOCIDAD = 120; // public static final automáticamente
}
Herencia múltiple#
Una clase en Java no puede heredar de más de una clase, pero puede implementar múltiples interfaces. Esto permite la simulación de herencia múltiple, proporcionando más flexibilidad en el diseño del código.
Ejemplo:
interface Volador {
void volar();
}
interface Nadador {
void nadar();
}
class Pato implements Volador, Nadador {
public void volar() {
System.out.println("El pato vuela.");
}
public void nadar() {
System.out.println("El pato nada.");
}
}
No se pueden instanciar#
Las interfaces no pueden ser instanciadas directamente. No es posible crear un objeto de una interfaz, ya que no tiene una implementación completa de sus métodos. Sin embargo, se puede hacer referencia a un objeto de una clase que implementa la interfaz.
Ejemplo:
interface Animal {
void hacerSonido();
}
class Perro implements Animal {
public void hacerSonido() {
System.out.println("Guau Guau");
}
}
public class Main {
public static void main(String[] args) {
Animal perro = new Perro(); // una interfaz referenciando a su implementación
perro.hacerSonido();
}
}
Polimorfismo#
Las interfaces permiten el uso del polimorfismo, lo que significa que una referencia de tipo interfaz puede apuntar a cualquier objeto de una clase que implemente dicha interfaz.
Este es un aspecto crucial para diseñar sistemas extensibles y modulares.
Herencia en interfaces#
Las interfaces pueden heredar de otras interfaces. Esto permite extender el comportamiento de una interfaz base en una interfaz derivada.
Ejemplo:
interface Volador {
void volar();
}
interface SuperVolador extends Volador {
void volarRapido();
}
Interfaces funcionales#
Una interfaz funcional es aquella que tiene un único método abstracto, lo que la hace apta para expresiones lambda y métodos de referencia. Estas se introdujeron como parte de Java 8 para facilitar el desarrollo funcional.
Ejemplo:
@FunctionalInterface
interface Operacion {
int calcular(int a, int b);
}
public class Main {
public static void main(String[] args) {
Operacion suma = (a, b) -> a + b;
System.out.println(suma.calcular(3, 5));
}
}
Ventajas del uso de interfaces#
Flexibilidad: Las interfaces permiten definir múltiples comportamientos que pueden ser implementados por clases no relacionadas entre sí.
Desacoplamiento: Al definir contratos (interfaces), el código se vuelve más desacoplado y modular. El desarrollo se puede realizar independientemente de la implementación concreta.
Mantenimiento: Las interfaces ayudan a organizar el código y facilitan su mantenimiento, ya que permiten sustituir implementaciones sin alterar el contrato.
Conclusión#
Las interfaces, por lo tanto, son un pilar clave para la programación orientada a objetos, ya que permiten abstracción, polimorfismo, herencia múltiple y un diseño flexible y escalable.