Aula 24 21/08/12
Autor: Mauricio Hirsch | Publicado: 2012-08-22T19:48:00-07:00


&nbsp; &nbsp;&nbsp;INTERFACES&nbsp; &nbsp; Nesta aula, o professor nos explicou sobre INTERFACES, como cheguei um pouco atrasado nesta aula, não consegui pegar o inicio da explicação, então andei pesquisando mais sobre o assunto e encontrei o conteúdo abaixo;Uma&nbsp;interface&nbsp;no java pode representar uma superfície como o botão de liga e desliga de um equipamento eletrônico. Este botão, por padrão, esta obrigatóriamente presente em todos os aparelhos de televisão.No mais comum, uma interface, é um conjunto de métodos&nbsp;relacionados&nbsp;que não tem corpo, ou seja, sem implementação. Se um comportamento básico de qualquer aparelho eletrônico for especificado como uma interface, poderia ser como o código abaixo:
123456package estudos;&nbsp;public interface Eletronico {&nbsp;&nbsp;&nbsp;&nbsp;void ligar();&nbsp;&nbsp;&nbsp;&nbsp;void desligar();}
Todos os métodos das interfaces são implicitamente public e abstract , sendo que muitas pessoas gostam usualmente de explicitar o public. E as constantes são public static e final.
12345678package estudos;&nbsp;String teste = "t123";&nbsp;public interface Eletronico {&nbsp;&nbsp;&nbsp;&nbsp;void ligar();&nbsp;&nbsp;&nbsp;&nbsp;void desligar();}
É a mesma coisa que:
12345678package estudos;&nbsp;public static final String teste = "t123";&nbsp;public interface Eletronico {&nbsp;&nbsp;&nbsp;&nbsp;public abstract void ligar();&nbsp;&nbsp;&nbsp;&nbsp;public void desligar();}
Se você quiser implementar um aparelho eletrônico seguindo o padrão básico de comportamento, você terá que usar a palavra-chave&nbsp;implements&nbsp;na declaração da classe deste aparelho:
123456789101112131415161718package estudos;&nbsp;public class Televisao implements Eletronico {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Temos obrigatóriamete que implementar os métodos&nbsp;&nbsp;&nbsp;&nbsp;// da interface Eletronico.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void ligar() {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Liguei a televisão");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Aqui você implementaria os códigos para ligar a televisão&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void desligar() {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Desliguei a televisão");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Aqui você implementaria os códigos para desligar a televisão&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;}
Como vemos no código, para se implementar a televisão, que é um aparelho eletrônico, seguimos o padrão&nbsp;criado por nós&nbsp;para aparelhos eletrônicos. Usamos a palavra-chaveimplements&nbsp;para implementar obrigatóriamente os métodos da interface Eletronico , fazendo uso do&nbsp;padrão criado. É como um contrato entre diversas classes,&nbsp;quase&nbsp;que criando até um&nbsp;tipo de dado.Quando você precisa criar funções que manipulam outros objetos, é necessário, as vezes, garantir que esta função esta realmente recebendo um objeto que&nbsp;tenhadeterminados atributos e métodos, os quais esta irá fazer uso. Vou mostrar um exemplo:Criamos um interface Imprimivel:
1234567package estudos2;&nbsp;public interface Imprimivel {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void imprimir();&nbsp;}
Vamos criar uma classe Impressora que implementa a interface Eletronico, e que só imprime objetos que implementam a interface Imprimivel.
1234567891011121314151617181920212223242526272829303132333435package estudos;&nbsp;public class Impressora implements Eletronico {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Impressora desligada por padrão&nbsp;&nbsp;&nbsp;&nbsp;private boolean ligada = false;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Método para imprimir uma nota, veja o parâmetro&nbsp;&nbsp;&nbsp;&nbsp;// Imprimivel objImprimivel&nbsp;&nbsp;&nbsp;&nbsp;// O metodo espera um objeto que possua uma função imprimir()&nbsp;&nbsp;&nbsp;&nbsp;// gerou um contrato da impressora .. o método somente&nbsp;&nbsp;&nbsp;&nbsp;// aceita objetos que implementa a interface Imprimivel.&nbsp;&nbsp;&nbsp;&nbsp;public void imprimirNotaFiscal(Imprimivel objImprimivel){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Verifica se a impressora esta ligada!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(this.ligada){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objImprimivel.imprimir();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Se o objeto passado não fosse Imprimivel&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Problema: Impressora desligada!");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// implementamos o método da interface Eletronico&nbsp;&nbsp;&nbsp;&nbsp;// Ligamos a impressora ....&nbsp;&nbsp;&nbsp;&nbsp;public void ligar() {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.ligada = true;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Impressora ligada!");&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void desligar() {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.ligada = false;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Impressora desligada!");&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;}


}
Criamos um classe executável “main” para fazer uma demonstração:
123456789101112131415161718192021222324252627282930package estudos;&nbsp;public class Main {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String[] args) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Instânciamos uma impressora&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Impressora impressora1510 = new Impressora();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Ligamos a impressora!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;impressora1510.ligar();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Fazemos um for para simular a criação de 10 notas fiscais&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 1; i &lt;= 10; i++) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// numero da nota atual recebe o valor de i&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int numeroNota = i;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Criamos um valor i * 10, só para esta demonstração&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 10.0 , 20.0, 30.0, 40.0, 50.0 .... 100.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double valor = (double) (10 * i);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Criamos um nota fiscal aqui dentro do for...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// utilizando o valores gerados com a ajuda da variável i&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NotaFiscal notaf = new NotaFiscal(numeroNota, valor);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Como passamos um objeto que implementa a classe Imprimivel para&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// o método da impressora que espera um objeto Imprimivel&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// não terá problemas...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;impressora1510.imprimirNotaFiscal(notaf);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;}
Primeiro criamos a interface Imprimivel, depois uma Classe Impressora que implementa a interface Eletronico. Criamos duas classes de nota fiscal, uma é Imprimivel e a outra não. Então veio o teste na classe executável:O resultado foi:Impressora ligada!
Número: 1, Valor: 10.0
Número: 2, Valor: 20.0
Número: 3, Valor: 30.0
Número: 4, Valor: 40.0
Número: 5, Valor: 50.0
Número: 6, Valor: 60.0
Número: 7, Valor: 70.0
Número: 8, Valor: 80.0
Número: 9, Valor: 90.0
Número: 10, Valor: 100.0Vou comentar um pouco sobre a linha 24 do código da Classe executável “Main”:
Algumas últimas pergutas:É possível declarar Atributos privados em uma Interface?
Não. As interfaces não podem ter atributos privados, todos os seus atributos são public final e static. O objetivo das interfaces é que sejam implementadas, as classes que a implementa irá fazer uso de seus atributos, se tivesse atributos private seria inútil, pois a classe que implementará não enxegará o atributo. Por este motivo que não é permitido criar atributos ou métodos private em interfaces.É possível declarar métodos static em uma interface.
Não. Uma interface não pode ter métodos com corpo. Para que um método&nbsp;static&nbsp;? Se os métodos de interfaces não podem ter corpo. Os métodos das interfaces, serão implementados em outras classes.