Interface

Transcrição

Interface
Programação
Java III
Prof. Vinicius Rosalen
Parte III
Métodos e Classes
Abstratas
• Resumo da aula anterior....
• Ao criarmos uma classe para ser estendida,
– Às vezes codificamos alguns métodos para os quais não
sabemos dar uma implementação, ou seja,
• Um método que só subclasses saberão implementar
• Uma classe deste tipo não pode ser instanciada
pois sua funcionalidade está incompleta.
– É como se tentássemos andar de carro sem ter as rodas
construídas....
• Tal classe é dita abstrata.
Métodos e Classes
Abstratas
• Resumo da aula anterior....
– Uma classe abstrata é utilizada quando desejase:
• Fornecer uma interface comum a diversos membros de
uma hierarquia de classes.
• Não se preocupar COMO, apenas QUAL o contrato
que deve ser obedecido...
Java – Métodos e Classes
Abstratas
• Resumo da aula anterior....
– Classes Abstratas
Método sem
corpo { }
Características
- Abstração : suprimir detalhes
para melhor compreensão
- Classe abstrata - possui
métodos abstratos
- Força a implementação para
que possa ser instanciada
Todos os veículos
possuem a ação de
abastecer, mas a forma de
abastecer (álcool, gasolina
ou diesel) só é conhecida
pelas filhas da herança
Upcasting e Downcasting
• Resumo da aula anterior....
– Outro dois conceitos bastante importantes é sobre:
• A conversão de tipos na relação das classes em herança.
– Os conceitos são de o polimorfismo de :
• Downcasting e Upcasting
Upcasting e Downcasting
Em Java, Upcasting é automático
A conversão de tipos para o topo
da hierarquia é automático
Ampliação (upcasting) é a
conversão implícita de uma
subclasse para uma superclasse
Se tenho o tipo Pai e
instancio o Filho é
automático. O
contrário não.
Mas Downcasting deve ser
explícito
A conversão de tipos
para as folhas da
hierarquia deve ser
explicitado.
- O Pai está “contido” no filho.
- Mas o filho não está “contido” no pai
- Questão de reserva de memória.
Upcasting e Downcasting
• Vamos analisar um exemplo...
“Máscara de
visualização”
Ponto
“Área efetiva
alocada”
Ponto pt = new PontoColorido(0,0,1);
PontoColorido px = (PontoColorido)pt;
PontoColorido
pt = px // UpCasting (Pai recebe o filho)
px = pt; // Erro, filho não recebe o pai
diretamente
px = (PontoColorido)pt; // Downcast
“Mas só enxerga as
áreas em comum a
ambos”
Ponto pt2 = new Ponto();
PontoColorido py = (PontoColorido)pt2;
System.out.println(py.cor); //ERRO de execução –
espaços de memórias diferentes
“cor é um atributo
de PontoColorido,
mas só foi alocado a
área de Ponto”
Java – Métodos e Classes
Abstratas e Casting
•
Pra que usar isso...exemplo das figuras e classe Composta:
–
Os atributos F1 e F2 da classe Composta pertencem à classe Pai
Figura
–
E no exemplo, eles recebem valores pertencentes às classes Filhas
Circulo, Quadrado e Composta:
Olha que legal, ele pode
inclusive receber uma figura
composta qualquer, não
importa o formato, afinal ela
também é uma Figura
class Composta extends Figura {
Figura F1, F2; .
void Composta(Figura f1,f2)
{ F1 = f1; F2 = f2; }.. }
...
Composta comp1 = new Composta(c1,q);
Composta comp2 = new Composta(comp1,c2);
...
–
Isso é possível graças conversão implícita de tipo (upcasting), que é
uma propriedade inerente aos objetos com relação de herança.
Métodos e Classes Abstratas
• Hoje nós vamos ampliar o nosso conhecimento em
OO, conversando sobre:
– A palavra reservada SUPER
– Herança Múltipla e Interfaces
– Exercícios
• Vamos lá…….
• Primeiramente vamos falar sobre a palavra reservada super...
Palavra reservada “super”
• Super pode ser utilizado explicitamente para:
– Referenciar o construtor da superclasse
• Para se referir ao construtor da classe pai, basta usar o operador
– super( ).
– Referenciar um outro método ou atributo da classe pai
• Para se referir a elementos da classe pai, basta usar o operador
– super
Construtores de subclasse
• Chamada Explícita ao construtor base
1: public class Circle
2: {
3:
public double x,y,r;
4:
public Circle(double x,
double y, double r) {
5:
this.x = x;
6:
this.y = y;
7:
this.r = r;
8:
}
9: public Circle(double r){
10:
this(0.0,0.0,r);
11:
}
12: }
1: public class GraphicCircle extends
Circle
2: {
3:
Color color;
2:
public GraphicCircle
2b:
(double x, double y,
double r, Color color) {
3:
super(x,y,r);
4:
this.color = color;
5:
}
6: }
Herança em Java
• Livro possui autor e paginas
– (definidos na própria classe);
• Livro possui nome e preço
– (definidos na superclasse);
• Livro pode receber mensagens
ehGrande()
– (definida na própria classe);
• Livro pode receber mensagens
ehCaro()
– (definida na superclasse).
• O que será impresso ?
Construtores de subclasse
• No caso de uma hierarquia de classes,
– O que acontece se não chamar explicitamente o
construtor da classe pai???
Ordem de construção
• Relembrando...
– Quando construímos um novo objeto, os seguintes passos
são efetuados:
• 1º: Os atributos da classe são zerados
– inicializados com seus valores default: 0, false ou null;
• 2º: Se a classe participa de alguma hierarquia, o construtor da
superclasse é chamado;
– Primeiro constrói o pai, depois o filho
» Você existiria sem seus pais 
• 3º: Os atributos da classe recebem os seus valores iniciais (se
especificados), na ordem em que foram definidos na classe;
• 4º: O corpo do construtor da classe é chamado.
Ordem de construção
• No caso de não haver chamada explícita,
– A linguagem Java chama o construtor padrão da
superclasse.
• Característica intrínseca de herança
– Java chama implicitamente o construtor default da superclasse.
– Se não existir um construtor default na superclasse,
haverá um erro de compilação
– No entanto, o finalizador da superclasse não é invocado.
• Deve ser feito de forma explícita
Construtores de subclasse
• Chamada Implícita ao construtor base
• O que será impresso ?
Construtores de subclasse
• O que será impresso ?
Atributos e Métodos Ocultos
• IMPORTANTE...
• Pode-se redeclarar um atributo ou método de
mesmo nome numa classe derivada.
• Apesar do atributo ou método oculto ainda
ser acessível, essa construção gera confusão
sem trazer nenhum benefício.
• Evite essa prática
Chamada Explícita e
Implícita
class Super {
• O
Super() {
System.out.println("Construtor Super"); }
que será impresso?
void teste() {
System.out.println("Metodo
Superclasse");}
class ProgramaSuperExplicito {
public static void main (String
arg[]) {
}
System.out.println(“Heranca 2”);
Subclasse sub = new Subclasse();
class Subclasse extends Super {
sub.teste();
Subclasse() {
}
System.out.println("Construtor
Subclasse"); }
}
void teste() {
super.teste();
System.out.println("Metodo
Subclasse"); }
}
Métodos sobrescritos podem
chamar sua versão
na superclasse usando a palavra
super < (super.método() >
Atributos Ocultos
• O que será impresso?
Herança Múltipla
• Em algumas linguagens de programação OO:
– As classes podem ter mais de um superclasse,
• Herdando variáveis e métodos combinados de todas essas
superclasses
– Isto é chamado de herança múltipla
– Herança Múltipla fornece margem para praticamente
qualquer comportamento imaginável
• Contudo complica bastante as definições de classes e o código
para produzi-la, além do entendimento
Herança Múltipla
• Exemplo de utilização de herança múltipla
ObjetoColorido
Carro
obtemCor()
mudaCor()
liga()
acelera()
CarroEsporteColorido
Herança Múltipla
• Outro exemplo de utilização herança múltipla
extends
extends
Herança Múltipla
• Outro exemplo de utilização de herança múltipla
– Um gerente de banco pode assumir características de:
• Funcionário,
• Acionista e
• Cliente em diferentes instantes.
“
”
Herança Múltipla
• Java simplifica a herança
– Permitindo diretamente apenas a herança simples ou
única das classes
• Java NÃO permite múltipla herança de classe,
– Pois foi verificado em outras linguagens que sua
implementação é muito confusa
• Um dos problemas que podem surgir...
– É o conflito de nomes de atributos ou métodos herdados
desse tipo de herança, além de heranças repetidas
• Problemas de códigos…
Herança Múltipla
• Herança múltipla de classe não é permitida em Java
ObjetoColorido
Carro
obtemCor()
mudaCor()
liga()
acelera()
extends
extends
CarroEsporteColorido
Como construir então essa característica em Java?
Interfaces
• Em Java, os objetos podem implementar uma interface....
– As interfaces são como classes, mas não têm nenhuma
implementação.
• Define apenas as assinaturas de operações externamente visíveis que
uma classe pode implementar, sem conter nenhuma especificação ou
estrutura interna
– Interfaces não possuem implementação, somente assinaturas de operações
(100% abstratas);
– Interfaces suportam herança, mesmo herança múltipla.
• Interfaces podem herdar de outras interfaces, e suportam herança
múltipla (enquanto classes suportam herança simples);
– Mecanismo para prover flexibilidade devido à ausência de herança múltipla
de classes;
– Interfaces definem subtipos, enquanto a herança define as
subclasses.
Java – Herança Múltipla
• Solução para herança múltipla
– Escolha uma das classes para herdar;
– Para as demais, crie interfaces e implemente-as;
– Use composição ou agregação para fazer reuso.
extends
extends
extends
implements
Interfaces
• Características Gerais Importantes
– Estabelece a interface (o contrato) de um conjunto de classes;
– Permite a construção de código genérico:
– Trabalha com qualquer objeto que implemente a interface;
– Obriga programadores a implementar determinados métodos em suas classes
para usar seu código.
– São públicas (mesma regra das classes);
– Classes utilizam implements ao invés de extends para implementar uma
interface.
– Todos os métodos são public & abstract;
– Todos as variáveis são final & static, inicializados
• isto é, apenas constantes
Java - Class x Interface
• Sintaxe para Classe e Interface em Java
Interfaces não permitem
declaração de atributos
variantes (somente
estáticos), enquanto que
classes permitem outros.
Interfaces estão mais ligadas a
comportamento, enquanto que
classes estão mais ligadas a
implementação.
Java - Interface
• Resumindo: Membros da Interface
– Métodos definidos na interface são automaticamente
públicos e abstratos;
– Atributos definidos na interface são automaticamente
públicos e estáticos.
Método sem
corpo { }
Interface ou classe
abstrata?
• Importante: Classes Abstratas X Interfaces
– Você deve estar achando que classes abstratas e
interfaces são conceitos parecidos e que podem ser
usados com objetivos semelhantes.
– Cuidado!
• Uma classe pode estender uma única classe (que pode ser
abstrata ou não), mas pode implementar várias interfaces.
• Além disso, interfaces não permitem declaração de atributos
variáveis (somente estáticos), enquanto que classes abstratas
permitem.
• Interfaces estão mais ligadas a comportamento, enquanto que
classes abstratas estão mais ligadas a implementação.
– Sempre que possível, use interfaces
Interface ou classe
abstrata?
• Blz,
– Tudo isso é bonito e legal, mas pra que eu tenho
que ver isso...??
– Vamos analisar um exemplo para entender
melhor porque a gente deve entender e usar
interfaces
Interface ou classe
abstrata?
• Imagine que temos um
Hierarquia dos animais, e
devemos simular animais
em um ambiente.
• Se analisarmos as relações
ao lado, a classe Dog para
um programa de ciências
está OK....
• .. Mas e para programa que
simule um Pet Shop???
Interface ou classe
abstrata?
• 1ª Opção: Métodos que
simulam os comportamentos
de um Pet (Animal de
Estimação) implementados
em Animal.
– Prós:
• Todas as subclasses
possuirão esses
comportamentos.
• Uso do polimorfismo.
– Contras:
• Existem subclasses de
Animal que não precisam
desses comportamentos
(Hippo, Lion, Tiger, Wolf)
Interface ou classe
abstrata?
• 2ª Opção: Métodos abstratos
que simulam os
comportamentos de um Pet
(Animal de Estimação)
implementados em Animal.
– Prós:
• Todas as subclasses possuirão
esses comportamentos;
• Uso do polimorfismo;
• Cada subclasse com seu
próprio comportamento.
– Contras:
• Todas as subclasses concretas
devem implementar os
métodos abstratos.
Interface ou classe
abstrata?
• 3ª Opção: Comportamentos de
animais de estimação nas
subclasses Dog e Cat.
– Prós:
• Comportamento de animal de
estimação somente onde
necessário;
• Cada subclasse implementa o
comportamento que quiser.
– Contras:
• Pode não haver uma
padronização dos
comportamentos Pet em uma
subclasse.
– Ex.: Se as classes forem
implementadas por
programadores diferentes.
• Não pode usar polimorfismo para
os comportamentos (métodos)
dos animais de estimação.
Interface ou classe
abstrata?
• 4ª Opção: Nova classe
com comportamentos de
animais de estimação
– Prós:
• Garante que todos os
animais de estimação
terão as mesmas
definições de métodos;
• Polimorfismo
Interface ou classe
abstrata?
• 4ª Opção: Nova classe com
comportamentos de animais de
estimação
– Contras:
• Duas Superclasses;
• Java NÃO implementa herança
múltipla.
Interface ou classe
abstrata?
• Solução: INTERFACE
– É como uma classe abstrata, mas só tem:
• Métodos abstratos, públicos
• Campos finais estáticos, públicos
Interfaces
• Outra coisa legal que a gente pode fazer com
interfaces está ligado ao polimorfismo....
• Interfaces permitem a construção de código genérico
– Ou seja trabalhar com qualquer objeto que implemente a
interface;
• Em outras palavras....
– Posso passar qualquer objeto que implementa essa
interface
• Imagine as possibilidades...
Interfaces
• Lembram do nosso exemplo...
− Com a utilização de interface para herança múltipla em Java, ele
ficaria assim..
<<interface>>
ObjetoColorido
Carro
Color obtemCor()
liga()
void mudaCor(Color cor)
acelera()
implements
extends
CarroEsporteColorido
Color cor
Java – Herança Múltipla
• Implementação do Carro e Objeto Colorido
Métodos sem
corpo { }
A
implementação
do método não
está na interface
mas sim na
classe que a
implements
Java - Herança Múltipla
Interface (utilização)
• O que será impresso?
AplicacaoDeCor
Posso passar qualquer objeto
que implementa essa
interface.. Imagine as
possibilidades...
Como o parâmetro
da função ehAzul é
uma interface...
...qualquer classe
que implementa
esta interface pode
ser passada como
parâmetro
O mail legal é que interface permitem a
construção de código genérico:
Trabalha com qualquer objeto que implemente a
interface;
Interfaces e Heranças
• Outro conceito importante é que Interfaces
suportam herança, mesmo herança múltipla.
– Interfaces podem herdar de outras interfaces, e suportam
herança múltipla (enquanto classes suportam herança
simples);
• Mecanismo para prover flexibilidade devido à ausência de
herança múltipla de classes;
Java - Interface
• Hierarquias de interfaces
– Uma interface pode estender outra
– Uma classe pode implementar várias interfaces
Pessoa é uma outra interface
Método Pedala é abstract
O método Pedala deve ser
implementado nesta classe
Java - Interface
• Hierarquias de interfaces
– Uma interface pode estender outra:
Java - Interface
• Importante:
– Uma interface
pode implementar
uma classe abstrata
• A implementação
dos métodos
abstratos da
interface e da classe
fica para os filhos
Java - Interface
• O que o código está fazendo?
Mensuravel.java
Compara.java
MainCompara.java
Interface - Permitindo a
compatibilidade entre duas
classes diferentes
Exercícios
• Blz... Agora é hora de exercitar.....
• Tente resolver ou analisar os seguintes
problemas...
– Em dupla
– Apresentar ao professor no final da aula
– Pontuação em Atividades em sala de aula...
– Faça o JAVADOC de todos os exercícios!!!
Exercício
1.
Crie um projeto e copie o conteúdo da classe do próximo slide para um arquivo
chamado Mostra.java;
2.
Compile e execute o código;
3.
Analise os resultados;
4.
Retire os marcadores de comentários “//”, e compile;
5.
Por que o código não compila?
6.
Utilizando implements, o que pode ser feito para que o método Nome das classes
Cicrano e Beltrano sejam evocadas?
7.
Utilizando herança simples, o que pode ser feito para que o método Nome das
classes Cicrano e Beltrano sejam evocadas?
8.
Sempre podemos optar por herança simples ou implements?
class Fulano
{
public String Nome()
{
return "Fulano da Silva";
}
}
class Cicrano
{
public String Nome()
{
return "Cicrano da Veiga";
}
}
class Beltrano
{
public String Nome()
{
return "Beltrano da Slovinsky";
}
}
class Mostra
{
static void MostraNome(Fulano r)
{
System.out.println("***> "+r.Nome()+" <***");
}
public static void main(String[] arg)
{
Fulano f=new Fulano();
Cicrano c=new Cicrano();
Beltrano b=new Beltrano();
MostraNome(f);
//MostraNome(c);
//MostraNome(b); } }
Exercício
• O que o código está fazendo? Analise o código,
modifique, veja o que acontece.. Aplique as ideias
que vimos...
Musica.java
Exercicio6.java
Exercício
• Implemente o cenário abaixo
– Definir atributos, métodos, etc...
1/2
Exercício
2/2
• Utiliza e implementa uma interface para um robô
– Exemplo:
• abstract class RoboCop extends Pessoa implements Robo
• Faça com que esse robô também implemente a
interface Relógio
Exercício
• Implementar Hierarquia abaixo, com métodos simplificados
– Definir atributos, métodos, etc... Olhar nos slides anteriores da aula...
Interface
Classes
Exercício
• Considere o diagrama de classes do slide seguinte:
– a) Crie uma interface de nome Motorizado onde são declarados os
métodos void ligarMotor() e void abastecer(int numLitros).
– b) Implemente a interface Motorizado nas classes Aviao e Carro.
– c) Escreva um pequeno programa de teste capaz de verificar a
implementação anterior.
– d) Crie uma interface de nome Conduzivel onde é declarado o método
void curvar(float angulo).
– e) Implemente a interface Conduzivel nas classes Aviao, Carro e
Bicicleta.
– f) Complete o programa de teste efetuado anteriormente por forma a
testar estas últimas implementações.
Exercício
Exercício
• Crie a seguinte hierarquia de classes:
– Uma interface para representar qualquer forma geométrica, definindo
métodos para cálculo do perímetro e cálculo da área da forma;
– Uma classe abstrata para representar quadriláteros. Seu construtor deve
receber os tamanhos dos 4 lados e o método de cálculo do perímetro já
pode ser implementado;
– Classes para representar retângulos e quadrados. A primeira deve
receber o tamanho da base e da altura no construtor, enquanto a
segunda deve receber apenas o tamanho do lado;
– Uma classe para representar um círculo. Seu construtor deve receber o
tamanho do raio.
– No programa principal, crie quadrados, retângulos e círculos com
tamanhos diferentes e armazene num vetor. Em seguida, imprima os
dados (lados ou raio), os perímetros e as áreas de todas as formas.
Exercício
• Implementar classes Pessoa, Liquido e classes filhas
desta;
– Pessoa deve implementar o método beber(Liquido);
– Criar outros atributos e métodos que se julgue
necessários;
– Imprimir estado da pessoa ao beber diferentes tipos de
líquido;
Exercício
Exercício
• Desenvolva as classes ao lado.
– Crie uma classe ExemploBanco que faça
operações nesse banco.
– Pegue as informações via teclado
ContaPoupança
diaAniversário
correção
contaPoupança()
corrigeSaldo()
mostraSaldo()
ContaDeBanco
saldo
contaDeBanco()
deposito()
retirada()
mostraSaldo()
ContaEspecial
limite
contaEspecial()
mostraSaldo()
Exercício
Exercício
Exercício
Exercício
• Identifique e explique o(s) erro(s) na classe a
seguir.
• Implemente as correções
• Implemente uma classe que cria uma instância de
EntradaNaAgenda e acesse o método
toString()
Exercício
Exercício
• Identifique e explique o(s) erro(s) na classe a
seguir.
• Implemente as correções
• Implemente uma classe que cria uma instância de
DiscoOtico e acesse os métodos toString() e
capacidadeEmMegabytes()
Exercício
Exercício
• O que o código está fazendo?
Exercício
• O que o código está fazendo?
Exercício
• O que o código está fazendo?
Exercicio5.java
Exercício
• O que será impresso?
Exercício
• O que será impresso?
Exercício
• Considere o diagrama de classes do slide seguinte:
– Crie as relações...
– Escreva um pequeno programa de teste capaz de verificar
a implementação anterior.