Introducción a las Interfaces
Parte de la sección Programación Orientada a Objetos del Journey de Java de Coddy — lección 34 de 87.
Has visto cómo las clases abstractas definen contratos que las subclases deben seguir. Pero, ¿qué pasa si quieres que una clase siga múltiples contratos? Java no permite que una clase extienda múltiples clases, pero resuelve este problema con interfaces.
Una interfaz es un contrato que define lo que una clase puede hacer, sin especificar cómo lo hace. A diferencia de las clases abstractas, las interfaces contienen solo firmas de métodos (por defecto) sin implementación:
public interface Drawable {
void draw();
}
public interface Resizable {
void resize(int width, int height);
}Piense en una interfaz como una promesa. Cuando una clase implementa una interfaz, promete proporcionar implementaciones para todos los métodos declarados en esa interfaz. La interfaz define la capacidad, y la clase proporciona el comportamiento.
Las interfaces se declaran utilizando la palabra clave interface en lugar de class. Todos los métodos en una interfaz son implícitamente public y abstract, por lo que no es necesario escribir esas palabras clave:
public interface Playable {
void play(); // implícitamente public abstract
void pause();
void stop();
}Las interfaces también pueden declarar constantes, que son implícitamente public static final:
public interface GameConstants {
int MAX_PLAYERS = 4; // implícitamente public static final
}En la siguiente lección, aprenderás cómo las clases implementan interfaces utilizando la palabra clave implements.
Desafío
FácilVamos a construir un sistema de control de dispositivos definiendo interfaces que describan lo que pueden hacer diferentes dispositivos. Este desafío se centra en la creación de interfaces: los contratos que definen capacidades sin especificar cómo funcionan.
Organizarás tu código en tres archivos:
Switchable.java: Crea una interfaz que defina lo que significa que un dispositivo sea conmutable. Cualquier dispositivo conmutable debe poder encenderse y apagarse. Declara dos métodos:turnOn()yturnOff(). Recuerda que los métodos de interfaz son implícitamente públicos y abstractos, por lo que solo necesitas las firmas de los métodos.Adjustable.java: Crea otra interfaz que defina lo que significa que un dispositivo sea ajustable. Un dispositivo ajustable debe poder establecer su nivel. Declara un métodosetLevel(int level). También incluye una constanteMAX_LEVELcon un valor de100; recuerda que las constantes en las interfaces son implícitamentepublic static final.Main.java: Demuestra que tus interfaces están correctamente definidas imprimiendo información sobre ellas. Recibirás una entrada: un valor de nivel (int). Imprime las siguientes tres líneas:Switchable methods: turnOn, turnOffAdjustable methods: setLevelMax level constant: [MAX_LEVEL value](accede a la constante desde la interfaz Adjustable)
Setting level to: [input level]
Recibirás una entrada: un valor de nivel (int).
Este desafío se centra puramente en la definición de interfaces: los planos que describen las capacidades. ¡En la próxima lección, aprenderás cómo las clases implementan realmente estas interfaces para proporcionar el comportamiento real!
Hoja de referencia
Una interfaz es un contrato que define lo que una clase puede hacer, sin especificar cómo lo hace. Las interfaces contienen solo firmas de métodos sin implementación.
Las interfaces se declaran utilizando la palabra clave interface:
public interface Drawable {
void draw();
}Todos los métodos en una interfaz son implícitamente public y abstract:
public interface Playable {
void play(); // implícitamente public abstract
void pause();
void stop();
}Las interfaces pueden declarar constantes, las cuales son implícitamente public static final:
public interface GameConstants {
int MAX_PLAYERS = 4; // implícitamente public static final
}Una clase puede implementar múltiples interfaces, a diferencia de extender múltiples clases.
Pruébalo tú mismo
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int level = scanner.nextInt();
// TODO: Imprimir información sobre las interfaces
// Imprimir: "Switchable methods: turnOn, turnOff"
// Imprimir: "Adjustable methods: setLevel"
// Imprimir: "Max level constant: " seguido de Adjustable.MAX_LEVEL
// Imprimir: "Setting level to: " seguido del nivel de entrada
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de OOP
Archivos externosIntroducción a la OOPClases vs. ObjetosLa palabra clave thisMétodosCampos (Atributos)Método constructorSobrecarga de constructoresResumen - Calculadora simple4Herencia
Herencia básica (extends)La palabra clave superSobrescritura de métodos (@Override)Encadenamiento de constructoresLa clase ObjectHerencia simple y multinivelPor qué no hay herencia múltiple de clasesResumen - Jerarquía de empleados7Métodos especiales y la clase Object
Método toString()equals() y hashCode()Método clone()compareTo() y ComparableInterfaz ComparatorResumen - Ordenamiento personalizado2Modificadores de acceso y encapsulamiento
Visión general de los niveles de accesoMétodos Getter y SetterOcultamiento de informaciónLa palabra clave finalResumen - Gestor de cuentas bancarias5Polimorfismo
Fundamentos de sobrecarga de métodosSobrescritura de métodos (tiempo de ejecución)Upcasting y DowncastingEl operador instanceofClases y métodos abstractosResumen - Calculadora de figuras8Conceptos avanzados de POO
Composición vs. HerenciaAgregación vs. ComposiciónClases internas, anidadas y anónimasEnums y métodos de EnumRecords (Java 16+)Clases selladas (Java 17+)11Patrones de diseño - Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón BuilderPatrón ObserverPatrón Strategy3Propiedades de clase y miembros estáticos
Variables de instancia vs. estáticasMétodos estáticosBloques estáticosConstantes (static final)Repaso - Contador y utilidad6Interfaces y Clases Abstractas
Introducción a las InterfacesImplementación de InterfacesImplementación de Múltiples InterfacesMétodos Default y Static en InterfacesClases Abstractas vs InterfacesInterfaces FuncionalesResumen - Sistema de Pagos9Genéricos
Introducción a los genéricosClases genéricasMétodos genéricosParámetros de tipo delimitadosComodines (?, extends, super)Resumen - Contenedor genérico12Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Iterator