Implementação de Múltiplas Interfaces
Parte da seção Programação Orientada a Objetos do Journey de Java da Coddy. Lição 36 de 87.
Ao contrário da herança de classes, na qual você só pode estender uma classe, Java permite que uma classe implemente múltiplas interfaces. É assim que Java alcança uma forma segura de herança múltipla.
Para implementar múltiplas interfaces, liste-as após a palavra-chave implements, separadas por vírgulas:
public interface Drawable {
void draw();
}
public interface Resizable {
void resize(int width, int height);
}
public class Rectangle implements Drawable, Resizable {
private int width, height;
public Rectangle(int width, int height) {
this.width = width;
this.height = height;
}
@Override
public void draw() {
System.out.println("Drawing rectangle " + width + "x" + height);
}
@Override
public void resize(int width, int height) {
this.width = width;
this.height = height;
}
}A classe deve implementar todos os métodos de cada interface que declara. Você também pode combinar herança com várias interfaces:
public class Square extends Shape implements Drawable, Resizable {
// Deve implementar métodos de ambas as interfaces
// Também pode usar membros herdados de Shape
}Essa flexibilidade permite que você crie classes que desempenhem várias funções. Um SmartPhone poderia implementar as interfaces Callable, Messageable e Browsable, cada uma definindo diferentes capacidades compatíveis com o telefone.
Desafio
FácilVamos criar um sistema de dispositivos inteligentes em que os dispositivos podem ter várias capacidades. Você criará uma SmartTV que pode ser ligada/desligada e também ter seu volume controlado, demonstrando como uma única classe pode implementar várias interfaces para cumprir diferentes funções.
Você organizará seu código em quatro arquivos:
Powerable.java: Defina uma interface para dispositivos que podem ser ligados. Ela deve declarar dois métodos:powerOn()epowerOff(), ambos retornando void.VolumeControl.java: Defina uma interface para dispositivos com controle de volume. Ela deve declarar um métodosetVolume(int level)que retorna void e um métodogetVolume()que retorna um int.SmartTV.java: Crie uma classe que implemente as interfacesPowerableeVolumeControl. Sua SmartTV deve ter um campobrand(String), um campoisOn(boolean, inicialmente false) e um campovolume(int, inicialmente 0). Inclua um construtor que receba o nome da marca. Implemente todos os métodos obrigatórios:powerOn()deve definirisOncomo true e imprimir:[brand] TV is now ONpowerOff()deve definirisOncomo false e imprimir:[brand] TV is now OFFsetVolume(int level)deve atualizar o volume e imprimir:[brand] TV volume set to [level]getVolume()deve retornar o volume atual
Main.java: Reúna tudo para demonstrar a implementação de várias interfaces. Você receberá duas entradas: um nome de marca (String) e um nível de volume (int). Crie uma SmartTV com a marca fornecida e, em seguida:- Chame
powerOn() - Chame
setVolume()com o nível fornecido - Imprima:
Current volume: [volume]usandogetVolume() - Chame
powerOff()
- Chame
Você receberá duas entradas: a marca da TV (String) e o nível de volume (int).
Sua saída deve mostrar quatro linhas demonstrando como sua SmartTV cumpre os contratos de ambas as interfaces. Ela pode ser ligada como qualquer dispositivo Powerable e ter seu volume controlado como qualquer dispositivo VolumeControl!
Experimente você mesmo
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Ler entradas
String brand = scanner.nextLine();
int volumeLevel = scanner.nextInt();
// TODO: Crie uma SmartTV com a marca fornecida
// TODO: Chame powerOn()
// TODO: Chame setVolume() com o nível fornecido
// TODO: Print: Current volume: [volume] using getVolume()
// TODO: Chame powerOff()
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos de POO
Arquivos ExternosIntrodução à POOClasses vs ObjetosA Palavra-chave thisMétodosCampos (Atributos)Método ConstrutorSobrecarga de ConstrutorRecapitulação - Calculadora Simples4Herança
Herança Básica (extends)A Palavra-chave superSobrescrita de Método (@Override)Encadeamento de ConstrutoresA Classe ObjectHerança Simples e MultinívelPor que não há Herança Múltipla de ClassesRecapitulação - Hierarquia de Funcionários7Métodos Especiais e a Classe Object
Método toString()equals() e hashCode()Método clone()compareTo() e ComparableInterface ComparatorRecapitulação - Ordenação Personalizada2Modificadores de Acesso e Encapsulamento
Visão Geral dos Níveis de AcessoMétodos Getter e SetterOcultação de InformaçõesA Palavra-chave finalRecapitulação - Gerenciador de Conta Bancária5Polimorfismo
Fundamentos de Sobrecarga de MétodosSobrescrita de Métodos (Tempo de Execução)Upcasting e DowncastingO Operador instanceofClasses e Métodos AbstratosRecapitulação - Calculadora de Formas8Conceitos Avançados de OOP
Composição vs HerançaAgregação vs ComposiçãoClasses Internas, Aninhadas e AnônimasEnums e Métodos de EnumRecords (Java 16+)Classes Seladas (Java 17+)11Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão BuilderPadrão ObserverPadrão Strategy3Propriedades de Classe e Membros Estáticos
Variáveis de Instância vs EstáticasMétodos EstáticosBlocos EstáticosConstantes (static final)Recapitulação - Contador e Utilitário6Interfaces e Classes Abstratas
Introdução às InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesDefault e Static em InterfacesClasses Abstratas vs InterfacesInterfaces FuncionaisRecapitulação - Sistema de Pagamento9Generics
Introdução a GenericsClasses GenéricasMétodos GenéricosParâmetros de Tipos DelimitadosWildcards (?, extends, super)Recapitulação - Container Genérico12Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão IteratorPratique por conta própria: Compilador de Java online