980 likes | 1.12k Vues
Programação Orientada a Objetos*. Introdução Prof. Isabel Cafezeiro isabel@dcc.ic.uff.br http://www.dcc.ic.uff.br/~isabel *Baseado no livro Introdução à Programação Orientada a Objetos usando JAVA – Rafael Santos – Editora Campus – Série SBC. Modelos.
E N D
ProgramaçãoOrientada a Objetos* Introdução Prof. Isabel Cafezeiro isabel@dcc.ic.uff.br http://www.dcc.ic.uff.br/~isabel *Baseado no livro Introdução à Programação Orientada a Objetos usando JAVA – Rafael Santos – Editora Campus – Série SBC
Modelos Só o que é relevante para o processamento a ser efetuado. Exemplo: a folha de pagamento da loja não precisa ter dados sobre a loja (endereço, telefone, etc) Algo (entidade) a ser representado no computador. Exemplo: a loja, o restaurante, a folha de pagamento. Modelo: Abstração de uma realidade
Modelos Informações propriamente ditas Entidade: Modelo: Componentes Dados Comportamento Operações Efetuam alguma tarefa sobre os dados: inicialização atualização consulta destruição
Modelos Modelos são estruturáveis !!! Entidades são compostas por outras entidades Exemplo: Modelo RestauranteCaseiro pode conter o modelo MesaDoRestaurante
Modelos Notação: Nomes deModelos: Iniciar com Maiúscula Não usar acento, cedilha Nomes deOperações: Iniciar com minúscula Pode usar acento, cedilha
Modelos Exemplo: Lampada Nome do modelo estado Dados acende () apaga () Operações mostraDados () Opeações podem necessitar: parâmetro / retorno
Modelos Lampada início estado // indica se está ligada ou desligada acende () início estado = ligado fim apaga () início estado = apagado fim mostraEstado() início se (estado == aceso) imprime “Lâmpada acesa” senão imprime “Lâmpada apagada” fim fim fim
Modelos Comparação com o estilo C, Pascal: Código descreve uma entidade Não há necessariamente um “programa principal” Operações e dados em um único bloco Dados manipulados somente pelas operações Dados x Fluxo de execução Encapsulamento
Modelos Comparação com o estilo C, Pascal: Dados x Fluxo de execução: permite modelar o mundo real da forma como ele se apresenta Encapsulamento: “protege” os dados do uso indevido
Modelos Definição: Modelos são representações de entidades onde os componentes são representados através dos dados e o comportamento é representado através das operações.
Modelos Exemplo: Data dia, mês, ano inicializa (d,m,a) dataéVálida (d,m,a) mostra ()
Modelos dataéVálida (d,m,a) início se ((dia > 1) e (dia < 31) ou ..... )) retorna verdadeiro senão retorna falso fim fim mostra () início imprime dia,”/”,mês,”/”,ano fim fim Data início dia,mês,ano inicializa (d,m,a) início se dataéVálida (d,m,a) dia = d mês = m ano = a senão dia = 0 mês = 0 ano = 0 fim fim
Modelos no Pseudocódigo, observar: Funções? Procedimentos? Operações atualizadoras? Consultoras? Inicializadoras? Delegação de tarefas?
Orientação a Objetos representação computacional de entidades descritas pela classe representação abstrata da realidade Modelos Classes Entidades do mundo real Instâncias da classe: objetos
Orientação a Objetos dados operações atributos métodos representação computacional de entidades descritas pela classe representação abstrata da realidade Modelos Classes Entidades do mundo real Instâncias da classe: objetos componentes comportamento
ProgramaçãoOrientada a Objetos* Reuso de classes Prof. Isabel Cafezeiro isabel@dcc.ic.uff.br http://www.dcc.ic.uff.br/~isabel *Baseado no livro Introdução à Programação Orientada a Objetos usando JAVA – Rafael Santos – Editora Campus – Série SBC
Reuso de código • Mecanismo de Reuso: • Diminui a necessidade de re-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
Delegação • 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.
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.
Delegação ou Composição delegação: campos que são instâncias de classes. São manipulados da mesma forma que tipos nativos 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 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 class 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
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.
Herança Relacionamento hierárquico entre classes: (super)classe ou ancestral (sub)classe ou classe herdeira Asubclasse herda da classe: • todos os campos • todos os métodos A subclasse pode conter atributos e métodos adicionais mais especializada
Herança 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 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 especifica a herança. nome e idade são privados em Pessoa: mesmo nas subclasses devem ser acessados através dos serviços oferecidos. 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 Funcionario Funcionário.java O construtor desta classe delega ao construtor da superclasse a tarefa de inicializar os dados herdados. toString desta classe delega a toString da superclasse a impressão de seus dados. Sintaxe diferente para invocar construtor ou método da superclasse.
Herança 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 Funcionário herda as operações de Pessoa
Herança 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(); ChefeDeDepartamento departamento, promoçãoAChefe ChefeDeDepartamento(n,i,nasc,adm,sal,dep,prom); qualDepartamento(); toString();
Herança 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 ChefeDeDepartamento ChefeDeDepartamento.java a herança é transitiva
Herança Pessoa nome,identidade,nascimento Pessoa(n,i,nasc); 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 Funcionário admissão,salário Funcionário(n,i,nasc,adm,sal); qualSalário(); toString(); ChefeDeDepartamento departamento, promoçãoAChefe ChefeDeDepartamento(n,i,nasc,adm,sal,dep,prom); qualDepartamento(); toString();
Hierarchy For Package java.lang • Package Hierarchies: • All Packages Hierarquia de classes em Java • Class Hierarchy • class java.lang.Object • class java.lang.Boolean (implements java.io.Serializable) • class java.lang.Character (implements java.lang.Comparable, java.io.Serializable) • class java.lang.Character.Subset • class java.lang.Character.UnicodeBlock • class java.lang.Class (implements java.io.Serializable) • . . . • class java.lang.Math • class java.lang.Number (implements java.io.Serializable) • class java.lang.Byte (implements java.lang.Comparable) • class java.lang.Double (implements java.lang.Comparable) • class java.lang.Float (implements java.lang.Comparable) • class java.lang.Integer (implements java.lang.Comparable) • class java.lang.Long (implements java.lang.Comparable) • class java.lang.Short (implements java.lang.Comparable) • . . .
Object:A raíz da hierarquia • 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.
Method Summary protected Object clone() 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
Reuso e Herança 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 Funcionario Funcionário.java • Campos da superclasse que não sejam privados podem ser utilizados diretamente. • Camposprivados 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étodossobrepostos da superclasse que não sejam privados podem ser utilizados através da palavra super.
Sobreposição • 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.
Amarração Tardia de Tipos 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
pclasse nome:“Rogerio” identidade: 457928 PESSOA psuper f1 nascimento: 01/12/1972 Pessoa(...) toString() admissão: 01/12/2002 salário: 1000.00 FUNCIONÁRIO psuper funcionário(...) qualsalário() toString() Amarração Tardia de Tipos
Amarração Tardia de Tipos 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 pclasse p nome:“Denise” identidade: 3454637 PESSOA nascimento: 01/12/1967 psuper pclasse Pessoa(...) nome:“Rogerio” toString() identidade: 457928 FUNCIONÁRIO f1 nascimento: 01/12/1972 psuper funcionário(...) admissão: 01/12/2002 qualsalário() salário: 1000.00 toString()
Sobreposição • 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 !!!
Polimorfismo • Mecanismo que permite que uma operação receba argumentos de diferentes tipos Um parâmetro declarado como valor de um tipo... ... pode receber valores do subtipo. • Mecanismo que permite que um método receba argumentos de diferentes classes: Um parâmetro declarado como instância da superclasse... ... pode receber instâncias da subclasse.
Delegação X Herança • Delegação: tem-um • Quando se quer as características de uma classe, mas não seus campos e métodos; • O componenteauxilia 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.
ProgramaçãoOrientada a Objetos* Criando Aplicações em Java Prof. Isabel Cafezeiro isabel@dcc.ic.uff.br http://www.dcc.ic.uff.br/~isabel *Baseado no livro Introdução à Programação Orientada a Objetos usando JAVA – Rafael Santos – Editora Campus – Série SBC
A Aplicação em Java Classes implementam modelos. Aplicações ? Programa ? Sistema ? Dinâmica da execução ?
A Aplicação em Java programadores de classes programadores usuários contrato prevêem e disponibilizam os serviços a serem oferecidos pela classe usam as classes, através dos serviços oferecidos, para compor aplicações
A Aplicação em Java O método main pode ser usado por outra classe. O método main pode receber como argumentos uma quantidade arbitrária de dados informados no momento da execução No programa usuário (aplicação): Ponto de entrada: classe com método main public static void main (String[] nome) Recomenda-se: main: o único método de uma classe O método main não tem dados de retorno. O método main pode ser chamado sem que seja criada uma instância da classe.
A Aplicação em Java main: único método da classe. Ponto de entrada da aplicação. Declara e cria instâncias de datas. Inicializa e mostra datas, usando os serviços da classe Data. class DemoData1 { public static void main(String[] argumentos) { Data hoje = new Data(); Data amanhã = new Data(); hoje.inicializaData((byte)20,(byte)4,(short)2006); hoje.mostraData(); amanhã.inicializaData((byte)20,(byte)4,(short)2006); amanhã.mostraData(); amanhã.mês = 10; } // fim do método main } // fim da classe DemoData DemoData1.java Erro de compilação! Tentativa de acesso a campo privado. C:\>javac DemoData1.java DemoData1.java:16: mês has private access in Data amanhã.mês = 10; ^ 1 error
A Aplicação em Java Para usar um objeto da classe: Criar a instância: new Declarar a referência para a classe. Associar a referência à instância: atribuição (2) Data hoje; hoje = new Data( ); Data hoje = new Data( ); (1) (2) (1) (3) (3)
A Aplicação em Java Data hoje,d; hoje = new Data( ); hoje.inicializaData((byte)20,(byte)4,(short)2006); d = hoje; 20/04/2006 hoje d É possível criar múltiplas referências à instâncias: Referências que não são associadas à instâncias não podem ser usadas: Erro de compilação!!! Tentativa de usar uma referência não instanciada. Data d1; d1.inicializaData((byte)20,(byte)4,(short)2006); C:\>javac DemoData1.java DemoData1.java:20: variable d1 might not have been initialized d1.inicializaData((byte)20,(byte)4,(short)2006); ^ 1 error
A Aplicação em Java Data d1 = null; d1.inicializaData((byte)20,(byte)4,(short)2006); Referências podem ser instanciadas com o valor null: neste caso, a tentativa de uso permite a compilação, mas não a execução. Erro de execução!!! Tentativa de usar uma referência que aponta para o valor null. C:\>java DemoData1 Exception in thread "main" java.lang.NullPointerException at DemoData1.main(DemoData1.java:8)