Enviar um café pro programador

Pode me ajudar a transformar cafeína em código?

Interface em Java (implements) - O que é, para que serve e como implementar

Iremos agora estudar um assunto muito importante em nossa apostila de Java, que irá usar principalmente, dentre outras coisas, os conceitos aprendemos sobre Classes e Métodos Abstratos, as interfaces.

Aprenderemos também uma importante palavra reservada do Java, o implements.


O que é uma Interface

O conceito de interface é usando em praticamente toda a computação, até mesmo na engenharia do ramo programação em baixo nível (interface de comunicação entre hardware e o kernel do Sistema Operacional).

Podemos definir interface como uma face, um plano, uma divisa que faz a comunicação entre dois meios diferentes.
Por exemplo, quando trabalhamos com eletrônica, basicamente é tudo estado alto ou estado baixo, que são nada mais que níveis de voltagem ou corrente elétrica. Lá se usa registros, CI (circuitos integrados), portas lógicas, equipamentos de elétrica e eletrônica.

Mas quem usa computador como simples usuário, não precisa saber nem se preocupar com eletricidade ou bits se movendo. Por quê?
Porque há uma interface que interpreta essas coisas em baixo nível. Em vez de te mostrar uma série de bits ou voltagens, te mostra textos que você, humano, compreende.

O responsável por isso é o sistema operacional. É como se ele traduzisse: "Opa, recebi um código aqui do hardware "0011100101001011010", isso quer dizer que tenho que fechar a janela".

Ou seja, estamos fazendo uma comunicação entre dois meios: o meio do hardware (em baixo nível, onde se trabalha com bits) e o meio do usuário (que quer ler textos, ver imagens).
Então, há uma interpretação. No fundo, a mensagem é a mesma, só é dita de maneira diferente para que você possa entender.

Interface em Java


No rigor do termo, uma interface em Java nada mais é que uma classe abstrata composta somente por métodos abstratos. E como tal, obviamente não pode ser instanciada.
Ou seja, ela só contém as declarações dos métodos e constantes, nenhuma implementação, só o 'molde'.

E para que raios serve uma classe sem implementação?
Ela serve para que outras classes, baseadas nessa interface, implementem esses métodos para fins específicos.

Parece confuso e complicado, mas é como explicado anterior sobre interface: ela será uma espécie de comunicação entre meios.
Geralmente entre o que é pedido (das funções que ela executa) e a implementação.

Vamos dar alguns exemplos mais práticos.



Interface de um restaurante

Um exemplo de interface em nosso dia-a-dia, é o cardápio de um restaurante.
No menu do restaurante tem dizendo todas as refeições existentes naquele local, inclusive com os ingredientes.

Os clientes que lá forem vão pedir uma determinada comida, e querem receber exatamente aquilo que pediram. Porém, eles não vão ver e nem se importar de como foi feito o prato, só querem receber aquilo que foi solicitado.

Então, o cardápio é uma interface de comunicação entre o cliente os cozinheiros.


Interface de um programa real

Vamos supor que cientistas te contratem para criar um aplicativo Java para uma universidade, para fazer cálculos com matrizes. Eles irão te passar o que você tem que fazer, porém, muito provavelmente não vão estar interessados em COMO você vai fazer isso, só querem saber se vai funcionar.

E é aí que entra a interface, ela servirá de comunicação entre seu código e os cientistas.
Sua interface vai se comunicar com eles, é como se ela dissesse: "Para criar uma matriz, forneçam isso que te devolvo a matriz. Já para calcular o traço da matriz, nos forneça a matriz. Já para calcular a transposta, faça isso que retorno isso. Ah quer essa informação? Ok, me forneça esses dados que te retorno tudo pronto"

Ou seja, vai haver uma comunicação entre a sua implementação em Java e entre os cientistas.
Provavelmente eles nem sabem programar em Java, por isso eles não devem ter acesso ao código, pois não iriam entender, e nem querem entender, só querem que o programa faça o que eles pedem, e essa mediação é feita através da classe abstrata, a interface Java do programa.

Como declarar uma Interface

Embora seja uma classe abstrata, ela é uma classe abstrata especial, pois só possui métodos abstratos e nada de implementação. Só as estruturas, o cabeçalho dos métodos.

E como tal, vamos usar uma palavra reservada do Java para declarar tais tipos de classe: interface.
Por exemplo, para declarar uma interface pública de nome "JavaProgressivo", fazemos:
public interface JavaProgressivo{
}

Nossa interface do exemplo passado, das matrizes dos cientistas, poderia ser mais ou menos assim:

public interface Matriz {
 
 double Traco(Matriz m);
 Matriz Nula(int linha, int coluna);
 Matriz Transposta(Matriz m);

}

Vejam que não há implementação, só o cabeçalho dos métodos.
Mas vamos ver como essa interface vai se comunicar com os cientistas?

Por exemplo, é fácil ver que se eles quiserem saber o traço de uma matriz, basta invocar o método "Traco()" fornecendo a matriz como argumento.
Como esse traço é calculado? Não sei, não importa, o importante é que retorna uma variável do tipo double com o resultado.

E para criar uma matriz nula de "linha" linhas e de "coluna" colunas?
É só chamar o método Nula() que ele te retorna tal matriz.

E se eles quiserem a matriz transposta de uma matriz 'm', como fazem?
Ué, chamam o método "Transposta()" passando a matriz como argumento, que o programa em Java retorna a matriz transposta.

Implementando uma classe - implements

Porém, de nada adianta ter uma classe abstrata se ela não for implementada.
Veja a interface como um molde, um esqueleto do que você deve fazer.

É como se seu chefe te desse uma série de tarefas para fazer:
Crie um método que retorne o traço de uma matriz
Crie outro método que retorne uma matriz nula de tamanho "linha x coluna"
E outro que retorne a transposta de uma matriz

E para essas tarefas serem resolvidas, é necessário implementá-las.
É aí que entra a parte do código Java, onde você vai realmente programar tudo que foi pedido.

Vamos supor que sua implementação será através da classe pública "minhaMatriz", a sintaxe para implementar uma classe derivada de uma interface é:
public class minhaMatriz implements Matriz{
}

Veja como essa sintaxe se assemelha aquela da Herança.
A única diferença que lá a palavra reservada para herdar é extends.
De resto, tudo igual.

Agora você cria sua classe "minhaMatriz".
Você pode definir novas variáveis, novos métodos (como setters e getters) e fazer tudo o que quiser, com somente uma condição:
Tudo que estiver na interface, tem que estar, obrigatoriamente, em sua implementação, e da mesma maneira.

Ou seja, se lá tem um método que recebe argumentos específicos e retorna um tipo específico, sua implementação tem que obedecer esta mesma regra: receber os mesmos argumentos específicos e retornar o tipo que diz lá.

Seria algo assim:

public class minhaMatriz implements Matriz{
 Matriz mat;
 double traco;
 
 public double Traco(Matriz m){
  //Implementação do traço de uma matriz
  return traco;
 }
 
 public Matriz Nula(int linha, int coluna){
  //Zerando todos os elementos da matriz
  return mat;
 }
 
 public Matriz Transposta(Matriz m){
  //Armazenando a transposta da matriz 'm' na matriz 'mat
  return mat;
 }

}

No próximo tutorial vamos implementar a famosa interface "Comparable" e seu método "compareTo( )" que serve para comparar dois objetos de quaisquer tipo de classes.

16 comentários:

Anônimo disse...

Melhor site para ensino de Java que ja encontrei. Vocês estão de parabéns!

PAULO disse...

Gente boa, isso não é só pra quem sabe não. Isso é pra quem sabe o conteúdo e sabe explicar. Gostei e obrigado.
Paulo(Salvador-Ba)

Anônimo disse...

Ótima explicação.

Esmael Serra disse...

amei a explicacao

Anônimo disse...

se tivesse xaroca, dava para ti

Unknown disse...


O quê muda a "interface" em relação à "abstract"?
E o quê muda o "extends" em relação ao "implements"?
Pelo que eu notei parece ser exatamente a mesma coisa. Muda algo?

Anônimo disse...

Parabéns, foi a melhor explicação sobre o assunto que encontrei. Excelente didática!

Paulo Moreno disse...

Parabéns pelo site....... ótimo conteúdo, melhor que a maioria dos cursos pagos.

Anônimo disse...

A interface vai permitir que você altere em apenas um local a resolução de um método. Caso tenha alguma alteração não será necessário que vá em todas as classes que implementam a função, sendo necessário apenas modificar a interface.

Unknown disse...

Muito bom! Estou gostando muito da metodologia. Textos extremamente didáticos. Parabéns!

Unknown disse...

Muito bom! Textos extremamente didáticos. Parabéns!

Chelocurupa disse...


Realmente muito didático.
Terminei de entender só agora o que é uma Interface e para que e usa, apos ter passado por 3 sites diferentes.
Parabéns !!

Unknown disse...

Ótima explicação e melhor ainda são as comparações com o cotidiano, abrindo ainda mais as vertentes da compreensão da linguagem. Meus parabéns!

Anônimo disse...

Como eu executo isso no netbeans?

BrunaM disse...

que fantástica essa explicação... parabéns

Wanessa Verçosa disse...

Eu não tava entendendo nada de interface, até agora. Que texto explicativo! Parabéns, vcs são os melhores!

Contribuir com o Java Progressivo

Que tal apoiar e fazer crescer o ensino da programação no Brasil ?

Ajudar nosso país a crescer e se desenvolver cada vez mais, tecnologicamente?

Clica abaixo pra saber mais!

Apoiar o Projeto Progressivo


Tutoriais de Java