Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb...

42
esenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso Herança de classe Herdando variáveis Herdando métodos Exemplo Exercícios Herança Profa. Isabel Harb Manssour (Material adaptado das aulas dos Profs: Luciana Nedel e Júlio Machado)

Transcript of Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb...

Page 1: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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)

Page 2: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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;

Page 3: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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

Page 4: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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

Page 5: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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.

Page 6: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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.

Page 7: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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

Page 8: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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)

Page 9: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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.

Page 10: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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

Page 11: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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

Page 12: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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.

Page 13: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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.

Page 14: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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> {...

}

Page 15: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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.

Page 16: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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.

Page 17: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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.

Page 18: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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

Page 19: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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); }}

Page 20: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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 }}

Page 21: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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 }}

Page 22: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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

Page 23: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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);

}

Page 24: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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.

Page 25: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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.

Page 26: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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:

Page 27: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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()

Page 28: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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()

Page 29: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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()

Page 30: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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()

Page 31: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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; }}

Page 32: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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);

}

}

Page 33: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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); }}

Page 34: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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

Page 35: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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).

Page 36: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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.

Page 37: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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).

Page 38: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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.

Page 39: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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.

Page 40: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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 + "]"; }

}

Page 41: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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; }}

Page 42: Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso.

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; }}