A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Herança Profa. Isabel Harb Manssour (Material adaptado das aulas dos Profs: Luciana Nedel e Júlio Machado) Packages (bibliotecas de classes) Atributos.

Apresentações semelhantes


Apresentação em tema: "Herança Profa. Isabel Harb Manssour (Material adaptado das aulas dos Profs: Luciana Nedel e Júlio Machado) Packages (bibliotecas de classes) Atributos."— Transcrição da apresentação:

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

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

3 Atributos de acesso Atributo Acesso permitido…
sem atributo de todas as classes no mesmo package public de qualquer classe em qualquer lugar private sem acesso de fora da classe protected de todas as classes no mesmo package e a partir de qualquer sub-classe em qualquer lugar

4 Atributos de acesso Classe1 int a; public int b; protected int c;
private int e; SubClasse1 Classe2 Package1 Classe1 int a; public int b; protected int c; private int e; SubClasse1 Classe2 Package3 Package1 Package2

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

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

7 Atributos de acesso (notação UML)
Classe (concreta): Descrição: classe que possui objetos Notação: primeira parte: nome da classe segunda parte: atributos terceira parte: operações Observações: atributo de classe é sublinhado operação de classe é sublinhado Conta + numero: int # saldo: float - senha: String - saldoInicial: float = 0.0 + depositar (valor: float) + verificaSenha (senha: String): boolean - geraNovoNumero(): int

8 Atributos de acesso (notação UML)
Conta + numero: int # saldo: float - senha: String - saldoInicial: float = 0.0 + depositar (valor: float) + verificaSenha (senha: String): boolean - geraNovoNumero(): int 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

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

10 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óprios Sobrecarga de métodos - redefine métodos herdados Subclasses herdam de superclasses Superclasse direta - subclasse herda explicitamente Superclasse indireta - subclasse herda de dois ou mais níveis superiores na hierarquia de classes

11 Herança (notação UML) super-classe direta de B
super-classe indireta de C sub-classe direta de A super-classe direta de C sub-classe direta de B sub-classe indireta de A

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

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

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

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

16 Herdando variáveis Classe int a; public int b; protected int c; private int e; SubClasse SubClasse Package2 Package1 Package1 ATENÇÃO: Para derivar uma classe de fora do package contendo a classe base, a classe base deve ser declarada como public.

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

18 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

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

20 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) nome = nome1; // Nome fornecido raça =r; // Raça fornecida

21 Exemplo public class Animal { private String 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) nome = nome1; // Nome fornecido raça = r; // Raça fornecida public class Animal { private String tipo; public Animal(String tipo1) tipo = new String(tipo1); } public void show() System.out.println(“Eu sou um ” + tipo);

22 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 cachorro

23 Exemplo Sobrecarregando métodos da classe base: public void show()
Inclua na classe Cachorro o método: public void show() { super.show(); // Chama o método base System.out.println(nome + “é um” + raça); } Saída: Eu sou um cachorro Lessie é um collie Rupert é um desconhecida Quando sobrecarregamos um método definido na super-classe, DEVEMOS manter o mesmo atributo de acesso da super-classe.

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

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

26 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:

27 Exemplo (solução 1) Classe ProfDE Classe ProfHorista
String nome, matricula int idade float salario String nome, matricula int idade, int totalHoras float salarioHora ProfDE(String, String, int, float) String getNome() String getMatricula() int getIdade() float getSalario() ProfHorista(String, String, int, int, float) String getNome() String getMatricula() int getIdade() float getSalario() int getHoras()

28 Exemplo (solução 1) As classes têm alguns atributos e métodos iguais.
Classe ProfDE Classe ProfHorista String nome, matricula int idade float salario String nome, matricula int idade, int totalHoras float salarioHora ProfDE(String, String, int, float) String getNome() String getMatricula() int getIdade() float getSalario() ProfHorista(String, String, int, int, float) String getNome() String getMatricula() int getIdade() float getSalario() int getHoras() 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!

29 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, matricula int idade Professor(String, String, int) String getNome() String getMatricula() int getIdade() float getSalario()

30 Exemplo (solução 2) Classe Professor String nome, matricula int idade
Professor(String, String, int) String getNome() String getMatricula() int getIdade() float getSalario() Classe ProfDE Classe ProfHorista float salario int totalHoras float salarioHora ProfDE(String, String, int, float) float getSalario() ProfHorista(String, String, int, int, float) float getSalario() int getHoras()

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

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

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

34 Exercícios 1) Codifique em Java a seguinte hierarquia de classes para objetos geométricos: Classe Ponto atributos protected x, y métodos: setPonto, getX, getY Classe Circulo (extends Ponto) atributo protected raio métodos: setRaio, getRaio, area Classe Cilindro (extends Circulo) atributo protected altura métodos: setAltura, getAltura, area (superfície), volume

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

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

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

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

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

40 Respostas dos exercícios
1) 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 + "]";

41 Respostas dos exercícios
1) 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;

42 Respostas dos exercícios
1) 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;


Carregar ppt "Herança Profa. Isabel Harb Manssour (Material adaptado das aulas dos Profs: Luciana Nedel e Júlio Machado) Packages (bibliotecas de classes) Atributos."

Apresentações semelhantes


Anúncios Google