Linguagem de Programação Java
Seja um Profissional Aprendendo com Profissionais
www.3way.com.br 86
Vejamos como utilizar essas classes. A Listagem 7.33 não compilará, porque não podemos instanciar classes abstratas (Listagem 7.33, linhas 4 e 6). Mas perceba que mesmo não podendo ter instâncias de classes abstratas, podemos ter variáveis de referência do tipo da classe abstrata (Listagem 7.33, linha 11):
public class Zoo {
public static void main(String[] args) { //errado - abstrata não instancia
Animal bicho = new Animal("sem ruido"); //errado - abstrata não instancia
Felino bichanos = new Felino("sem ruido"); Gato gato = new Gato();
gato.fazerRuido(); //qualquer Gato
bichanos = gato; //Gato é um Felino - up-casting bichanos.fazerRuido();//polimofirmo de referência bicho = bichanos;//Felino é um Animal - up-casting bicho.fazerRuido();//polimofirmo de referência }
}
Listagem 7.33 – Reunindo a bicharada
7.10 Interfaces
Uma interface, a grosso modo, é um tipo de classe abstrata que só pode conter métodos abstratos ou
atributos marcados com o modificador final. Interfaces, por natureza, são
abstratas, não necessitando do modificador abstract.
Quando você cria uma interface, está definindo um contrato. Este contrato reza o que uma classe, que aceita o contrato, deverá ter como comportamento definido pela interface implementado.
7.10.1 Porque utilizar Interfaces?
Utilizamos interfaces quando queremos uma relação entre classes não
relacionadas (semelhante a uma herança) que implementem métodos similares.
Através de interfaces, podemos compartilhar esse comportamento entre as classes, mas sem forçar um relacionamento entre elas.
Tome como exemplo a classe Linha, ela contém métodos que obtém o tamanho da linha e compara o objeto Linha com objetos de mesma classe. Considere também que tenhamos outra classe, MeuInteger, que contém métodos que comparam um objeto MeuInteger com objetos da mesma classe. Você pode ver que ambas as classes têm métodos similares que comparam objetos do mesmo tipo, entretanto eles não estão relacionados. Para ter certeza de que as classes implementam os mesmos métodos com as mesmas assinaturas, utilizamos
as interfaces. Você pode criar uma interface Relacao que têm alguns métodos de comparação. A Figura 7.10 mostra o diagrama UML desta interface Relacao e sua utilização pelas classes Linha e MeuInteger:
Interface é uma classe abstrata que só pode conter métodos abstratos
e/ou atributos marcados com o modificador final.
//atribuindo valor a variável referência Carro carro1 = new Carro();
carro1.ano = "2001"; carro1.modelo= "fusca"; carro1.cor = "prata";
Figura 2.4 – Layout Memória após inicialização //criando novo alias
Carro carro2 = carro1;
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
2.3 Membros de Instância
Cada objeto criado deverá ter sua própria instância de variáveis (atributos) definidas pela classe. Os métodos definem o comportamento de um objeto. Isto é importante, pois denota que um método pertence a cada objeto da classe. Porém não devemos confundir isto com a implementação do método, que é compartilhada por todas as instâncias da classe.
2.3.1 Invocação de Métodos
Objetos se comunicam pela troca de mensagens, isto significa que um objeto pode ter que mostrar um comportamento particular invocando uma operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamada de um método em um objeto usando o operador binário "." (ponto),
devendo especificar a mensagem completa: o objeto que é o recebedor da mensagem, o método a ser invocado e os argumentos para o método (se houver). O método invocado no recebedor pode também enviar informações de volta ao objeto chamador através de um valor de retorno. O método chamado deve ser um que esteja definido pelo objeto.
Os valores das variáveis em um objeto constituem
o seu estado. Dois objetos distintos têm
o mesmo estado se suas variáveis membro têm os
mesmos valores.
Figura 7.10 – UML interface Relacao
Existem outros motivos para você querer utilizar interfaces em seus programas:
Usar referências de objetos sem saber qual a classe que a implementa. Como veremos mais adiante, podemos utilizar uma interface como tipo de dados.
Utilizar interfaces como mecanismo alternativo para herança múltipla, que permite às classes ter mais de uma superclasse. Herança múltipla não está implementada em Java.
7.10.2 Interface vs. Classe Abstrata
A principal diferença entre uma interface e uma classe abstrata é que a classe abstrata pode possuir métodos implementados (concretos) ou não implementados (abstratos). Na interface, todos os métodos são definidos com abstratos e públicos, sendo que a palavra-chave abstract e public sendo opcional na declaração.
7.10.3 Criando Interfaces
Para criarmos uma interface, utilizamos a sintaxe abaixo:
[public] [abstract] interface <NomeDaInterface> {
< [public] [static] [final] <tipoAtributo> <atributo> = <valorInicial>; >* < [public] [abstract] <retorno> <nomeMetodo>(<parametro>*); >*
}
Como exemplo, criaremos uma interface que define o relacionamento entre dois objetos de acordo com a "ordem natural" dos objetos:
public interface Relacao {
public boolean maiorQue(Object a, Object b); public boolean menorQue(Object a, Object b); public boolean igualA(Object a, Object b); }
Listagem 7.34 – Interface Relacao em Java
Para implementar esta interface você deve usar a palavra chave implements na definição da classe. Por exemplo, esta é a implementação da interface Relacao pela classe Linha (Figura 7.10):
public class Linha implements Relacao { private double x1;
Linguagem de Programação Java
Seja um Profissional Aprendendo com Profissionais
www.3way.com.br 12
//atribuindo valor a variável referência Carro carro1 = new Carro();
carro1.ano = "2001"; carro1.modelo= "fusca"; carro1.cor = "prata";
Figura 2.4 – Layout Memória após inicialização //criando novo alias
Carro carro2 = carro1;
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
2.3 Membros de Instância
Cada objeto criado deverá ter sua própria instância de variáveis (atributos) definidas pela classe. Os métodos definem o comportamento de um objeto. Isto é importante, pois denota que um método pertence a cada objeto da classe. Porém não devemos confundir isto com a implementação do método, que é compartilhada por todas as instâncias da classe.
2.3.1 Invocação de Métodos
Objetos se comunicam pela troca de mensagens, isto significa que um objeto pode ter que mostrar um comportamento particular invocando uma operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamada de um método em um objeto usando o operador binário "." (ponto),
devendo especificar a mensagem completa: o objeto que é o recebedor da mensagem, o método a ser invocado e os argumentos para o método (se houver). O método invocado no recebedor pode também enviar informações de volta ao objeto chamador através de um valor de retorno. O método chamado deve ser um que esteja definido pelo objeto.
Os valores das variáveis em um objeto constituem
o seu estado. Dois objetos distintos têm
o mesmo estado se suas variáveis membro têm os
mesmos valores.