Skip to content

Interfaces

Introdução

  • Interface = em Java, é um tipo especial de classe abstrata que define um conjunto de métodos que uma classe deve implementar
    • a ideia de interfaces é fornecer um contrato de métodos para as classes que as implementam
  • ao contrário de uma classe abstrata, uma interface não pode fornecer implementação para os métodos que declara, apenas define o que deve ser feito
  • a interface deixando a cargo das classes implementadoras fornecerem a implementação concreta
  • os métodos de uma interface são sempre públicos e abstratos por padrão
    • não têm corpo, apenas assinatura
  • uma classe pode implementar várias interfaces
    • isso permite a simulação de herança múltipla, algo que não é permitido diretamente em Java com classes
  • Interfaces são um mecanismo poderoso para permitir flexibilidade e reusabilidade de código, além de possibilitar a simulação de herança múltipla
public interface Animal {
    void fazerSom();  // Método abstrato, sem implementação
    void comer();     // Outro método abstrato
}

Interfaces x classes abstratas

Característica Interface Classe Abstrata
Métodos Só pode ter métodos abstratos (antes do Java 8) Pode ter métodos abstratos e métodos com implementação
Herança Uma classe pode implementar várias interfaces Uma classe só pode estender uma classe abstrata
Construtores Não pode ter construtores Pode ter construtores
Atributos Só pode ter variáveis public static final Pode ter atributos de qualquer tipo de acesso
Objetivo Definir um contrato para as classes implementadoras Fornecer uma implementação parcial para as subclasses

Implementação de interfaces - implements

  • palavra-chave implements = permite que uma classe implemente uma interface
  • ao fazer isso, a classe se compromete a fornecer implementações para todos os métodos declarados pela interface
public class Cachorro implements Animal {
    // Cachorro é obrigado a implementar todos os métodos de Animal

    @Override
    public void fazerSom() {
        System.out.println("Latido");
    }

    @Override
    public void comer() {
        System.out.println("Comendo ração");
    }
}

Métodos padrão em interfaces - Java 8+

  • métodos padrão / default methods = métodos com uma implementação fornecida diretamente na interface
    • recurso disponível para interfaces a partir do Java 8
  • permitem que as interfaces adicionem novos métodos sem quebrar a compatibilidade com classes que já implementam a interface
  • classes que implementarem a interface podem usar o método padrão ou sobrescrevê-lo se necessário
public interface Animal {
    void fazerSom();

    // método padrão pode ser usado ou sobrescrito por classes que implementem Animal
    default void dormir() {
        System.out.println("Dormindo...");
    }
}

Métodos estáticos em interfaces - Java 8+

  • a partir do Java 8, também é possível definir métodos estáticos dentro de interfaces
  • esses métodos são chamados diretamente na interface
  • não precisam de uma instância da classe que implementa a interface
public interface Animal {
    // não precisa de classe que implemente
    static void info() {
        System.out.println("Informações sobre os animais.");
    }
}
  • método info é estático e pode ser chamado diretamente pela interface
// método estático - chamado direto na interface
Animal.info();

Exercícios

Questões

  1. Uma interface em Java é um tipo de classe que pode conter métodos concretos (com implementação) e métodos abstratos (sem implementação).
  2. Uma classe pode implementar múltiplas interfaces em Java, permitindo herdar comportamentos de diversas fontes.
  3. Interfaces podem ter atributos, mas todos os atributos declarados em uma interface são obrigatoriamente static e final.
  4. Em Java, uma interface pode ser instanciada diretamente, como uma classe.
  5. Para uma classe implementar uma interface, ela deve fornecer implementações para todos os métodos abstratos definidos na interface, a menos que a classe seja abstrata.
  6. Em Java 8 e versões posteriores, é possível definir métodos padrão em interfaces usando a palavra-chave default, os quais possuem uma implementação padrão.
  7. Métodos estáticos podem ser definidos em interfaces a partir do Java 8, mas não podem ser sobrescritos por classes que implementam a interface.
  8. Uma interface pode herdar de outra interface, mas nunca de uma classe.
  9. Interfaces podem conter construtores, já que elas podem ter implementação concreta em seus métodos.
  10. Em Java, uma classe pode herdar de uma classe abstrata e implementar uma interface ao mesmo tempo.
  11. Uma interface pode ser usada para estabelecer contratos e garantir que as classes que a implementam sigam as regras definidas nela.
  12. Se uma classe implementa uma interface, ela é obrigada a implementar todos os métodos, mesmo que a interface defina métodos padrão.
  13. As interfaces em Java podem ser usadas para implementar polimorfismo, pois elas permitem que diferentes classes implementem os mesmos métodos de forma independente.
  14. Métodos em interfaces podem ter modificadores de acesso como private e protected.
  15. Uma classe pode implementar uma interface, mas ela não pode estender outra interface.

Gabarito

  1. Falso: uma interface não pode conter métodos concretos com implementação, exceto métodos padrão (default) e estáticos (a partir do Java 8). Todos os métodos em uma interface eram abstratos até o Java 8, mas agora pode haver métodos com implementação padrão ou estática.
  2. Verdadeiro: uma classe pode implementar múltiplas interfaces em Java. Isso é uma característica importante das interfaces, pois permite que uma classe herde comportamentos de diversas fontes, algo que não é possível com herança de classes.
  3. Verdadeiro: todos os atributos de uma interface são implicitamente public, static e final. Não é possível declarar atributos de instância em interfaces, ou seja, os atributos são constantes.
  4. Falso: interfaces não podem ser instanciadas diretamente. Elas servem para fornecer um contrato de métodos a ser seguido pelas classes que a implementam, mas não podem ser usadas para criar objetos diretamente.
  5. Verdadeiro: para uma classe implementar uma interface, ela precisa fornecer implementações para todos os métodos abstratos da interface, a menos que a classe seja abstrata. Uma classe abstrata pode deixar a implementação dos métodos para suas subclasses.
  6. Verdadeiro: a partir do Java 8, é possível definir métodos padrão em interfaces usando a palavra-chave default. Esses métodos têm uma implementação padrão, mas as classes que implementam a interface podem sobrescrevê-los, se desejarem.
  7. Verdadeiro: métodos estáticos podem ser definidos em interfaces a partir do Java 8, mas, como são estáticos, não podem ser sobrescritos pelas classes que implementam a interface. Eles devem ser chamados usando a própria interface.
  8. Verdadeiro: interfaces podem herdar de outras interfaces, mas não podem herdar de classes. Isso permite que uma interface estenda o contrato de outra interface, sem que uma implementação seja fornecida.
  9. Falso: interfaces não podem ter construtores, pois não podem ser instanciadas diretamente. A ideia de interfaces é fornecer um contrato de métodos para as classes que as implementam.
  10. Verdadeiro: uma classe pode herdar de uma classe abstrata e, ao mesmo tempo, implementar uma ou mais interfaces. Isso permite que a classe herde comportamentos de uma classe abstrata e siga um contrato definido por uma ou mais interfaces.
  11. Verdadeiro: interfaces podem ser usadas para estabelecer contratos. Elas definem um conjunto de métodos que uma classe deve implementar, garantindo que a classe siga um conjunto de regras.
  12. Falso: se uma classe implementa uma interface, ela não é obrigada a implementar os métodos padrão da interface, pois esses métodos já possuem uma implementação. A classe precisa implementar apenas os métodos abstratos que não tenham implementação.
  13. Verdadeiro: interfaces em Java são uma forma de implementar polimorfismo. Diferentes classes podem implementar a mesma interface e, portanto, ter métodos com a mesma assinatura, mas com implementações distintas.
  14. Falso: métodos em interfaces não podem ser private ou protected. Eles devem ser public para garantir que as classes que implementam a interface possam acessá-los.
  15. Falso: uma classe pode implementar várias interfaces, mas uma interface não pode estender outra interface. O que é possível é uma interface herdar outra interface, e não uma classe estender outra interface.