Programação Orientada a Objetos Herança e Polimorfismo Prof. Jailton Carlos
[email protected] 14/10/2010
1
Plano de Aula
Abstração e Encapsulamento Herança Simples; Multiplas; Conceito Subtipo; Palavra-cha super Palavra-cha Classe base Object; Cadeia de Construtores
Exercícios de Fixação Exercícios Exercícios em sala de aual
14/10/2010
2
Abstração e Encapsulamento São conceitos complementares Abstração foca sobre o comportamento observável de um objeto, enquanto encapsulamento se concentra na execução que dá origem a esse comportamento O encapsulamento proporciona barreiras explícitas entre abstrações diferentes e, portanto, leva a uma separação clara das preocupações.
3
Abstração e Encapsulamento
Interface Visão externa da classe O que os objetos da classes fazem Definem o “contrato ” da classe O que o cliente precisa conhecer da classe
Implementação Visão interna da classe Como os objetos fazem as operação Representação interna
14/10/2010
4
Abstração e Encapsulamento
Cliente não precisa (nem deve) conhecer a implementação
Atributos fazem parte da implementação
Realizam o contrato definido pela interface Declare-os como private
Nem todos os métodos fazem parte da interface
Métodos que servem para auxiliar outros métodos
Declare-os private Deixe public apenas o que o cliente deve saber
14/10/2010
5
Herança
Dado um sistema de venda que permita o cadastro de pessoa física ou Jurídica. Como evita a redundância? O que eles têm em comum? Como eles são relacionados?
PESSOA FÍSICA Atributos: Nome Endereco Telefone CPF •
•
•
•
PESSOA JURÍDICA Atributos: Nome Endereco Telefone CNPJ Inscrição Estadual Inscrição Municipal •
•
•
•
•
•
6
Herança
Solução: Utilização de herança Pessoa
Seta vazada indica herança
-nome: St ring -endereco: String -telefone: String +calcImpostoDeRenda(): double
PessoaFisica
PessoaJuridica
-cpf: String -rg: String -dataNascimento: Calendar
-cnpj: String -inscrEstadual: String -inscrMunicipal: String
Atributos e métodos existem nas subclasses
Pessoa Física e Pessoa Jurídica herdam os atributos e métodos de Pessoa.
7
Herança Define uma relação entre as classes, onde uma classe compartilha a estrutura ou o comportamento definido e uma ou mais classes. Herança representa, portanto, uma hierarquia de abstrações, na qual um subclasse herda de uma ou mais superclasses. Duas razões mais comuns parar se usar a herança são:
Para promover a reutilização de códigos; Par usar o polimorfismo.
8
Herança Estrutura Hierárquica e modular Projeção de classes genéricas que podem ser especializadas em classes mais particulares. Classes especializadas reutilizam o código das mais genéricas.
A
B
Classe D A CB Especializada C Características Herdadas
Classe Genérica
A
Classe B E Especializada
Herança
Classe genérica, classe base, superclasse ou pai:
Define variáveis de instância “genéricas” e métodos.
Classe especializada, derivada, subclasse ou filha: Especializa, estende ou herda os métodos “genéricos” de uma superclasse; Define apenas os métodos que são especializados.
Herança Simples Animal -nome: String -sexo: String -raca: String +emitirSom() +dormir() +caminhar() Leao Gato
Tigre
Cachorro Lobo
11
Hierarquias de Herança Animal -nome: String -sexo: String -raca: String
Gato possui todas as características de Animal e também de Domestico.
+emitirSom() +dormir() +caminhar()
Selvagem
Domestrico
Gato
Leao
Tigre Lobo
Cachorro
12
Herança em Java Pessoa -nome: String -endereco: String -telefone: String
}
+calcImpostoDeRenda(): double
} }
PessoaFisica -cpf: String -rg: String -dataNascimento: Calendar
}
Usamos extends para indicar herança em Java
} 14/10/2010
}
13
Execução Pessoa p = PessoaFisica pf = p.setNome("João"); pf.setNome("José"); pf.setCpf("032..."); System.out.println(p.getNome()); System.out.println(pf.getNome()); System.out.println(pf.getCpf());
Pessoa -nome: String -endereco: String -telefone: String +calcImpostoDeRenda(): double
}
PessoaFisica -cpf: String -rg: String -dataNascimento: Calendar
Método herdado da classe Pessoa
Todos as características existentes na classe Pessoa também existem na classe PessoaFisica 14 14/10/2010
Subtipos
Uma classe que herda de outra é um subtipo
Herança representa relacionamento “É UM” Uma referência a Animal Carro “É UM” veículo; sempre poderá apontar Pessoa Física “É UMA” Pessoa; para uma instância de Gato, porque Gato É UM Animal. Gato “É UM” Animal. •
•
•
Podemos ter uma variável do tipo Pessoa que referencia um objeto do tipo PessoaFisica
Variável p2 NÃO executa métodos da classe PessoaFisica, pois ela só conhece a interface de Pessoa
Pessoa p1,p2; p1 = Pessoa(); p2 = PessoaFisica(); p1.setNome("João"); p2.setNome("José"); //p2.setCPF(“032..."); System.out.printf( “%s,%s", p1.getNome(),p2.getNome()); 15
Subtipos Uma referência a Pessoa sempre poderá apontar para uma instância de PessoaFisica, porque PessoaFiscia É UMA Pessoa; O que torna possível a superclasse referenciar uma instância da subclasse é a certeza de que a subclasse pode fazer tudo que a superclasse pode fazer.
16
super
Palavra-chave que faz o compilador chamar o método ou construtor da superclasse. O compilador Java invoca super implicitamente para chamar o construtor da superclasse. public class Ponto { protected int x,y; public Ponto (int x, int y) {
x = 0; y = 0;
Chama o construtor da classe pai, neste caso, o construtor da classe Ponto.
14/10/2010
} } public class Quadrado extends Ponto{ protected double lado; public Quadrado(int x, int y, double lado){ super(x,y); this.lado=lado;
}
17
Classe Object
Classe base em JAVA Tudo herda de Object Define alguns métodos:
•
•
•
public String toString () public boolean equals() entre outros... Incluído por padrão
class Animal { }
class Animal extends Object { }
Cadeia de Construtores
Toda vez que instanciamos um objetos, o compilador Java por padrão chama todos os construtores padrão das superclasses.
Assuma que Gato estende Animal. O que ocorre quando instanciamos Gato?
1. 2. 3. 4.
Gato g = new Gato()
5.
Pilhas de chamadas
4. Object() 3. Animal() chama super() 2. Gato chama super() 1. main chama new Gato() 14/10/2010
6. 7. 8. 9.
O construtor de Gato será chamado. O construtor de Animal será chamado. O construtor de Object será chamado. As variáveis de instância de Object receberão seus valores explicitos. A execução do construtor de Object será concluída. As variáveis de instância de Animal receberão seu valores explícitos (se houver). A execução do construtor de Animal será concluída. As variáveis de instância de Gato receberão seus valores explícitos (se houver) A execução do construtor de gato será concluída 19
Dúvidas
14/10/2010
20
Exercício de fixação
Identifique o erro e explique por quê?
public class A { public void setX () {} public void setY () {}
a.setZ()
} public class B extends A{ public void setZ () {}
} public static void main(String[] args) { A a = new B(); B b = new B() a.setX(); b.setY(); a.setZ(); }
O tipo de uma variável de referência determina os métodos que podem ser chamados no objeto o qual a variável está referenciado.
Exercício de fixação
Identifique o erro:
public class Animal { private String nome; public Animal (String nome) {
this.nome = nome; } } public class Gato extends Animal{ public Gato(){
} }
Erro ao compilar, implícito construtor super () não definido. Se a superclasse não tiver um construtor sem argumentos, as subclasses não poderão usar o construtor padrão.
Exercício de fixação
Qual é o resultado do código a seguir?
public class Animal { private String nome; public Animal() { System.out .print( "B" );
BE.
} } public class Cachorro extends Animal { public Cachorro() { System.out .print( "C" );
} public Cachorro(String s) { System.out .print( "E" );
} } public static void main(String[] args) { new Cachorro("D"); System.out .println( "" ); }
Cadeia de construtores. Chamada implícita do construtor super ()
Exercício 1
Passo 1: implementar as classes
Pessoa
-nome: String -endereco: String -telefone: String +calcImpostoDeRenda(): double
PessoaFisica
PessoaJuridica
cpf: String rg: String dataNascimento: Calendar
-cnpj: String -inscrEstadual: String -inscrMunicipal: String
conforme o diagrama; uso do extends. Passo 2: criar construtores padrão para cada classe e imprimir seus respectivos nomes; Passo 3: criar construtores que receba como parâmetros variáveis para inicializar os atributos; uso do super. Passo 4: criar os métodos gets e sets; Passo 5: criar uma classe Principal com o método main para criar as instâncias p, pF e pJ de sua respectivas classes. Passo 6: Verificar o que ocorre se chamar p.SetCPF() e p.setCNPJ() e explique; Passo 7: Verificar o que será impresso ao chamar o construtor padrão de PessoaFisica e de PessoaJuridica. uso cadeia de construtor
Exercício 2
Implementar as classes do diagrama: Animal -nome: String -sexo: String -raca: String +emitirSom() +dormir() +caminhar()
Selvagem
Domestrico
Gato
Leao
Tigre Lobo
Cachorro
Referências Sierra, K.; Bates, B. SCJP: Certificação Sun para Programador Java 6 – Guia de Estudo. Alta Books, 2008. Horstmann, C. S; Cornell, G. Core Java: Volume I – Fundamentos. 8ª edição. Pearson, 2010. DEITEL, H. M.; DEITEL, P. J. Java: como programar. 8ª Edição. Pearson, 2010. Material de aula da disciplina de POO criado pelo prof. Alexandre e Bruno Gomes. 14/10/2010
26