Interface é um recurso da linguagem Java que apresenta inúmeras vantagens no sentido da modelagem e instanciação de objetos, porém deve-se entender claramente os conceitos básicos da orientação a objetos a fim de utilizá-la plenamente.
Uma interface é similar a um contrato, através dela podemos especificar quais métodos as classes que implementam esta interface são obrigados a implementar.
No vídeo a seguir mostramos passo a passo como funciona a interface:
Se for modelar a interface usando UML, temos algo parecido com isso:
Estes são dois modos de se representar uma interface utilizando a UML, criamos uma interface chamada Banco, em Java está interface fica do seguinte modo:
Para criarmos uma interface em Java, utilizamos a palavra-chave interface antes do seu nome.
Na interface declaramos os métodos de forma abstrata, tendo apenas sua assinatura e terminando com ponto e vírgula ( ; ) e todos os métodos precisam ser públicos. Podemos declarar atributos, porém todos os atributos de uma interface são constantes publicas. Uma interface pode estender (sub-interface) outras interfaces.
Dentro da interface não podemos:
implementar método
construtor
estender classe
implementar outra interface
não pode ser final
Quando uma classe implementa uma interface, está classe obrigatoriamente precisa implementar todos os métodos declarados na interface, apenas quando usamos classes abstratas implementando interface que não precisamos obrigatoriamente implementar todos os métodos (classes abstratas serão vistas mais para frente).
Na UML a implementação de uma interface é feita da seguinte forma:
Neste exemplo, temos duas classes BancoSakurai e BancoCristiano implementando a interface Banco. Nas classes podem ser feitas implementações diferentes dos métodos, mas as assinaturas dos métodos precisam ser iguais as da interface, podemos também adicionar mais métodos que os obrigatórios.
Neste exemplo também estamos usando uma classe conta:
O código Java dessas duas classes ficam da seguinte forma:
Nesta implementação o BancoSakurai alem de fornecer os métodos obrigatórios da interface Banco, também disponibiliza um método adicional chamado transferencia(Conta contaOrigem, Conta contaDestino, double valor).
Nesta classe BancoCristiano, podemos ver que ele possui apenas os métodos obrigatórios da interface Banco.
Está implementação tem um algoritmo diferente do BancoSakurai, aqui o método manutencaoConta() tem um valor que será retirado da conta mesmo que a conta não tenha mais saldo.
Assim podemos perceber que a interface serve como uma base, informando os métodos mínimos que devem ser implementados e cada classe é responsável pela lógica de negocio utilizado nos métodos.
Neste exemplo criamos dois bancos e duas contas e fizemos algumas operações em cima das contas e no final imprimimos o extrato das contas.
Note a seguinte sintaxe:
Repare que estamos criando uma variável bancoCristiano do tipo da interface Banco, depois estamos criando um objeto da classe BancoCristiano que é uma classe que implementa a interface Banco. Este tipo de sintaxe é muito usado quando usamos polimorfismo. (Polimorfismo será abordado mais adiante)
Quando executarmos a classe BancoTeste, temos a seguinte saída no console:
Quando usamos uma variável usando o tipo interface, podemos apenas chamar os métodos que possuem na interface, a seguinte linha causará um erro de compilação:
Neste exemplo teremos um erro de compilação, pois a interface Banco não tem a assinatura para o método transferencia(Conta contaOrigem, Conta contaDestino, double valor), este método é disponibilizado através da classe BancoSakurai, então para usá-lo precisaremos de uma variável do tipo BancoSakurai.
Uma interface em Java, após sua compilação, também gera um arquivo .class, assim como qualquer outra classe em Java.