Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb...
Transcript of Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb...
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Packages (bibliotecas de classes)Atributos de acessoHerança de classeHerdando variáveisHerdando métodosExemploExercícios
Herança Profa. Isabel Harb Manssour(Material adaptado das aulas dos Profs: Luciana Nedel e Júlio Machado)
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Bibliotecas de classes Java
Biblioteca = coleção de classes, normalmente provendo uma série de facilidades que podem ser usadas em programas.
Classes são agrupadas em conjuntos chamados packages, sendo que cada pacote é guardado em um diretório diferente. Exemplo: o package java.lang está armazenado no diretório java/lang.
Para usar um pacote: import java.util;
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Atributos de acesso
Atributo Acesso permitido…sem atributo de todas as classes no mesmo
packagepublic de qualquer classe em qualquer lugarprivate sem acesso de fora da classeprotected de todas as classes no mesmo
packagee a partir de qualquer sub-classe emqualquer lugar
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Atributos de acesso
Classe1int a;public int b;protected int c;private int e;
Classe2 SubClasse1
Package1 Package2Package3
Classe1int a;public int b;protected int c;private int e;
Classe2 SubClasse1
Package1
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Atributos de acesso
Recomendações: deve-se sempre especificar explicitamente um membro
de uma classe como public ou private. A menos que hajam razões fortes para isso, as
variáveis de uma classe devem ser definidas como private e os métodos que são chamados de fora da classe devem ser public.
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Atributos de acesso
Exceções: membros de uma classe definidos como final
possuem valor fixo e podem ser usados de fora da classe. Assim sendo, recomenda-se que sejam declarados como public.
métodos que devem ser usados somente dentro da própria classe, devem ser especificados como private.
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Conta
+ numero: int# saldo: float- senha: String- saldoInicial: float = 0.0
+ depositar (valor: float)+ verificaSenha (senha: String): boolean- geraNovoNumero(): int
Atributos de acesso (notação UML)
Classe (concreta): Descrição: classe que possui
objetos Notação:
primeira parte: nome da classesegunda parte: atributosterceira parte: operações
Observações:atributo de classe é sublinhadooperação de classe é sublinhado
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Conta
public class Conta { // Classe concreta
public int numero; // Atributo de objeto público protected float saldo; // Atributo de objeto protegido private String senha; // Atributo de objeto privado private static float saldoInicial = 0.0; // Atributo de classe privado public void depositar(float valor); // Método de objeto public boolean verificaSenha(String senha) { // Método de objeto }
private static int geraNumeroNovo() { // Método de classe }}
+ numero: int# saldo: float- senha: String- saldoInicial: float = 0.0
+ depositar (valor: float)+ verificaSenha (senha: String): boolean- geraNovoNumero(): int
Atributos de acesso (notação UML)
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Herança
Uma característica importante da programação orientada a objetos é permitir a criação de novas classes com base em uma classe já existente. Esta classe pode ser tanto uma classe própria como uma classe standard do Java ou ainda uma classe construída por outra pessoa
Objetivo: reuso de software.
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Herança
Herança - Proporciona o reuso de software Novas classes são criadas a partir de outras já
existentes Absorvem atributos e comportamentos além de
adicionarem os seus própriosSobrecarga de métodos - redefine métodos herdados
Subclasses herdam de superclassesSuperclasse direta - subclasse herda explicitamenteSuperclasse indireta - subclasse herda de dois ou mais
níveis superiores na hierarquia de classes
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Herança (notação UML)
super-classe direta de Bsuper-classe indireta de C
sub-classe direta de Asuper-classe direta de C
sub-classe direta de Bsub-classe indireta de A
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Herança
Vocabulário: Derivação: definição de uma nova classe baseada em
outra já existente. Classe derivada: sub-classe direta da classe da qual
ela deriva. Classe base: classe original, que forma a base para a
definição das classes derivadas. Super-classe de uma classe derivada: classe original.
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Herança de classe
Inclusão de membros da classe base em uma classe derivada.
Observação: nem todos os membros da classe base são obrigatoriamente acessíveis na classe derivada. Isto dependerá dos atributos de acesso do membro.
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Herança de classe
Um membro herdado por uma classe derivada é tratado como um membro desta classe. Ou melhor, quando definimos um método na classe derivada, podemos nos referir a métodos e variáveis herdados da classe base, como se tivessem sido definidos dentro da classe derivada.
Utiliza-se a palavra-chave extends para definir herança de classes
class <subclasse> extends <superclasse> {...
}
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Herança de classe
Herança cria uma estrutura hierárquica (árvore) Ex.: uma hierarquia de classe para a classe Forma
geométrica Um Quadrado é uma FormaBidimensional.
Quadrado é um tipo específico de FormaBidimensional.FormaBidimensional é a superclasse.Quadrado é a subclassse.
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Classe
int a;public int b;
protected int c;
private int e;
SubClasseSubClasse
Package1 Package1Package2
Herdando variáveis
ATENÇÃO: Para derivar uma classe de fora do package contendo a classe base, a classe base deve ser declarada como public.
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Herdando métodos
A regra para herança de métodos é a mesma aplicada para herança de variáveis, com exceção dos métodos construtores, que não são NUNCA herdados.
Os métodos na classe derivada que foram herdados da classe base, continuam podendo acessar TODOS os membros da classe base, incluindo os não herdados.
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Herdando métodos
Apesar dos construtores da classe base não serem herdados, eles podem ser chamados para inicializar os atributos herdados (membros da classe base), quando necessário Utiliza-se super()
Se for chamado dessa forma, deve ser o primeiro comando do construtor da subclasse
Veja o exemplo
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Exemplo
public class Animal{ private String tipo;
public Animal(String tipo1) { tipo = new String(tipo1); }
public void show() { System.out.println(“Eu sou
um ” + tipo); }}
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Exemplo
public class Animal{ private String tipo;
public Animal(String tipo1) { tipo = new String(tipo1); }
public void show() { System.out.println(“Eu sou
um ” + tipo); }}
public class Cachorro extends Animal{ private String nome; // Nome do cachorro private String raça; // Raça do cachorro
public Cachorro(String nome1) { // Chama o construtor da classe base super(“cachorro”); nome = nome1; // Nome fornecido raça = “Desconhecida”; // Raça default }
public Cachorro(String nome1, String r) { // Chama o construtor da classe base super(“cachorro”); nome = nome1; // Nome fornecido raça =r; // Raça fornecida }}
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Exemplo
public class Animal{ private String tipo;
public Animal(String tipo1) { tipo = new String(tipo1); }
public void show() { System.out.println(“Eu sou
um ” + tipo); }}
public class Cachorro extends Animal{ private String nome; // Nome do cachorro private String raça; // Raça do cachorro
public Cachorro(String nome1) { // Chama o construtor da classe base super(“cachorro”); nome = nome1; // Nome fornecido raça = “Desconhecida”; // Raça default }
public Cachorro(String nome1, String r) { // Chama o construtor da classe base super(“cachorro”); nome = nome1; // Nome fornecido raça = r; // Raça fornecida }}
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Exemplo
public class TestaDerivação{ public static void main(String[] args) { // Cria um objeto cachorro Cachorro cão = new Cachorro(“Lassie”, “Collie”); // Cria mais um cachorro
Cachorro outro = new Cachorro(“Rupert”);cão.show();outro.show();
}}
Saída:Eu sou um cachorroEu sou um cachorro
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Quando sobrecarregamos um método definido na super-classe, DEVEMOS manter o mesmo atributo de acesso da super-classe.
Saída:Eu sou um cachorroLessie é um collieEu sou um cachorroRupert é um desconhecida
Exemplo
Sobrecarregando métodos da classe base: Inclua na classe Cachorro o método:
public void show()
{
super.show(); // Chama o método base
System.out.println(nome + “é um” + raça);
}
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Escolhendo os atributos de acesso da super-classe
Métodos que fazem a interface externa de uma classe devem ser declarados como public (sendo portanto herdados pelas sub-classes)
Variáveis devem ser private.Se deseja-se que a classe seja usada como super-
classe por outras pessoas, deve-se manter as variáveis como private e prover métodos de acesso e manipulação como public. Controla-se assim a manipulação da classe base por parte da classe derivada.
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Escolhendo os atributos de acesso da super-classe
Usamos o atributo protected quando definimos classes dentro de um package e desejamos dar ao usuário do package (desenvolvedor de classes em outro package) acesso apenas as sub-classes.
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Exemplo (problema...)
Os professores de uma universidade dividem-se em 2 categorias professores em dedicação exclusiva (DE) professores horistas
Professores em dedicação exclusiva possuem um salário fixo para 40 horas de atividade semanais
Professores horistas recebem um valor estipulado por hora O cadastro de professores desta universidade armazena o
nome, idade, matrícula e informação de salário Problema pode ser resolvido através de uma modelagem
de classes como segue:
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Exemplo (solução 1)
Classe ProfDE
String nome, matriculaint idadefloat salario
ProfDE(String, String, int, float)String getNome()String getMatricula()int getIdade()float getSalario()
Classe ProfHorista
String nome, matriculaint idade, int totalHorasfloat salarioHora
ProfHorista(String, String, int, int, float) String getNome() String getMatricula() int getIdade() float getSalario() int getHoras()
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Exemplo (solução 1)
As classes têm alguns atributos e métodos iguais. O que acontece se precisarmos alterar a representação de algum atributo,
como por exemplo, o número de matrícula para inteiros ao invés de uma string ?
Será necessário alterar os construtores e os métodos getMatricula() nas duas classes, o que é ruim para a programação
Motivo: código redundante Como resolver ? Herança!
Classe ProfDE
String nome, matriculaint idadefloat salario
ProfDE(String, String, int, float)String getNome()String getMatricula()int getIdade()float getSalario()
Classe ProfHorista
String nome, matriculaint idade, int totalHorasfloat salarioHora
ProfHorista(String, String, int, int, float) String getNome() String getMatricula() int getIdade() float getSalario() int getHoras()
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Exemplo (solução 2)
“Herança é a capacidade de reutilizar código pela especialização de soluções genéricas já existentes”
Neste caso, cria-se uma classe Professor, que contém os atributos e métodos comuns aos dois tipos de professor:
A partir dela, cria-se duas novas classes, que representarão os professores horistas e DE.
Para isso, essas classes deverão “herdar” os atributos e métodos declarados pela classe “pai”, Professor.
Classe Professor
String nome, matriculaint idade
Professor(String, String, int)String getNome()String getMatricula()int getIdade()float getSalario()
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Exemplo (solução 2)
Classe Professor
String nome, matriculaint idade
Professor(String, String, int)String getNome()String getMatricula()int getIdade()float getSalario()
Classe ProfDE
float salario
ProfDE(String, String, int, float)float getSalario()
Classe ProfHorista
int totalHorasfloat salarioHora
ProfHorista(String, String, int, int, float)float getSalario()int getHoras()
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Exemplo (solução 2)
class Professor{ protected String nome; protected String matricula; protected int idade;
public Professor(String n, String m, int i) { nome = n; matricula = m; idade = i; }
public String getNome(){ return nome; } public String getMatricula(){ return matricula; } public int getIdade(){ return idade; } public float getSalario(){ return 0; }}
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Exemplo (solução 2)
class ProfDE extends Professor
{
protected float salario;
public ProfDE(String n, String m, int i, float vs)
{
super(n,m,i);
if (vs > 0) salario = vs;
}
public float getSalario()
{
return salario - (salario * 0.16);
}
}
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Exemplo (solução 2)
class ProfHorista extends Professor{ protected float salarioHora; protected int totalHoras;
public ProfHorista(String n, String m, int i, int h, float vs) { super(n,m,i); if (h > 0) totalHoras = h; if (vs > 0) salarioHora = vs; }
public float getSalario() { float salarioBase = salarioHora * totalHoras; return salarioBase - (salarioBase * 0.16); }}
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Exercícios
1) Codifique em Java a seguinte hierarquia de classes para objetos geométricos:
Classe Pontoatributos protected x, ymétodos: setPonto, getX, getY
Classe Circulo (extends Ponto)atributo protected raiométodos: setRaio, getRaio, area
Classe Cilindro (extends Circulo)atributo protected alturamétodos: setAltura, getAltura, area (superfície), volume
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Exercícios
2) Defina uma classe em Java chamada “Produto” para armazenar as informações de um produto. A classe deve armazenar o nome do produto, a quantidade armazenada e o preço unitário. A rotina construtora deve receber o nome, a quantidade e o preço unitário. A classe deve oferecer rotinas tipo “get” para todos os campos. Deve oferecer ainda uma rotina onde se informa uma certa quantidade a ser retirada do estoque e outra onde se informa uma certa quantidade a ser acrescida ao estoque. A rotina onde se informa uma quantidade a ser retirada do estoque deve retornar a quantidade que efetivamente foi retirada (para os casos em que havia menos produtos do que o solicitado).
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Exercícios
3) Defina uma classe em Java derivada da classe “Produto” chamada “ProdutoPerecivel” que possui um atributo extra que guarda a data de validade do produto. As rotinas através das quais se informa as quantidades a serem retiradas ou acrescidas do estoque devem ser alteradas. A rotina de retirada deve receber também por parâmetro a data do dia corrente. Se os produtos já estiverem armazenados há mais de 2 meses a rotina deve zerar o estoque e devolver 0, pois produtos vencidos são jogados fora. A rotina de acréscimo no estoque só deve acrescentar os novos produtos caso o estoque esteja zerado, de maneira a evitar misturar produtos com prazos de validade diferenciados.
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Exercícios
4) Defina uma classe Java derivada da classe “ProdutoPerecivel” chamada “ProdPerEsp” que oferece uma rotina de impressão de dados capaz de imprimir uma nota de controle onde consta o nome do produto, a quantidade em estoque e a data de validade.
5) Defina uma classe “ProdPr” derivada de “Produto” que possua campos para armazenar o preço unitário do produto. A classe deve oferecer rotinas para permitir obter o preço unitário, alterar o preço unitário (sempre positivo) e retornar o custo do estoque (preço unitário * quantidade em estoque).
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Exercícios
6) Defina uma classe chamada “Estoque” que mantém uma lista com os produtos em estoque (do tipo “ProdPr”). A classe deve ter métodos para o cadastramento de produtos, consulta a produtos, inserções e retiradas do estoque bem como uma que informa o custo total do estoque armazenado.
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Exercício em laboratório
Escreva o código para implementar a seguinte hierarquia de classes:
Atributos da classe “Animal” :•String nome
Métodos da classe “Animal”:•void imp() // imprime o nome // e a classe do animal•String getNome()•void talk() // “Me not falar”
Métodos da classe “Passaro”:•void talk() // “piu, piu.”
Métodos da classe “BemTeVi”:•void talk() // “bem-te-vi!”
Atributos da classe “Papagaio”:•String vocabulario // frase
Métodos da classe “Papagaio”:•void talk() // exibe vocabulario•void setVoc(String v) //altera voc.
A classe mamífero não tem atributos ou métodos.
Atributos da classe “Cachorro”:•boolean lateMuito
Métodos da classe “Cachorro”:•void setLateAlto()•void setLateBaixo()•void talk() // “AU! AU!” ou “au, au...”
Métodos da classe “Vaca”;•void talk() // “Muuu...”
Implemente a classe Zoo (possui apenas o método main) que testa a hierarquia de classes, mantendo vetores de animais. A saída do programa deve ser feita via uma janela gráfica.
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Respostas dos exercícios1)public class Ponto { protected float x,y;
public Ponto() { x = y = 0; } public Ponto(float x,float y) { setPonto(x,y); } public void setPonto(float x,float y) { this.x = x; this.y = y; } public float getX() { return x; } public float getY() { return y; }
// O método toString() retorna uma representação textual de um objeto public String toString() { return "[" + x + ", " + y + "]"; }
}
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Respostas dos exercícios1)public class Circulo extends Ponto { protected float raio; public Circulo() { // construtor de Ponto é chamado implicitamente! setRaio(0); } public Circulo(float x,float y,float raio) { super(x,y); // construtor de Ponto é chamado explicitamente! setRaio(raio); } public void setRaio(float raio) { if(raio<=0) raio = 0; this.raio = raio; } public float getRaio() { return raio; } public double area() { return Math.PI * raio * raio; } // O método toString() retorna uma representação textual de um objeto public String toString() { return "Centro=" + super.toString()+ "Raio= " + raio; }}
Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour
Respostas dos exercícios1)public class Cilindro extends Circulo { protected float altura; public Cilindro() { // construtor de Circulo é chamado implicitamente! setAltura(0); } public Cilindro(float x,float y,float raio,float alt) { super(x,y,raio); // construtor de Circulo é chamado explicitamente! setAltura(alt); } public void setAltura(float altura) { if(altura<=0) altura = 0; this.altura = altura; } public float getAltura() { return altura; } public double area() {
return 2 * super.area() + 2*Math.PI * raio * altura; } public double volume() { return super.area() * altura; } public String toString() { return super.toString()+ "Altura=" + altura; }}