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

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

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

Apresentações semelhantes


Apresentação em tema: "Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso."— Transcrição da apresentação:

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

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

3 Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Atributos de acesso AtributoAcesso permitido… sem atributode 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 Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Atributos de acesso Classe1 int a; public int b; protected int c; private int e; Classe2 SubClasse1 Package1Package2 Package3 Classe1 int a; public int b; protected int c; private int e; Classe2 SubClasse1 Package1

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

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

7 Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Conta + numero: int # saldo: float - senha: String - saldoInicial: float = 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 classe §segunda parte: atributos §terceira parte: operações Observações: §atributo de classe é sublinhado §operação de classe é sublinhado

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

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

10 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ó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 - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour 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 - 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.

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

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

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

16 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; SubClasse Package1 Package2 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.

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

18 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

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

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

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

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

23 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 cachorro Lessie é um collie Eu sou um cachorro Rupert é 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); }

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

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

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

27 Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Exemplo (solução 1) Classe ProfDE String nome, matricula int idade float salario ProfDE(String, String, int, float) String getNome() String getMatricula() int getIdade() float getSalario() Classe ProfHorista String nome, matricula int idade, int totalHoras float salarioHora ProfHorista(String, String, int, int, float) String getNome() String getMatricula() int getIdade() float getSalario() int getHoras()

28 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, matricula int idade float salario ProfDE(String, String, int, float) String getNome() String getMatricula() int getIdade() float getSalario() Classe ProfHorista String nome, matricula int idade, int totalHoras float salarioHora ProfHorista(String, String, int, int, float) String getNome() String getMatricula() int getIdade() float getSalario() int getHoras()

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

30 Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour 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 float salario ProfDE(String, String, int, float) float getSalario() Classe ProfHorista int totalHoras float salarioHora ProfHorista(String, String, int, int, float) float getSalario() int getHoras()

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

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

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

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

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

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

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

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

40 Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour 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 Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour 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 Herança - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour 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 - Desenvolvido pela Profa. Luciana Porcher Nedel e alterado pela Profa. Isabel Harb Manssour Packages (bibliotecas de classes) Atributos de acesso."

Apresentações semelhantes


Anúncios Google