Luz, C Âmera, Ação! · Funcionário.java especifica a herança. toString desta classe delega a...

27
Âmera, Ação! Luz, C Orientação a Objeto em Java Herança e Composição.

Transcript of Luz, C Âmera, Ação! · Funcionário.java especifica a herança. toString desta classe delega a...

Page 1: Luz, C Âmera, Ação! · Funcionário.java especifica a herança. toString desta classe delega a toString da superclasse a impressão de seus dados. Sintaxe diferente para invocar

Âmera, Ação!Luz, C

Orientação a Objeto em JavaHerança e Composição.

Page 2: Luz, C Âmera, Ação! · Funcionário.java especifica a herança. toString desta classe delega a toString da superclasse a impressão de seus dados. Sintaxe diferente para invocar

Reuso de código Mecanismo de Reuso:

Diminui a necessidade de ré-escrever código: menos trabalho para o programador.

Permite o aproveitamento de código pré-existente (livre de erro e otimizado): menos chances de cometer erros

Em linguagens convencionais: biblioteca de funções e procedimentos

Page 3: Luz, C Âmera, Ação! · Funcionário.java especifica a herança. toString desta classe delega a toString da superclasse a impressão de seus dados. Sintaxe diferente para invocar

Reuso de código Reuso de classes em POO:

Para criar uma classe que se aproveita de características de uma outra classe:

Delegação (composição)

Uma instância da classe existente é usada como componente da nova classe.

Herança

A nova classe é uma extensão da classe existente.

Page 4: Luz, C Âmera, Ação! · Funcionário.java especifica a herança. toString desta classe delega a toString da superclasse a impressão de seus dados. Sintaxe diferente para invocar

Reuso de código Reuso de classes em POO:

Exemplo: Um aluno de um curso universitário é modelado pela classe RegistroAcadêmico.

Delegação (composição)A classe RegistroAcadêmico possui o campo dataDeNascimento, que delega à classe Data a função de armazenar e manipular adequadamente a data de nascimento do aluno.

Page 5: Luz, C Âmera, Ação! · Funcionário.java especifica a herança. toString desta classe delega a toString da superclasse a impressão de seus dados. Sintaxe diferente para invocar

class RegistroAcademicoDeGraduacao { private String nomeDoAluno; private Data dataDeNascimento; private int númeroDeMatrícula; RegistroAcademicoDeGraduacao(String n,Data d,int m) { nomeDoAluno = n; dataDeNascimento = d; númeroDeMatrícula = m; }

public String toString() { String resultado = ""; resultado += "Matrícula: “ + númeroDeMatrícula + " Nome: “ + nomeDoAluno+"\n"; resultado += "Data de Nascimento: “ + dataDeNascimento + "\n"; return resultado; } } // fim da classe RegistroAcademicoDeGraduacao

RegistroAcademicoDeGraduacao.java

delegação: campos que são instâncias de classes. São manipulados da mesma forma que tipos nativos

Chamada implícita do método tostring da classe Data. A classe RegistroAcademicoDeGraduacao delega à classe Data a formatação de seus dados.

Delegação ou Composição

Page 6: Luz, C Âmera, Ação! · Funcionário.java especifica a herança. toString desta classe delega a toString da superclasse a impressão de seus dados. Sintaxe diferente para invocar

Delegação ou Composiçãoclass DemoRegistroAcademicoDeGraduacao {

public static void main(String args[]) { Data nascimento = new Data((byte)10,(byte)4, short)1940); RegistroAcademicoDeGraduacao millôr = new RegistroAcademicoDeGraduacao("Millôr

Fernandes", nascimento, 34990917); System.out.println(millôr);}

} // fim da classe DemoRegistroAcademicoDeGraduacao

DemoRegistroAcademicoDeGraduacao.java

Page 7: Luz, C Âmera, Ação! · Funcionário.java especifica a herança. toString desta classe delega a toString da superclasse a impressão de seus dados. Sintaxe diferente para invocar

Reuso de código Reuso de classes em POO:

Exemplo: Um aluno de um curso universitário é modelado pela classe RegistroAcadêmico.

Herança

Alunos de pós graduação possuem os mesmos componentes e comportamento de alunos de graduação. Porém, possuem também os componentes tese e orientador, e operações adequadas para lidar com estas informações.

A classe RegistroAcadêmicoDePosGraduação estende RegistroAcadêmico com os campos tese e orientador e suas operações.

Page 8: Luz, C Âmera, Ação! · Funcionário.java especifica a herança. toString desta classe delega a toString da superclasse a impressão de seus dados. Sintaxe diferente para invocar

Herança Relacionamento hierárquico entre classes:

A subclasse herda da classe:todos os campos todos os métodos

A subclasse pode conter atributos e métodos adicionais

(sub)classe ou classe herdeira

mais especializada

(super)classe ou ancestral

Page 9: Luz, C Âmera, Ação! · Funcionário.java especifica a herança. toString desta classe delega a toString da superclasse a impressão de seus dados. Sintaxe diferente para invocar

Pessoa nome,identidade,nascimento Pessoa(n,i,nasc); qualIdentidade(); toString();

Funcionário admissão,salário Funcionário(n,i,nasc,adm,sal); qualSalário(); toString();

Herança

Page 10: Luz, C Âmera, Ação! · Funcionário.java especifica a herança. toString desta classe delega a toString da superclasse a impressão de seus dados. Sintaxe diferente para invocar

class Pessoa { private String nome; private int identidade; private DataCons nascimento; Pessoa(String n,int i,DataCons d) { nome = n; identidade = i; nascimento = d; }

public String toString() { return "Nome: "+nome+"\nIdentidade: "+identidade+" "+ "\nData de Nascimento: "+ nascimento; }

final public float qualIdentidade() { return identidade; }

} // fim da classe Pessoa

Pessoa.java

classes herdeiras não podem sobrepor este código.

Herança

Page 11: Luz, C Âmera, Ação! · Funcionário.java especifica a herança. toString desta classe delega a toString da superclasse a impressão de seus dados. Sintaxe diferente para invocar

class Funcionario extends Pessoa { private DataCons admissão; private float salário;Funcionario(String nome,int id,DataCons nasc, DataCons adm,float sal) { super(nome,id,nasc); admissão = adm; salário = sal; }public String toString() { return super.toString()+"\n"+ "Data de admissão: "+admissão+ "\n" + "Salário: "+salário; }

final public float qualSalário() { return salário; }

} // fim da classe FuncionarioFuncionário.java

especifica a herança.

toString desta classe delega a toString da superclasse a impressão de seus dados. Sintaxe diferente para invocar construtor ou método da superclasse.

nome e idade são privados em Pessoa: mesmo nas subclasses devem ser acessados através dos serviços oferecidos.

O construtor desta classe delega ao construtor da superclasse a tarefa de inicializar os dados herdados.

Herança

Page 12: Luz, C Âmera, Ação! · Funcionário.java especifica a herança. toString desta classe delega a toString da superclasse a impressão de seus dados. Sintaxe diferente para invocar

public class Empresa { public static void main(String[] args) { float s; int i; DataCons d1 = new DataCons((byte)12,(byte)12,(short)1967); Pessoa p = new Pessoa ("Denise", 3454637, d1); DataCons d2 = new DataCons((byte)1,(byte)12,(short)1972); DataCons d3 = new DataCons((byte)1,(byte)12,(short)2002); i = p.qualIdentidade(); Funcionario f1 = new Funcionario ("Alan", 93452128,d2,d3 ,(float)1000.00); s = f1.qualSalário(); i = f1.qualIdentidade(); System.out.println(f1);

}}

Empresa.javaFuncionário herda as operações de Pessoa

Herança

Page 13: Luz, C Âmera, Ação! · Funcionário.java especifica a herança. toString desta classe delega a toString da superclasse a impressão de seus dados. Sintaxe diferente para invocar

ChefeDeDepartamento departamento, promoçãoAChefe ChefeDeDepartamento(n,i,nasc,adm,sal,dep,prom); qualDepartamento(); toString();

Pessoa nome,identidade,nascimento Pessoa(n,i,nasc); toString();

Funcionário admissão,salário Funcionário(n,i,nasc,adm,sal); qualSalário(); toString();

Herança

Page 14: Luz, C Âmera, Ação! · Funcionário.java especifica a herança. toString desta classe delega a toString da superclasse a impressão de seus dados. Sintaxe diferente para invocar

class ChefeDeDepartamento extends Funcionario {

private String departamento; private Data promoçãoAChefe;

ChefeDeDepartamento(String nome,int id,Data nasc, Data adm, float sal, String dep,Data prom) { super(nome,id,nasc,adm,sal); departamento = dep; promoçãoAChefe = prom; }

public String toString() { return super.toString()+"\n"+ Departamento:"+departamento+"\n" + "Data de promoção ao cargo:"+promoçãoAChefe; }

public String qualDepartamento() { return departamento; }

} // fim da classe ChefeDeDepartamentoChefeDeDepartamento.java

a herança é transitiva

Herança

Page 15: Luz, C Âmera, Ação! · Funcionário.java especifica a herança. toString desta classe delega a toString da superclasse a impressão de seus dados. Sintaxe diferente para invocar

ChefeDeDepartamento departamento, promoçãoAChefe ChefeDeDepartamento(n,i,nasc,adm,sal,dep,prom); qualDepartamento(); toString();

Pessoa nome,identidade,nascimento Pessoa(n,i,nasc); toString();

Funcionário admissão,salário Funcionário(n,i,nasc,adm,sal); qualSalário(); toString();

PacienteDeClínica planoDeSaúde PacienteDeClínica(n,i,nasc,plano); toString();

A herança é uma hierarquia: da raiz para as folhas; sem relacionamento entre irmãos.

Não há herança múltipla

Herança

Page 16: Luz, C Âmera, Ação! · Funcionário.java especifica a herança. toString desta classe delega a toString da superclasse a impressão de seus dados. Sintaxe diferente para invocar

Class Hierarchy oclass java.lang.Object

oclass java.lang.Boolean (implements java.io.Serializable) oclass java.lang.Character (implements java.lang.Comparable, java.io.Serializable) oclass java.lang.Character.Subset

oclass java.lang.Character.UnicodeBlockoclass java.lang.Class (implements java.io.Serializable) . . .oclass java.lang.Math oclass java.lang.Number (implements java.io.Serializable)

oclass java.lang.Byte (implements java.lang.Comparable) oclass java.lang.Double (implements java.lang.Comparable) oclass java.lang.Float (implements java.lang.Comparable) oclass java.lang.Integer (implements java.lang.Comparable) oclass java.lang.Long (implements java.lang.Comparable) oclass java.lang.Short (implements java.lang.Comparable) . . .

Hierarquia de classes em Java

Page 17: Luz, C Âmera, Ação! · Funcionário.java especifica a herança. toString desta classe delega a toString da superclasse a impressão de seus dados. Sintaxe diferente para invocar

Todas as classes herdam de Object, mesmo que não contenham a declaração de herança.

Contém apenas métodos genéricos, que devem ser reimplementados pelas classes.

Object: A raíz da hierarquia

Page 18: Luz, C Âmera, Ação! · Funcionário.java especifica a herança. toString desta classe delega a toString da superclasse a impressão de seus dados. Sintaxe diferente para invocar

Method Summaryprotected  

Objectclone()           Creates and returns a copy of this object.

 boolean equals(Object obj)           Indicates whether some other object is "equal to" this one.

protected  void

finalize()           Called by the garbage collector on an object when garbage collection determines that there are no more references to the object.

 Class getClass()           Returns the runtime class of an object.

 int hashCode()           Returns a hash code value for the object.

 void notify()           Wakes up a single thread that is waiting on this object's monitor.

 void notifyAll()           Wakes up all threads that are waiting on this object's monitor.

 String toString()           Returns a string representation of the object.

 void wait()           Causes current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object.

 void wait(long timeout)           Causes current thread to wait until either another thread invokes the notify() method or the notifyAll() method for this object, or a specified amount of time has elapsed.

 void wait(long timeout, int nanos)           Causes current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object, or some other thread interrupts the current thread, or a certain amount of real time has elapsed.

Object: A raíz da hierarquia

Page 19: Luz, C Âmera, Ação! · Funcionário.java especifica a herança. toString desta classe delega a toString da superclasse a impressão de seus dados. Sintaxe diferente para invocar

Campos da superclasse que não sejam privados podem ser utilizados diretamente.

Campos privados da superclasse devem ser usados através dos serviços oferecidos pela superclasse.

Construtores da superclasse podem ser utilizados através da palavra super.

Somente os Construtores da superclasse imediata podem ser utilizados diretamente.

Métodos da superclasse que não sejam privados podem ser utilizados diretamente.

Métodos sobrepostos da superclasse que não sejam privados podem ser utilizados através da palavra super.

class Funcionario extends Pessoa { private Data admissão; private float salário;

Funcionario(String nome,int id,Data nasc,Data adm,float sal) {

super(nome,id,nasc); (3) admissão = adm; salário = sal; }public String toString() { (6) return super.toString()+"\n"+ "Data de admissão: "+admissão+ "\n" + "Salário: "+salário; }

final public float qualSalário() { return salário; }

} // fim da classe FuncionarioFuncionário.java

Reuso e Herança

Page 20: Luz, C Âmera, Ação! · Funcionário.java especifica a herança. toString desta classe delega a toString da superclasse a impressão de seus dados. Sintaxe diferente para invocar

Sobreposição de campos:Um campo declarado na subclasse oculta o campo de mesmo nome da

superclasse.

Sobreposição de métodos:Método herdado pode não ser adequado para os objetos das subclasses. Um

método declarado na subclasse oculta o método com a mesma assinatura

declarado na superclasse. O método oculto da superclasse, se não for privado, pode ser invocado através

da palavra super.Sobrecarga de métodos: (aula 5)

Método da super classe , que não seja privado, declarado com a mesma assinatura que um método da classe pode ser invocado através da palavra super.

Sobreposição

Page 21: Luz, C Âmera, Ação! · Funcionário.java especifica a herança. toString desta classe delega a toString da superclasse a impressão de seus dados. Sintaxe diferente para invocar

Definição dinâmica do método a ser executado: depende do objeto que invoca o método

public class Empresa {

public static void main(String[] args) { float s; int i; DataCons d1 = new DataCons((byte)12,(byte)12,(short)1967);

Pessoa p = new Pessoa ("Denise", 3454637, d1); DataCons d2 = new DataCons((byte)1,(byte)12,(short)1972); DataCons d3 = new DataCons((byte)1,(byte)12,(short)2002);

i = p.qualIdentidade(); Funcionario f1 =

new Funcionario ("Rogerio", 93452128 ,d2 ,d3 ,(float)1000.00); s = f1.qualSalário(); i = f1.qualIdentidade();

System.out.println(f1); }}

Empresa.java

instância de Pessoa, método de Pessoa

instância de Funcionário, método de Pessoa

Amarração Tardia de Tipos

Page 22: Luz, C Âmera, Ação! · Funcionário.java especifica a herança. toString desta classe delega a toString da superclasse a impressão de seus dados. Sintaxe diferente para invocar

f1

PESSOA

psuper

Pessoa(...)

toString()

FUNCIONÁRIO

psuper

qualsalário()

pclasse

nome:“Rogerio”

identidade: 457928

nascimento: 01/12/1972admissão:

01/12/2002salário: 1000.00

toString()

funcionário(...)

Amarração Tardia de Tipos

Page 23: Luz, C Âmera, Ação! · Funcionário.java especifica a herança. toString desta classe delega a toString da superclasse a impressão de seus dados. Sintaxe diferente para invocar

Definição dinâmica do método a ser executado: depende do objeto que invoca o método

public class EmpresaDin { public static void main(String[] args) {

float s; int i; DataCons d1 = new DataCons((byte)12,(byte)12,(short)1967);

Pessoa p = new Pessoa ("Denise", 3454637, d1); DataCons d2 = new DataCons((byte)1,(byte)12,(short)1972); DataCons d3 = new DataCons((byte)1,(byte)12,(short)2002);

Funcionario f1 = new Funcionario ("Rogerio", 457928,d2,d3,(float)1000.00)

p = f1; System.out.println(p);

}}

EmpresaDin.java

referência de Pessoa passa a apontar para instância de Funcionário

invoca toString de Pessoa? de Funcionário?

Amarração Tardia de Tipos

Page 24: Luz, C Âmera, Ação! · Funcionário.java especifica a herança. toString desta classe delega a toString da superclasse a impressão de seus dados. Sintaxe diferente para invocar

f1

PESSOA

psuper

Pessoa(...)

toString()

FUNCIONÁRIO

psuper

qualsalário()

pclasse

nome:“Rogerio”

identidade: 457928

nascimento: 01/12/1972admissão:

01/12/2002salário: 1000.00 toString()

funcionário(...)

pclasse

nome:“Denise”

identidade: 3454637

nascimento: 01/12/1967

p

Amarração Tardia de Tipos

Page 25: Luz, C Âmera, Ação! · Funcionário.java especifica a herança. toString desta classe delega a toString da superclasse a impressão de seus dados. Sintaxe diferente para invocar

Sobreposição de métodos:

Um método public (subclasse) pode sobrepor um método private (superclasse);

Um método private (subclasse) não pode sobrepor um método public (superclasse);

Um método estático não pode ser sobreposto;

Um método final é herdado pelas subclasses, mas não pode ser sobreposto.

- Classes declaradas como Final : tem todos os métodos final. Não pode ter subclasses. (Mecanismo para barrar a herança!)

Sobreposição

Page 26: Luz, C Âmera, Ação! · Funcionário.java especifica a herança. toString desta classe delega a toString da superclasse a impressão de seus dados. Sintaxe diferente para invocar

- Delegação: tem-um Quando se quer as características de uma classe, mas não

seus campos e métodos; O componente auxilia na implementação da funcionalidade

da subclasse.

- Herança: é-um Além de usar as características da superclasse, a

subclasse também usa campos e/ou métodos da superclasse.

Delegação X Herança

Page 27: Luz, C Âmera, Ação! · Funcionário.java especifica a herança. toString desta classe delega a toString da superclasse a impressão de seus dados. Sintaxe diferente para invocar

livro Introdução à Programação Orientada a Objetos usando JAVA – Rafael Santos – Editora Campus – Série SBC

Material de aula da Prof. Isabel Cafezeiro http://www.dcc.ic.uff.br/~isabel

Referências Bibliográficas