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

Documentos relacionados
package heranca3; // classes podem receber os modificadores: nada ou public; abstract; e final class Pessoa implements InterPessoa{ String nome;

package heranca; class Mamifero { public int a; protected int b; int c; private int d;

package especificadores1; public class Alpha { public static void alphapublic(){ System.out.println("Alpha public!"); }

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

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

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

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

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

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

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

Herança e Propriedades

Classe Abstrata e Interface

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

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

Programação por Objectos. Java

Computação II Orientação a Objetos

Classes e Objetos. Sintaxe de classe em Java

Professor Leonardo Cabral da Rocha Soares Lattes:

9 Classes Abstractas e Interfaces

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

Interfaces. Professoras: Ariane Machado Lima Fátima L. S. Nunes SISTEMAS DE INFORMAÇÃO 1

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

POO29004 Programação Orientada a Objetos

Linguagem de Programação II Herança

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

Desenvolvimento Web TCC Turma A-1

Atributos e Métodos Estáticos

UNIVERSIDADE FEDERAL DE MATO GROSSO DO SUL SISTEMAS DE INFORMAÇÃO - CÂMPUS DE COXIM FUNDAMENTOS EM ORIENTAÇÃO 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

POO29004 Programação Orientada a Objetos

Lição 11 Herança, polimorfismo e interfaces

Programação Orientada a Objetos Classes Abstratas. Sérgio Soares

Computação II - Java - Prova 1 Prof. Adriano Joaquim de Oliveira Cruz /05/13. Questão: Total Pontos: Gráu:

Programação Orientada a Objetos II Java Décima primeira aula

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

Linguagem de Programação. Diagrama de classes

4 Conceito de Herança


Java First-Tier: Aplicações. Sobrecarga. Orientação a Objetos em Java (II) Sobrecarga de Construtores: Exemplo de Declaração

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

Introdução à orientação a objetos. João Tito Almeida Vianna 18/05/2013

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

Universidade Federal de Uberlândia

Linguagem de Programação II Implementação

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

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

Linguagem de Programação II Programação Orientada a Objetos. Orientação a Objetos

Conceitos de Programação Orientada a Objetos

Avançando em Java com Polimorfismo. Prof.: Hugo Barros

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

Prof. A. G. Silva. 30 de outubro de Prof. A. G. Silva INE5603 Introdução à POO 30 de outubro de / 1

Universidade Federal de Uberlândia

Herança e Polimorfismo

Extensão de classes em Java - noções elementares - PCO / PPO Departamento de Informática Faculdade de Ciências da Universidade de Lisboa

Especificam quem tem acesso a cada entidade, isto é, quem tem acesso a. cada classe e cada membro da classe (dados e métodos)

Programação Orientada a Objetos

Modelo do Mundo Real. Abstração. Interpretação

Herança e Classes Abstratas. João Paulo Q. dos Santos

Rafael B. Pereira (

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

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

POO29004 Programação Orientada a Objetos

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

Relacionamentos entre objetos

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

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

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

PROGRAMAÇÃO ORIENTADA A OBJETOS JAVA

Laboratório de programação II

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

Interfaces POO. Prof. Marcio Delamaro

Sobrecarga, Sobreposição e Polimorfismo

Programação Orientada a Objetos em Java

Programação Orientada a Objetos. Métodos e Atributos. Métodos. Métodos. Alexandre César Muniz de Oliveira. Parte III

Padrões de Projeto. Padrões de Projeto. Além dos 23 Padrões GoF. Os 23 Padrões de Projeto. Documentação de um Padrão. Classificação dos Padrões

Palavras Reservadas da Linguagem Java

Programação por Objectos. Java

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

Polimorfismo. O que é polimorfismo?

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

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

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

Orientação a Objetos - Herança

Construtores e Especificadores de Acesso

Linguagem de Programação IV Introdução

extendsé usado para indicar herança em JAVA

INF1636 PROGRAMAÇÃO ORIENTADA A OBJETOS

POO UML e Outros Conceitos. Prof. Vicente Paulo de Camargo

Introdução ao Java. Prof. Herbert Rausch Fernandes

Paradigmas de Programação. Java First-Tier: Aplicações. Orientação a Objetos em Java (I) Nomenclatura. Paradigma OO. Nomenclatura

Aula 9 POO 1 Polimorfismo. Profa. Elaine Faria UFU

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

CIÊNCIA DA COMPUTAÇÃO - LINGUAGEM DE PROGRAMAÇÃO II REVISÃO POO

Computação II Orientação a Objetos

Programação Orientada a Objetos

Transcrição:

Herança Fátima L. S. Nunes Luciano A. Digiampietri Norton T. Roman 1 1 1

Motivação Você está desenvolvendo um sistema de gerenciamento de pessoal para a USP Precisa fazer: Cadastro de alunos e professores Há professores doutores e não doutores 2 2 2

class Aluno { private long _nrusp; private String _rg; private long _cpf; private String _nome; private char _sexo; private int _anodeingresso; private String _curso; // métodos de acesso (public) public void imprimedados(){ System.out.println( Nome: + _nome); System.out.println( Nr USP: + _nrusp); System.out.println( CPF: + _cpf); System.out.println( RG: + _rg); System.out.println( Sexo: + _sexo); System.out.println( Ano de ingresso: + _anodeingresso); System.out.println( Curso: + _curso); 3 3 3

class Professor { private long _nrusp; private String _rg; private long _cpf; private String _nome; private char _sexo; private int _anodeadmissao; private String _departamento; // métodos de acesso (public) public void imprimedados(){ System.out.println( Nome: + _nome); System.out.println( Nr USP: + _nrusp); System.out.println( CPF: + _cpf); System.out.println( RG: + _rg); System.out.println( Sexo: + _sexo); System.out.println( Ano de admissão: + _anodeadmissao); System.out.println( Departamento: + _departamento); 4 4 4

class ProfessorDoutor { private long _nrusp; private String _rg; private long _cpf; private String _nome; private char _sexo; private int _anodeadmissao; private String _departamento; private int _anoobtencaodoutorado; private String _instituicaodoutorado; // métodos de acesso (public) public void imprimedados(){ System.out.println( Nome: + _nome); System.out.println( Nr USP: + _nrusp); System.out.println( CPF: + _cpf); System.out.println( RG: + _rg); System.out.println( Sexo: + _sexo); System.out.println( Ano de admissão: + _anodeadmissao); System.out.println( Departamento: + _departamento); System.out.println( Ano de obtenção do título de Doutor: + _anoobtencaodoutorado); System.out.println( Instituição do Doutorado: + _instituicaodoutorado); 5 5 5

O que você vê de estranho aqui? Algo o incomoda? 6 6 6

O que você vê de estranho aqui? Algo o incomoda? São três classe com quase todo o código repetido!!! 7 7 7

class Aluno { private long _nrusp; private String _rg; private long _cpf; private String _nome; private char _sexo; private int _anodeingresso; private String _curso; // métodos de acesso (public) public void imprimedados(){ System.out.println( Nome: + _nome); System.out.println( Nr USP: + _nrusp); System.out.println( CPF: + _cpf); System.out.println( RG: + _rg); System.out.println( Sexo: + _sexo); System.out.println( Ano de ingresso: + _anodeingresso); System.out.println( Curso: + _curso); 8 8 8

class Professor { private long _nrusp; private String _rg; private long _cpf; private String _nome; private char _sexo; private int _anodeadmissao; private String _departamento; // métodos de acesso (public) public void imprimedados(){ System.out.println( Nome: + _nome); System.out.println( Nr USP: + _nrusp); System.out.println( CPF: + _cpf); System.out.println( RG: + _rg); System.out.println( Sexo: + _sexo); System.out.println( Ano de admissão: + _anodeadmissao); System.out.println( Departamento: + _departamento); 9 9 9

class ProfessorDoutor { private long _nrusp; private String _rg; private long _cpf; private String _nome; private char _sexo; private int _anodeadmissao; private String _departamento; private int _anoobtencaodoutorado; private String _instituicaodoutorado; // métodos de acesso (public) public void imprimedados(){ System.out.println( Nome: + _nome); System.out.println( Nr USP: + _nrusp); System.out.println( CPF: + _cpf); System.out.println( RG: + _rg); System.out.println( Sexo: + _sexo); System.out.println( Ano de admissão: + _anodeadmissao); System.out.println( Departamento: + _departamento); System.out.println( Ano de obtenção do título de Doutor: + _anoobtencaodoutorado); System.out.println( Instituição do Doutorado: + _instituicaodoutorado); 10 10 10

class Professor { private long _nrusp; private String _rg; private long _cpf; private String _nome; private char _sexo; private int _anodeadmissao; private String _departamento; // métodos de acesso (public) public void imprimedados(){ System.out.println( Nome: + _nome); System.out.println( Nr USP: + _nrusp); System.out.println( CPF: + _cpf); System.out.println( RG: + _rg); System.out.println( Sexo: + _sexo); System.out.println( Ano de admissão: + _anodeadmissao); System.out.println( Departamento: + _departamento); 11 11 11

class ProfessorDoutor { private long _nrusp; private String _rg; private long _cpf; private String _nome; private char _sexo; private int _anodeadmissao; private String _departamento; private int _anoobtencaodoutorado; private String _instituicaodoutorado; // métodos de acesso (public) public void imprimedados(){ System.out.println( Nome: + _nome); System.out.println( Nr USP: + _nrusp); System.out.println( CPF: + _cpf); System.out.println( RG: + _rg); System.out.println( Sexo: + _sexo); System.out.println( Ano de admissão: + _anodeadmissao); System.out.println( Departamento: + _departamento); System.out.println( Ano de obtenção do título de Doutor: + _anoobtencaodoutorado); System.out.println( Instituição do Doutorado: + _instituicaodoutorado); 12 12 12

O que você vê de estranho aqui? Algo o incomoda? São três classe com quase todo o código repetido!!! Repetição do trabalho: desperdício de tempo de desenvolvimento desperdício de tempo de validação do código (teste das mesmas coisas...) Mudanças em uma parte comum a elas devem ser feitas (e testadas novamente) nas três classes! Há uma solução? 13 13 13

O que você vê de estranho aqui? Algo o incomoda? São três classe com quase todo o código repetido!!! Repetição do trabalho desperdício de tempo de desenvolvimento desperdício de tempo de validação do código (teste das mesmas coisas...) Mudanças em uma parte comum a elas devem ser feitas (e testadas novamente) nas três classes! Há uma solução? REUSO DE SOFTWARE 14 14 14

Reuso e Herança Reuso é outro conceito importante, não só em Programação Orientado a Objetos como em bom desenvolvimento de software em geral Uma das formas de fazer REUSO em POO é através do mecanismo de herança Fatorar o que é comum, e implementar o que for diferente 15 15 15

Classes filhas HERDAM atributos e código da classe mãe! Herança Pessoa private long _nrusp; private String _rg; private long _cpf; private String _nome; private char _sexo; Aluno Professor private int _anodeadmissao; private String _departamento; private int _anodeingresso; private String _curso; ProfessorDoutor private int _anoobtencaodoutorado; private String _instituicaodoutorado; 16 16 16

Superclasse (de Aluno, Professor e ProfessorDoutor) Herança Pessoa private long _nrusp; private String _rg; private long _cpf; private String _nome; private char _sexo; Aluno Professor private int _anodeadmissao; private String _departamento; private int _anodeingresso; private String _curso; ProfessorDoutor private int _anoobtencaodoutorado; private String _instituicaodoutorado; 17 17 17

Superclasse (de Aluno, Professor e ProfessorDoutor) Herança Pessoa private long _nrusp; private String _rg; private long _cpf; private String _nome; private char _sexo; Aluno Professor private int _anodeadmissao; private String _departamento; private int _anodeingresso; private String _curso; Subclasse (de Pessoa) ProfessorDoutor private int _anoobtencaodoutorado; private String _instituicaodoutorado; 18 18 18

Superclasse (de Aluno, Professor e ProfessorDoutor) Herança Pessoa private long _nrusp; private String _rg; private long _cpf; private String _nome; private char _sexo; Aluno private int _anodeingresso; private String _curso; Subclasse (de Pessoa) Subclasse (de Pessoa) e Superclasse de ProfessorDoutor Professor ProfessorDoutor private int _anodeadmissao; private String _departamento; private int _anoobtencaodoutorado; private String _instituicaodoutorado; 19 19 19

Superclasse (de Aluno, Professor e ProfessorDoutor) Herança Pessoa private long _nrusp; private String _rg; private long _cpf; private String _nome; private char _sexo; Aluno private int _anodeingresso; private String _curso; Subclasse (de Pessoa) Subclasse (de Pessoa) e Superclasse de ProfessorDoutor Subclasse (de Pessoa e de Professor) Professor ProfessorDoutor 20 private int _anodeadmissao; private String _departamento; private int _anoobtencaodoutorado; private String _instituicaodoutorado; 20 20

Implementação de herança em Java 21 21 21

class Pessoa { private long _nrusp; private String _rg; private long _cpf; private String _nome; private char _sexo; // métodos de acesso (public) a esses 5 atributos public void imprimedados(){ System.out.println( Nome: + _nome); System.out.println( Nr USP: + _nrusp); System.out.println( CPF: + _cpf); System.out.println( RG: + _rg); System.out.println( Sexo: + _sexo); 22 22 22

class Aluno { VERSÃO ANTIGA private long _nrusp; private String _rg; private long _cpf; private String _nome; private char _sexo; private int _anodeingresso; private String _curso; // métodos de acesso (public) public void imprimedados(){ System.out.println( Nome: + _nome); System.out.println( Nr USP: + _nrusp); System.out.println( CPF: + _cpf); System.out.println( RG: + _rg); System.out.println( Sexo: + _sexo); System.out.println( Ano de ingresso: + _anodeingresso); System.out.println( Curso: + _curso); VERSÃO COM HERANÇA class Aluno extends Pessoa { private int _anodeingresso; private String _curso; // 2 pares de métodos de acesso (public) public void imprimedados(){? System.out.println( Ano de ingresso: + _anodeingresso); System.out.println( Curso: + _curso); 23 23 23

class Aluno { VERSÃO ANTIGA private long _nrusp; private String _rg; private long _cpf; private String _nome; private char _sexo; private int _anodeingresso; private String _curso; // 7 pares de métodos de acesso (public) public void imprimedados(){ System.out.println( Nome: + _nome); System.out.println( Nr USP: + _nrusp); System.out.println( CPF: + _cpf); System.out.println( RG: + _rg); System.out.println( Sexo: + _sexo); System.out.println( Ano de ingresso: + _anodeingresso); System.out.println( Curso: + _curso); VERSÃO COM HERANÇA class Aluno extends Pessoa { private int _anodeingresso; private String _curso; // 2 pares de métodos de acesso (public) public void imprimedados(){ super.imprimedados(); System.out.println( Ano de ingresso: + _anodeingresso); System.out.println( Curso: + _curso); REDEFINIÇÃO DE MÉTODOS Modifica ou estende um método da superclasse 24 24 24

VERSÃO ANTIGA VERSÃO COM HERANÇA class Professor { private long _nrusp; private String _rg; private long _cpf; private String _nome; private char _sexo; private int _anodeadmissao; private String _departamento; // 7 pares de métodos de acesso (public) public void imprimedados(){ System.out.println( Nome: + _nome); System.out.println( Nr USP: + _nrusp); System.out.println( CPF: + _cpf); System.out.println( RG: + _rg); System.out.println( Sexo: + _sexo); System.out.println( Ano de admissão: + _anodeadmissao); System.out.println( Departamento: + _departamento); 25 25 25

class Professor { VERSÃO ANTIGA private long _nrusp; private String _rg; private long _cpf; private String _nome; private char _sexo; private int _anodeadmissao; private String _departamento; // 7 pares de métodos de acesso (public) public void imprimedados(){ System.out.println( Nome: + _nome); System.out.println( Nr USP: + _nrusp); System.out.println( CPF: + _cpf); System.out.println( RG: + _rg); System.out.println( Sexo: + _sexo); System.out.println( Ano de admissão: + _anodeadmissao); System.out.println( Departamento: + _departamento); VERSÃO COM HERANÇA class Professor extends Pessoa { private int _anodeadmissao; private String _departamento; // 2 pares de métodos de acesso (public) public void imprimedados(){ super.imprimedados(); System.out.println( Ano de admissão: + _anodeadmissao); System.out.println( Departamento: + _departamento); 26 26 26

class ProfessorDoutor { private long _nrusp; private String _rg; private long _cpf; private String _nome; private char _sexo; private int _anodeadmissao; private String _departamento; private int _anoobtencaodoutorado; private String _instituicaodoutorado; // 9 pares de métodos de acesso (public) public void imprimedados(){ System.out.println( Nome: + _nome); System.out.println( Nr USP: + _nrusp); System.out.println( CPF: + _cpf); System.out.println( RG: + _rg); System.out.println( Sexo: + _sexo); System.out.println( Ano de admissão: + _anodeadmissao); System.out.println( Departamento: + _departamento); System.out.println( Ano de obtenção do título de Doutor: + _anoobtencaodoutorado); System.out.println( Instituição do Doutorado: + _instituicaodoutorado); VERSÃO ANTIGA VERSÃO COM HERANÇA 27 27 27

VERSÃO ANTIGA class ProfessorDoutor { private long _nrusp; private String _rg; private long _cpf; { private String _nome; private char _sexo; private int _anodeadmissao; private String _departamento; private int _anoobtencaodoutorado; private String _instituicaodoutorado; // 9 pares de métodos de acesso (public) public void imprimedados(){ System.out.println( Nome: + _nome); System.out.println( Nr USP: + _nrusp); System.out.println( CPF: + _cpf); System.out.println( RG: + _rg); System.out.println( Sexo: + _sexo); System.out.println( Ano de admissão: + _anodeadmissao); System.out.println( Departamento: + _departamento); System.out.println( Ano de obtenção do título de Doutor: + _anoobtencaodoutorado); System.out.println( Instituição do Doutorado: + _instituicaodoutorado); VERSÃO COM HERANÇA class ProfessorDoutor extends Professor private int _anoobtencaodoutorado; private String _instituicaodoutorado; // 2 pares de métodos de acesso (public) public void imprimedados(){ super.imprimedados(); System.out.println( Ano de obtenção d título de Doutor: + _anoobtencaodoutorado); System.out.println( Instituição do Doutorado: + _instituicaodoutorado); 28 28 28

Pessoa private long _nrusp; private String _rg; private long _cpf; private String _nome; private char _sexo; // 5 pares de mét. de acesso void imprimedados(); Aluno private int _anodeingresso; private String _curso; // 2 pares de mét. de acesso void imprimedados(); Professor private int _anodeadmissao; private String _departamento; // 2 pares de mét. de acesso void imprimedados(); ProfessorDoutor private int _anoobtencaodoutorado; private String _instituicaodoutorado; // 2 pares de mét. de acesso void imprimedados(); 29 29 29

public void imprimedados(){ System.out.println( Nome: + _nome); System.out.println( Nr USP: + _nrusp); System.out.println( CPF: + _cpf); System.out.println( RG: + _rg); System.out.println( Sexo: + _sexo); Aluno private int _anodeingresso; private String _curso; // 2 pares de mét. de acesso void imprimedados(); Pessoa private long _nrusp; private String _rg; private long _cpf; private String _nome; private char _sexo; // 5 pares de mét. de acesso void imprimedados(); Professor private int _anodeadmissao; private String _departamento; // 2 pares de mét. de acesso void imprimedados(); public void imprimedados(){ super.imprimedados(); System.out.println( Ano de admissão: + _anodeadmissao); System.out.println( Depa rtamento: + _departamento); public void imprimedados(){ super.imprimedados(); ProfessorDoutor System.out.println( Ano de obtenção do título de Doutor: private int _anoobtencaodoutorado; + _anoobtencaodoutorado); private String _instituicaodoutorado; System.out.println( Instituição // 2 pares de mét. de acesso do Doutorado: + void imprimedados(); _instituicaodoutorado); 30 30 30

Pessoa private long _nrusp; private String _rg; private long _cpf; private String _nome; private char _sexo; // 5 pares de mét. de acesso void imprimedados(); Aluno private int _anodeingresso; private String _curso; // 2 pares de mét. de acesso void imprimedados(); Professor private int _anodeadmissao; private String _departamento; // 2 pares de mét. de acesso void imprimedados(); ProfessorDoutor p1 = new ProfessorDoutor(); p1.imprimedados(); ProfessorDoutor private int _anoobtencaodoutorado; private String _instituicaodoutorado; // 2 pares de mét. de acesso void imprimedados(); 31 31 31

Pessoa private long _nrusp; private String _rg; private long _cpf; private String _nome; private char _sexo; // 5 pares de mét. de acesso void imprimedados(); Aluno private int _anodeingresso; private String _curso; // 2 pares de mét. de acesso void imprimedados(); Professor private int _anodeadmissao; private String _departamento; // 2 pares de mét. de acesso void imprimedados(); Professor p2 = new Professor(); p2.imprimedados(); ProfessorDoutor private int _anoobtencaodoutorado; private String _instituicaodoutorado; // 2 pares de mét. de acesso void imprimedados(); 32 32 32

Pessoa private long _nrusp; private String _rg; private long _cpf; private String _nome; private char _sexo; // 5 pares de mét. de acesso void imprimedados(); Aluno private int _anodeingresso; private String _curso; // 2 pares de mét. de acesso void imprimedados(); Professor private int _anodeadmissao; private String _departamento; // 2 pares de mét. de acesso void imprimedados(); Pessoa p3 = new Pessoa(); p3.imprimedados(); ProfessorDoutor private int _anoobtencaodoutorado; private String _instituicaodoutorado; // 2 pares de mét. de acesso void imprimedados(); 33 33 33

Pessoa private long _nrusp; private String _rg; private long _cpf; private String _nome; private char _sexo; // 5 pares de mét. de acesso void imprimedados(); Aluno private int _anodeingresso; private String _curso; // 2 pares de mét. de acesso void imprimedados(); Professor private int _anodeadmissao; private String _departamento; // 2 pares de mét. de acesso void imprimedados(); Aluno p4 = new Aluno(); p4.imprimedados(); ProfessorDoutor private int _anoobtencaodoutorado; private String _instituicaodoutorado; // 2 pares de mét. de acesso void imprimedados(); 34 34 34

Pessoa private long _nrusp; private String _rg; private long _cpf; private String _nome; private char _sexo; // 5 pares de mét. de acesso void imprimedados(); UML Unified Modeling Language Aluno private int _anodeingresso; private String _curso; // 2 pares de mét. de acesso void imprimedados(); Professor private int _anodeadmissao; private String _departamento; // 2 pares de mét. de acesso void imprimedados(); Aluno p4 = new Aluno(); p4.imprimedados(); ProfessorDoutor private int _anoobtencaodoutorado; private String _instituicaodoutorado; // 2 pares de mét. de acesso void imprimedados(); 35 35 35

Observações As subclasses podem acrescentar novos métodos: Ex: métodos de acesso aos atributos específicos da subclasse Ex: novas funcionalidades típicas daquela subclasse Ex: sobrecarregar métodos da superclasse (mesmo nome, nova assinatura) As subclasses podem redefinir métodos da superclasse com a mesma assinatura Ex: imprimedados Não precisa necessariamente chamar o método da superclasse 36 36 36

Exemplo class Pessoa{ void quemevoce() { System.out.println( Sou uma pessoa ); class Aluno extends Pessoa{ void quemevoce() { System.out.println( Sou um aluno ); class Professor extends Pessoa{ void quemevoce() { System.out.println( Sou um professor ); class ProfessorDoutor extends Professor{ void quemevoce() { System.out.println( Sou um professor doutor ); 37 37 37

Exemplo class Pessoa{ void quemevoce() { System.out.println( Sou uma pessoa ); class Aluno extends Pessoa{ void quemevoce() { System.out.println( Sou um aluno ); class Professor extends Pessoa{ void quemevoce() { System.out.println( Sou um professor ); class ProfessorDoutor extends Professor{ void quemevoce() { System.out.println( Sou um professor doutor ); Pessoa p1 = new Pessoa(); p1.quemevoce(); Aluno p2 = new Aluno(); p2.quemevoce(); Professor p3 = new Professor(); p3.quemevoce(); ProfessorDoutor p4 = new ProfessorDoutor(); p4.quemevoce(); 38 38 38

Exemplo class Pessoa{ void quemevoce() { System.out.println( Sou uma pessoa ); class Aluno extends Pessoa{ void quemevoce() { System.out.println( Sou um aluno ); class Professor extends Pessoa{ void quemevoce() { System.out.println( Sou um professor ); class ProfessorDoutor extends Professor{ void quemevoce() { System.out.println( Sou um professor doutor ); Pessoa p1 = new Pessoa(); p1.quemevoce(); // Sou uma pessoa Aluno p2 = new Aluno(); p2.quemevoce(); // Sou um aluno Professor p3 = new Professor(); p3.quemevoce(); // Sou um professor ProfessorDoutor p4 = new ProfessorDoutor(); p4.quemevoce(); // Sou um professor doutor 39 39 39

Observações A subclasse pode sobrecarregar/sobrepor métodos de mesmo nome com diferentes parâmetros Ex: Classe Pessoa tem o método void alteradadosuspianos(long nrusp); Classe Aluno tem o método void alteradadosuspianos(long nrusp, String curso); Os dois métodos podem ser usados no filho! 40 40 40

import java.lang.string; public class Pessoa { long nusp; String x; void altera(long nusp) { this.nusp = nusp; import java.lang.string; public class Aluno extends Pessoa{ void altera(long nusp, String x) { this.nusp = nusp; this.x = x; public static void main(string[] args) { Aluno a = new Aluno(); System.out.println(a.nusp); System.out.println(a.x); a.altera(12); System.out.println(a.nusp); System.out.println(a.x); a.altera(10,"ei"); System.out.println(a.nusp); System.out.println(a.x); 41 41 41

import java.lang.string; import java.lang.string; public class Pessoa { long nusp; String x; public class Aluno extends Pessoa{ void altera(long nusp, String x) { this.nusp = nusp; this.x = x; void altera(long nusp) { this.nusp = nusp; Saída 0 null 12 null 10 ei public static void main(string[] args) { Aluno a = new Aluno(); System.out.println(a.nusp); System.out.println(a.x); a.altera(12); System.out.println(a.nusp); System.out.println(a.x); a.altera(10,"ei"); System.out.println(a.nusp); System.out.println(a.x); 42 42 42

class Pessoa { Pessoa(long nrusp, String rg, long cpf, String nome, char sexo) { _nrusp = nrusp; _rg = rg; _cpf = cpf; _nome = nome; _sexo = sexo; class Aluno extends Pessoa{ Aluno(long nrusp, String rg, long cpf, String nome, char sexo, int anoingresso, String curso) {? _anodeingresso = anoingresso; _curso = curso; Construtores 43 43 43

class Pessoa { Pessoa(long nrusp, String rg, long cpf, String nome, char sexo) { _nrusp = nrusp; _rg = rg; _cpf = cpf; _nome = nome; _sexo = sexo; class Aluno extends Pessoa{ Aluno(long nrusp, String rg, long cpf, String nome, char sexo, int anoingresso, String curso) { super(nrusp, rg, cpf, nome, sexo); _anodeingresso = anoingresso; _curso = curso; Construtores Deve necessariamente ser o primeiro comando. 44 44 44

class Professor extends Pessoa{ Professor(long nrusp, String rg, long cpf, String nome, char sexo, int anoadmissao, String dpto) { super(nrusp, rg, cpf, nome, sexo); _anodeadmissao = anoadmissao; _departamento = dpto; Construtores class ProfessorDoutor extends Professor{ ProfessorDoutor(long nrusp, String rg, long cpf, String nome, char sexo, int anoadmissao, String dpto, int anodoutorado, String instituicaodoutorado) {? _anoobtencaodoutorado = anodoutorado; _instituicaodoutorado = instituicaodoutorado; 45 45 45

class Professor extends Pessoa{ Professor(long nrusp, String rg, long cpf, String nome, char sexo, int anoadmissao, String dpto) { super(nrusp, rg, cpf, nome, sexo); _anodeadmissao = anoadmissao; _departamento = dpto; Construtores class ProfessorDoutor extends Professor{ ProfessorDoutor(long nrusp, String rg, long cpf, String nome, char sexo, int anoadmissao, String dpto, int anodoutorado, String instituicaodoutorado) { super(nrusp, rg, cpf, nome, sexo, anoadmissao, dpto); _anoobtencaodoutorado = anodoutorado; _instituicaodoutorado = instituicaodoutorado; 46 46 46

Vantagens de Herança Modularização (programa separado em módulos estáveis) Reuso Como no caso de Pessoa APIs Java (você pode expandir!!!) Tipagem (relação transitiva) Aluno É uma Pessoa Professor É uma Pessoa ProfessorDoutor É um Professor, e também É uma Pessoa permite agrupamentos 47 47 47

class ComunidadeAcademica { Pessoa [] comunidade = new Pessoa [5000]; int nrpessoas = 0; void inserepessoa(pessoa p) { comunidade[nrpessoas] = p; nrpessoas++; Pessoa buscapessoa (int nrusp) { int i = 0; while (i < nrpessoas){ if (comunidade[i].obtemnrusp() == nrusp) return comunidade[i]; i++; System.out.println("Pessoa não encontrada"); return null; void imprimedados(){ for (int i=0; i<nrpessoas; i++) comunidade[i].imprimedados(); ComunidadeAcademica usp = new ComunidadeAcademica(); Aluno p1 = new Aluno(55,..., SI ); usp.inserepessoa(p1); Professor p2 = new Professor(51,..., EACH ); usp.inserepessoa(p2); ProfessorDoutor p3 = new ProfessorDoutor(67,..., USP ); usp.inserepessoa(p3); usp.buscapessoa(51).quemevoce(); usp.imprimedados(); 48 48 48

class ComunidadeAcademica { Pessoa [] comunidade = new Pessoa [5000]; int nrpessoas = 0; void inserepessoa(pessoa p) { comunidade[nrpessoas] = p; nrpessoas++; Pessoa buscapessoa (int nrusp) { int i = 0; while (i < nrpessoas){ if (comunidade[i].obtemnrusp() == nrusp) return comunidade[i]; i++; System.out.println("Pessoa não encontrada"); return null; void imprimedados(){ for (int i=0; i<nrpessoas; i++) comunidade[i].imprimedados(); ComunidadeAcademica usp = new ComunidadeAcademica(); Aluno p1 = new Aluno(55,..., SI ); usp.inserepessoa(p1); Professor p2 = new Professor(51,..., EACH ); usp.inserepessoa(p2); ProfessorDoutor p3 = new ProfessorDoutor(67,..., USP ); usp.inserepessoa(p3); usp.buscapessoa(51).quemevoce(); usp.imprimedados(); 49 49 49

Hierarquia de Classes 50 50 50

Hierarquia de Classes É um tipo de 51 51 51

Hierarquia Espécie É um tipo Filo de Reino 52 52 52

Hierarquia ERRADA Espécie É um tipo Filo de Não há a relação É um tipo de Reino 53 53 53

Especificadores de acesso final class X: 54 54 54

Especificadores de acesso final class X: X não pode ser estendida 55 55 55

Especificadores de acesso final class X: X não pode ser estendida final em um método: 56 56 56

Especificadores de acesso final class X: X não pode ser estendida final em um método: o método não pode ser redefinido nas subclasses 57 57 57

Especificadores de acesso final class X: X não pode ser estendida final em um método: o método não pode ser redefinidos nas subclasses class X: X pode ser vista só dentro do pacote public class X: X pode ser vista por todos 58 58 58

public class ExMatematica2 { public final static double pi = 3.141592; public final static double quadrado(double x){ return x*x; public static double cubo(double x){ return x*x*x; public final static double perimetro(double raio){ return 2*pi*raio; 59 59 59

public class ExMatematica2Sub extends ExMatematica2{ public final static double pi = 3.1415926;????? /* O metodo abaixo nao pode ser redefinido pois na classe original * (ExMatematica2) ele era final. */ /* public final static double quadrado(double x){ return x*x; */ /* O metodo cubo nao era final na super-classe (ExMatematica2) e, por isso, * pode ser redefinida. */ public static double cubo(double x){ double temp = x*x; return temp*x; 60 60 60

public class ExMatematica2Sub extends ExMatematica2{ public final static double pi = 3.1415926; /* O metodo abaixo nao pode ser redefinido pois na classe * original (ExMatematica2) ele era final. */ /* public final static double quadrado(double x){ return x*x; */ É constante apenas dessa classe /* O metodo cubo nao era final na super-classe (ExMatematica2) e, por isso, * pode ser redefinida. */ public static double cubo(double x){ double temp = x*x; return temp*x; 61 61 61

Especificadores de acesso Acesso public protected sem nada private Classe Sim Sim Sim Sim Pacote Sim Sim Sim Não Subclasse Sim Sim Não Não Mundo Sim Não Não Não 62 62 62

Especificadores de acesso Acesso public protected sem nada private protected indica que o código pode ser acessado somente dentro do pacote ou por uma subclasse de sua classe em outro pacote Classe Sim Sim Sim Sim Pacote Sim Sim Sim Não Subclasse Sim Sim Não Não Mundo Sim Não Não Não 63 63 63

Abstract abstract class X: X não pode ser instanciada Não podemos fazer new X(); abstract int metodo(): O método é deixado sem código na classe Cabe aos filhos implementar Todo método abstract torna a classe abstract Nem toda classe abstract possui métodos abstract Basta que não desejemos que seja instanciada 64 64 64

class Pessoa { String nome; int RG; Pessoa(String nome, int RG){ this.nome = nome; this.rg = RG; void respirar(){ System.out.println("Pessoa respirando."); void dormir(){ System.out.println("Pessoa dormindo."); 65 65 65

abstract class Aluno extends Pessoa { String nome; int RG; int numerousp; Aluno(String n, int rg, int nusp){ super(n,rg); numerousp = nusp; Método abstratos precisam ser implementado nas sub-classes não abstratas. Um método não pode ser abstrato e estático ao mesmo tempo void respirar(){ System.out.println("Aluno respirando."); final void fazertrabalhos(){ System.out.println("Trabalhando."); abstract void estudar(); 66 66 66

public class AlunoRegular extends Aluno{ AlunoRegular(String nome, int RG, int NUSP){ super(nome,rg,nusp); void estudarmuito(){ System.out.println("Estudando muito!"); PRECISA implementar todos os métodos abstratos da super-classe void estudar(){ System.out.println("Aluno Regular Estudando"); 67 67 67

public final class AlunoEspecial extends Aluno{ AlunoEspecial(String nome, int RG, int NUSP){ super(nome,rg,nusp); NAO é possível usar super.super.respirar (super.super não é permitido) void respirar(){ super.respirar(); System.out.println("Aluno especial respirando."); /* void fazertrabalhos(){... */ void estudar(){ System.out.println("Aluno Especial Estudando"); Este metodo não pode ser implementado aqui por ser final na super-clase (Aluno) PRECISA implementar todos os métodos abstratos da super-classe 68 68 68

Observações Aluno foi escolhida como abstrata pelo fato de, neste sistema, existirem apenas alunos especiais e regulares. Não DEVERIA ser possível criar um aluno genérico Por isso usamos abstract 69 69 69

Finalmente Classes podem implementar mais de uma interface Classes só podem estender uma única classe Não existe herança múltipla em java Construtores não podem ser final 70 70 70

Construtores e Herança public class teste { public class teste2 extends teste { public static void main(string[] args) { teste t = new teste2(); Quando criamos um objeto de uma classe que não tem construtor, o Java usará um construtor padrão (sem parâmetros). Esse construtor, por sua vez, chamará, automaticamente, o construtor padrão da classepai. E assim por diante 71 71 71

Construtores e Herança public class teste { teste(int x){ public class teste2 extends teste { public static void main(string[] args) { teste t = new teste2(); Quando criamos um construtor não padrão em uma classe, o construtor padrão deixa de existir. E qualquer subclasse que precise dele vai gerar erro de compilação 72 72 72

Construtores e Herança public class teste { teste(int x){ Infelizmente, toda subclasse que não chama nenhum construtor do pai, implicitamente chama o padrão. public class teste2 extends teste { teste2 (int a) { Nada disso irá funcionar... teste2 () { public static void main(string[] args) { teste t = new teste2(2); 73 73 73

Construtores e Herança public class teste { teste(int x){ A menos que, ou implementemos um teste() (nem que seja vazio) no pai, ou definamos o construtor do pai que deve ser chamado na classe filho public class teste2 extends teste { teste2 (int a) { super(a); teste2 () { super(0); public static void main(string[] args) { teste t = new teste2(2); 74 74 74

Herança Fátima L. S. Nunes Luciano A. Digiampietri Norton T. Roman 75 75 75