PROGRAMAÇÃO ORIENTADA A OBJETOS: HERANÇA

Documentos relacionados
PROGRAMAÇÃO ORIENTADA A OBJETOS: OCULTAR INFORMAÇÕES E ENCAPSULAMENTO

Introdução a classes e objetos. Prof. Marcelo Roberto Zorzan

Linguagem de Programação. Diagrama de classes

PROGRAMAÇÃO ORIENTADA A OBJETOS: CONSTRUTORES

Herança e Propriedades

Lista 05 Herança. public class PessoaFisica extends Pessoa { private String RG; public PessoaFisica(){ super(); } public String getrg(){ return RG; }

Programação Orientada a Objetos. Vagner Luz do Carmo - Vluzrmos

Herança. Prof. Fernando V. Paulovich 23 de agosto de 2010

Programação OO em Java. Profa Andréa Schwertner Charão DLSC/CT/UFSM

Linguagem de Programação Orientada a Objeto Abstração - Encapsulamento

Programação OO em Java. Profa Andréa Schwertner Charão DELC/CT/UFSM

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Programação Orientada a Objetos SANTOS, Rafael

Aula 7 POO 1 Herança. Profa. Elaine Faria UFU

POO29004 Programação Orientada a Objetos

Aula 08 Encapsulamento. Disciplina: Programação Estruturada e Orientada a Objetos Prof. Bruno Gomes

LÓGICA DE PROGRAMAÇÃO (JAVA) HERANÇA. Professor Carlos Muniz

Programação. Orientada a Objetos: Herança. Objetos. Relacionamento entre classes. Análise e Projeto Orientados a. Objetos

Recapitulando. Construtores: (Overload assinatura) public Circle() {...} public Circle(double x, double y, double r) {... }

Programação Orientada a Objetos. Professor: André Luis Meneses Silva br.geocities.com/programacao2ufs

POO Fundamentos Parte III. Professor Vicente Paulo de Camargo

Ex: carro_desportivo poderá ser uma subclasse de automóvel (carro_desportivo é_um automóvel)

A B Classe Genérica D A C. Classe Especializada. Classe Especializada. Características Herdadas

Notas de Aula 04: Herança e polimorfismo.

9 Classes Abstractas e Interfaces

Programação Orientada a Objetos Flávio de Oliveira Silva 144

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Linguagem de Programação III

Universidade Federal de Uberlândia

UNIVERSIDADE FEDERAL DE MATO GROSSO DO SUL SISTEMAS DE INFORMAÇÃO - CÂMPUS DE COXIM FUNDAMENTOS EM ORIENTAÇÃO A OBJETOS

4 Conceito de Herança

COMPORTAMENTOS - Observações

Programação Orientada a Objetos para Redes de Computadores

Linguagem de Programação II Herança

Herança. Herança. Herança. Herança. Herança. Programação Orientada a Objetos

Programação Orienta a Objetos

LISTA DUPLAMENTE ENCADEADA

Programação por Objectos. Java

Palavras Reservadas da Linguagem Java

Herança Sendo uma linguagem orientada a objetos Java oferece mecanismos para definir classes derivadas a partir de classes existentes; As classes deri

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Classes e Objetos em Java. Algoritmos e Programação I. Classes. Classes. Modificadores de Acesso. Classes. Revisão

Classes e Objetos. Sintaxe de classe em Java

Vejamos o seguinte exemplo public class Exemplo private int testada = 20; public void testapalavra(int testada) JOptionPane.showMessageDialog(null,"Pa

Linguagem de Programação IV Introdução

Linguagens de Programação

Classes e Objetos. Prof. Fernando V. Paulovich 9 de agosto de 2010

Programação Orientada a Objetos SANTOS, Rafael (PLT)

Encapsulamento e Métodos (Construtores e Estáticos) João Paulo Q. dos Santos

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

PROGRAMAÇÃO ORIENTADA A OBJETOS JAVA

Quando um programa viola as restrições semânticas da linguagem, a JVM assinala um erro ao programa, sob a forma de exceção.

Programação Orientada a Objetos II

Visibilidade e Encapsulamento

POO29004 Programação Orientada a Objetos

Programação Orientada a Objectos - P. Prata, P. Fazendeiro. Hierarquia de classes e mecanismo de ligação

Unidade: Classes Abstratas, Polimorfismo, Sobreposição e Interfaces

Universidade da Beira Interior Cursos: Engenharia Informática, Matemática /Informática e Ensino da Informática

Programação Java (nível intermediário) 4. Polimorfismo

POO29004 Programação Orientada a Objetos

nome = n; cargo = c; salario = s; public void print() { System.out.println(nome cargo salario); public void aumento( double fator){

Programação Java. Marco Fagundes. - Herança, Classes Abstratas e Interfaces Marco Fagundes -

Classes e Objetos INTRODUÇÃO À ORIENTAÇÃO A OBJETOS COM JAVA - MÓDULO II. Classes. Objetos. Um modelo para a criação de objetos

Programação Orientada a Objetos

Linguagem de Programação II Importando Classes/Pacotes

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

CLASSES, OBJETOS, MÉTODOS E STRING

Aula 10 POO 1 Classes Abstratas. Profa. Elaine Faria UFU

Java para Desktop. Programação Orientada à Objetos 2 JSE

Roteiro. Introdução. Uma Introdução à Programação Orientada a Objetos e JAVA usando NetBeans. Objetos. Princípios da Orientação a Objetos

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Linguagem de Programação Orientada a Objeto Polimorfismo, Classes Abstractas e Interfaces

Linguagem de Programação II Implementação

Java Como Programar, 8/E

Herança. Fátima L. S. Nunes Luciano A. Digiampietri Norton T. Roman SISTEMAS DE INFORMAÇÃO 1

Introdução à Programação. Encapsulamento e Herança

Linguagem de Programação Orientada a Objeto Construtores e Sobrecarga

Herança e Polimorfismo

Programação Orientada a Objetos

Orientação a Objetos - Herança

Herança. Universidade Católica de Pernambuco Ciência da Computação. Prof. Márcio Bueno.

Herança; Sobrescrita, Sobrecarga e Polimorfismo; Classes abstratas e concretas (finais).

Computação II Orientação a Objetos

Conceitos de Programação Orientada a Objetos

Python Orientação a Objetos. Introdução à Programação SI2

Linguagem de Programação II Implementação

Fundamentos Básicos da linguagem Java (Programação Orientada a Objetos) Prof. Responsáveis Wagner Santos C. de Jesus

Análise de Programação

Aula 5 POO 1 Encapsulamento. Profa. Elaine Faria UFU

Paradigmas de Linguagens de Programação. Suporte para Programação Orientada a Objeto

INF1636 PROGRAMAÇÃO ORIENTADA A OBJETOS

Introdução a classes e objetos. Prof. Marcelo Roberto Zorzan Prof a. Rachel Reis

Programação Orientada a Objetos

Programação Orientada a Objetos 2 Flávio de Oliveira Silva, M.Sc.

Programação com Objectos. Processamento de Dados I. 2. Classes, Atributos e Métodos

PROGRAMAÇÃO ORIENTADA A

Transcrição:

COLÉGIO ESTADUAL ULYSSES GUIMARÃES CURSO TÉCNICO PROFISSIONALIZANTE EM INFORMÁTICA ERINALDO SANCHES NASCIMENTO PROGRAMAÇÃO ORIENTADA A OBJETOS: HERANÇA FOZ DO IGUAÇU 2013

SUMÁRIO 4 HERANÇA... 3 4.1 SUPERCLASSES E SUBCLASSES... 3 4.1.1 Herança Básica... 4 4.2 O MODIFICADOR PROTECTED... 5 4.2.1 Relacionamento entre Superclasse e Subclasse... 6 4.3 CONSTRUTORES EM SUBCLASSES... 10 4.3.1 Usar super para Chamar Construtores de Superclasse... 10 4.4 EXERCÍCIOS... 12 4.5 REFERÊNCIA BIBLIOGRÁFICA... 15

4 HERANÇA A programação orientada a objetos (POO) é uma filosofia de programação popular e poderosa. Uma das principais técnicas da POO é conhecida como herança. Herança significa que uma forma muito geral de uma classe pode ser definida e compilada. Mais tarde, as versões mais especializadas da classe podem ser definidas ao começar com a classe já definida e adicionando as variáveis de instância e métodos mais especializados. As classes especializadas herdam os métodos e variáveis de instância da classe geral previamente definida. Com a herança é possível economizar tempo durante o desenvolvimento do programa, também aumenta a probabilidade de um sistema ser aplicado e mantido de forma eficaz. 4.1 SUPERCLASSES E SUBCLASSES Muitas vezes, um objeto de uma classe é um objeto de outra classe também. Superclasses tendem a ser mais geral e subclasses. A Tabela 1 enumera vários exemplos simples de superclasses e subclasses. Superclasse Subclasse Estudante Estudante de pós-graduação, estudante de graduação Forma Círculo, triângulo, retângulo, esfera, cubo Financiamento Financiamento de carro, financiamento de casa, hipoteca Empregado Professor, funcionário Conta bancária Conta corrente, conta poupança Tabela 1 Exemplos de herança. Cada objeto da subclasse é um objeto da superclasse, e uma superclasse pode ter muitas subclasses. Por exemplo, a superclasse veículo representa todos os veículos, incluindo carros, caminhões, barcos, bicicletas e assim por diante.

4.1.1 Herança Básica Para herdar uma classe, o programador incorpora a definição de uma classe para outra usando a palavra-chave extends. O programa a seguir cria uma superclasse chamadas A e uma subclasse chamada B. O Quadro 1 cria uma superclasse. O quadro 2 cria uma subclasse a partir da classe A existente. O quadro 3 é uma aplicação básica de herança. Quadro 1 Superclasse ClasseA 1 package heranca; 2 public class ClasseA { 3 int i, j; 4 void mostaij(){ 5 System.out.println("i e j: "+i+" "+j); 6 } 7 } Quadro 2 Subclasse ClasseB 1 package heranca; 2 public class ClasseB extends ClasseA { 3 int k; 4 5 void mostrak(){ 6 System.out.println("k: "+k); 7 } 8 9 void soma(){ 10 System.out.println("i+j+k: "+(i+j+k)); 11 } 12 }

Quadro 3 Aplicação básica de herança 1 package heranca; 2 public class HerancaSimples { 3 public static void main(string[] args) { 4 ClasseA objsuper = new ClasseA(); 5 ClasseB objsub = new ClasseB(); 6 7 objsuper.i = 10; 8 objsuper.j = 20; 9 System.out.println("Conteúdo do super objeto: "); 10 objsuper.mostaij(); 11 System.out.println(); 12 objsub.i = 7; 13 objsub.j = 8; 14 objsub.k = 9; 15 System.out.println("Conteúdo do sub objeto: "); 16 objsub.mostaij(); 17 objsub.mostrak(); 18 System.out.println(); 19 System.out.println("A soma de i, j e k no sub objeto: "); 20 objsub.soma(); 21 } 22 } 4.2 O MODIFICADOR PROTECTED Os modificadores de visibilidade são usados para controlar o acesso aos membros de uma classe. A visibilidade desempenha um papel importante no processo da hereditariedade também. Qualquer método ou variável pública em uma classe pai pode ser explicitamente referenciada pelo nome da classe filho, e através de objetos dessa classe filho. Por outro lado, métodos e variáveis privadas da classe

pai não podem ser referenciadas na classe filho ou através de um objeto da classe filho. Esta situação provoca um dilema. Portanto, Java fornece o modificador visibilidade: protected. Quando uma variável ou método é declarado com visibilidade protegida, uma classe derivada pode referenciá-lo. A visibilidade protected permite que a classe mantenha algumas propriedades de encapsulamento. Uma variável ou método declarado com visibilidade protected pode ser acessado por qualquer classe no mesmo pacote. Em um diagrama UML, a visibilidade protected é indicada precedendo o membro protegido com uma marca de hash (#). 4.2.1 Relacionamento entre Superclasse e Subclasse Usando uma hierarquia de herança, contendo os tipos de empregados em uma aplicação de folha de pagamento de uma empresa, os funcionários comissionados (serão representados como objetos de uma superclasse) são pagos com uma porcentagem de suas vendas, enquanto os funcionários assalariados comissionados (serão representados como objetos de uma subclasse) recebem o salário base acrescido de um percentual de suas vendas. O quadro 4 cria uma classe chamada FuncionarioComissionado, onde as variáveis de instância da são declarados como protected, permitindo que a subclasse FuncionarioAssalariadoComissionado, criada no quadro 5, acesse os dados diretamente. Quadro 4 Classe FuncionarioComissionado representa um funcionário que é pago com uma porcentagem das vendas 1 package heranca; 2 public class FuncionarioComissionado { 3 protected String nome; 4 protected String sobrenome; 5 protected int cpf; 6 protected double vendabruta;

7 protected double percentualcomissao; 8 9 public String getnome() { 10 return nome; 11 } 12 public void setnome(string nome) { 13 this.nome = nome; 14 } 15 public String getsobrenome() { 16 return sobrenome; 17 } 18 public void setsobrenome(string sobrenome) { 19 this.sobrenome = sobrenome; 20 } 21 public int getcpf() { 22 return cpf; 23 } 24 public void setcpf(int cpf) { 25 this.cpf = cpf; 26 } 27 public double getvendabruta() { 28 return vendabruta; 29 } 30 public void setvendabruta(double vendabruta) { 31 if (vendabruta >= 0.0) 32 this.vendabruta = vendabruta; 33 else 34 throw new IllegalArgumentException( 35 "A venda bruta deve ser maior ou igual a 0.0"); 36 } 37 public double getpercentualcomissao() { 38 return percentualcomissao; 39 }

40 public void setpercentualcomissao(double percentualcomissao) { 41 if (percentualcomissao > 0.0 && percentualcomissao < 1.0) 42 this.percentualcomissao = percentualcomissao; 43 else 44 throw new IllegalArgumentException( 45 "O percentual de comissão deve ser maior que 0.0 e menor que 1.0"); 46 } 47 public double calcularganhos(){ 48 return percentualcomissao * vendabruta; 49 } 50 @Override // indica que este método substitui um método superclasse 51 public String tostring(){ 52 return String.format("%s: %s %s\n%s: %s\n%s: %.2f\n%s: %2.f", 53 "Funcionário Comissionado", nome, sobrenome, 54 "CPF", cpf, "Total de vendas", vendabruta, 55 "Percentual de comissão", percentualcomissao); 56 } 57 } Sempre que uma subclasse precisar fazer referência a sua superclasse imediata, pode fazê-la através do uso de uma palavra-chave super. Quadro 5 A classe FuncionarioAssalariadoComissionado herda as variáveis de instância protegida da classe FuncionarioComissionado 1 package heranca; 2 public class FuncionarioAssalariadoComissionado extends FuncionarioComissionado{ 3 private double salariobase; 4 //construtor 5 public FuncionarioAssalariadoComissionado(String nome, 6 String sobrenome, int cpf, double vendas, 7 double percentual, double salario){ 8 super(nome, sobrenome, cpf, vendas, percentual);

9 setsalariobase(salario); 10 } 11 public void setsalariobase(double salario){ 12 if (salario >= 0.0) 13 salariobase = salario; 14 else 15 throw new IllegalArgumentException( 16 "O salário base deve ser maior ou igual a 0.0"); 17 } 18 public double getsalariobase(){ 19 return salariobase; 20 } 21 //calcula ganhos 22 @Override //indica que este método substitui um método superclasse 23 public double calcularganhos(){ 24 return salariobase+(percentualcomissao * vendabruta); 25 } 26 @Override 27 public String tostring(){ 28 return String.format( 29 "%s: %s %s\n%s: %s\n%s: %.2f\n%s: %.2f\n%s: %.2f", 30 "Funcionário assalariado com comissão", nome, sobrenome, 31 "CPF", cpf, "Total de vendas", vendabruta, "Percentual Comissão", 32 percentualcomissao, "Salário base", salariobase); 33 } 34 }

4.3 CONSTRUTORES EM SUBCLASSES Instanciar um objeto de subclasse inicia uma cadeia de chamadas de construtor no qual o construtor da subclasse, antes de realizar suas próprias tarefas, invoca seu construtor direto da superclasse explícita através da referência super ou chama implicitamente o construtor default da superclasse ou construtor sem argumento. Da mesma forma, se a superclasse for derivada de outra classe, como são, evidentemente, todas as classes exceto Object o construtor da superclasse invoca o construtor da classe seguinte na hierarquia, e assim por diante. O último construtor chamado na cadeia é sempre o construtor para a classe de Object. 4.3.1 Usar super para Chamar Construtores de Superclasse O quadro 6 apresenta a classe Caixa e seus diversos construtores. Quadro 6 Implementação da classe Caixa 1 package heranca; 2 public class Caixa { 3 private double largura; 4 private double altura; 5 private double profundidade; 6 //construtor clone de um objeto 7 Caixa(Caixa ob){//passa o objeto ao construtor 8 largura = ob.largura; 9 altura = ob.altura; 10 profundidade = ob.profundidade; 11 } 12 //construtor usado quando todas as dimensões são especificadas 13 Caixa(double l, double a, double p){ 14 largura = l;

15 altura = a; 16 profundidade = p; 17 } 18 //construtor usado quando não há especificação de dimensões 19 /* 20 * usa -1 para indicar uma caixa inutilizada 21 */ 22 Caixa(){ 23 largura = -1; 24 altura = -1; 25 profundidade = -1; 26 } 27 //construtor usado quando um cubo é criado 28 Caixa(double comp){ 29 largura = altura = profundidade = comp; 30 } 31 double volume(){ 32 return largura*altura*profundidade; 33 } 34 } A classe PesoCaixa mostra como super é usado. No quadro 7, PesoCaixa() chama super com os argumentos l, a, e d. Isso faz com que o construtor Caixa () seja chamado, inicializando largura, altura e profundidade com esses valores. Quadro 7 Implementação da classe PesoCaixa 1 package heranca; 2 public class PesoCaixa extends Caixa{ 3 double peso; 4 //construtor clone de um objeto 5 PesoCaixa(PesoCaixa ob){ 6 super(ob); 7 peso = ob.peso;

8 } 9 //construtor quando todos os parâmetros são especificados 10 PesoCaixa(double l, double a, double d, double p){ 11 super (l, a, d); 12 peso = p; 13 } 14 //construtor padrão 15 PesoCaixa(){ 16 super(); 17 peso = -1; 18 } 19 //construtor usado quando um cubo é criado 20 PesoCaixa(double comp, double p){ 21 super(comp); 22 peso = p; 23 } 24 } Uma vez que os construtores podem ser sobrecarregados, super pode ser chamado usando qualquer forma definida pela superclasse. O construtor executado será aquele que coincide com os argumentos. A implementação PesoCaixa fornece construtores para as várias maneiras que uma caixa pode ser construída. Em cada caso, super é chamado utilizando os argumentos apropriados. 4.4 EXERCÍCIOS 1. Suponha que você está projetando um programa de manutenção de registros que tem registros de empregados assalariados e empregados horistas. Há uma hierarquia natural para agrupar essas classes. Trata-se de todas as classes de pessoas que compartilham a propriedade de ser empregados. Os funcionários que recebem salário por hora são um subconjunto de funcionários. O outro subgrupo é composto por assalariados que recebem um

salário fixo por mês. Embora o programa não precise de nenhum tipo correspondente ao conjunto de todos os funcionários, pensar em termos do conceito mais geral de funcionários pode ser útil. Por exemplo, todos os funcionários têm um nome e uma data de admissão, e os métodos para criar e alterar nomes e datas de contratação será o mesmo para funcionários assalariados e de hora em hora. As classes para os funcionários horistas e assalariados podem ser subdivididos conforme diagramado na figura 1. Figura 1 Hierarquia de classes. No Java, defina uma classe chamada Funcionario que inclui todos os empregados (assalariados ou por hora) e, em seguida, use essa classe para definir as classes de funcionários horistas e assalariados. Classe Funcionário: Todos os objetos têm um nome e data de admissão. Uma string de nome "Sem nome" indica que não há ainda nome especificado. Uma data de admissão 1 de janeiro de 1000 indica nenhuma data de contratação real ainda especificada. É necessário criar uma classe Data. Pré-requisito do construtor Funcionário com parâmetro: Nenhum nome ou data de admissão ser nulo.

Classe para funcionários horistas: A classe Funcionario é a classe base (superclasse) e Horista é a classe derivada (subclasse). Todos os objetos têm um nome, data de admissão, taxa de salário não negativa, e número de horas trabalhadas não negativa. Uma string de nome "Sem nome" indica que não há nome verdadeiro ainda especificado. A data de admissão de 01 de janeiro de 1000 indica que não há data de contratação real ainda especificada. Pré-requisito: Nenhum nome ou data de admissão ser nulo; taxa salarial e horas não podem ser negativas. A multiplicação das horas trabalhadas pela taxa salarial retorna o pagamento do mês. O método parastring é substituído por isso é diferente na classe derivada Horista do que na classe base Funcionário. Classe Assalariado: Todos os objetos têm nome, data de admissão, e salário não negativo. Uma cadeia de nome "Sem nome" indica que não há nome verdadeiro ainda especificado. A data de admissão 1 de janeiro de 1000 indica sem data de contratação real ainda especificada. Pré-requisito: nenhum nome ou data de admissão podem ser nulos; e salário não pode ser negativo. Pagamento retorna a divisão de salário por 12. 2. Crie um aplicativo que utilize a classe horista. Cadastre um funcionário, sua data de admissão, valor da hora trabalhada e quantidade de horas trabalhadas. Mostre o valor do pagamento desse funcionário. 3. Suponha que uma classe chamada DescontoVenda é uma classe derivada de uma classe chamada Venda. A classe Venda tem as variáveis de instância preço e número de itens. Será que um objeto da classe DescontoVenda também tem as variáveis de instância preço e número de itens? 4. Suponha que a classe DescontoVenda é uma classe derivada de uma classe chamada Venda, e a classe Venda tem os métodos públicos gettotal e getimposto. Será que um objeto da classe DescontoVenda terá esses mesmos

métodos? Se for assim, estes métodos têm de executar as mesmas ações exatas na classe DescontoVenda como na classe Venda? 5. Crie uma aplicação que instancie um objeto para um funcionário horista e para um funcionário assalariado. Atribua valores aos dois funcionários e mostre o salário a ser pago para eles. 6. Defina a classe EmpregadoIntitulado que é uma classe derivada da classe base Assalariado. A classe EmpregadoIntitulado tem uma variável de instância adicional do tipo String chamada título. Ela também tem dois métodos adicionais: gettitulo, que não tem argumentos e retorna um String, e settitulo, que é um método vazio que recebe um argumento do tipo String. Também substitui (redefine) a definição do método para getnome, de modo que a string retornada inclui o título, bem como o nome do funcionário. 7. A partir do diagrama de classes UML da figura 2 desenvolva o programa Palavras. Figura 2 Diagrama de classes UML. 4.5 REFERÊNCIA BIBLIOGRÁFICA DEITEL, Paul; DEITEL, Harvey. Java for programmers. 2nd ed. Boston: Pearson Education, 2012. SAVITCH, Walter. Absolute Java, 5th Ed. Boston: Pearson, 2013. SCHILDT, Herbert. Java: The Complete Reference. 7th ed. US: McGraw-Hill, 2007.