Programação Orientada a Objetos* Introdução Prof. Isabel Cafezeiro *Baseado no livro Introdução à

Slides:



Advertisements
Apresentações semelhantes
Programação Orientada a Objetos*
Advertisements

Programação Orientada a Objetos*
ADT – Arvore Binária de Pesquisa
Projeto de Sistemas de Software Luana Lachtermacher
Java RMI Alcides Calsavara. Objetivos Permitir que um método de uma classe Java em execução em uma máquina virtual JVM chame um método de um objeto (instância.
1 Java: Tratamento de Exceções Alcides Calsavara.
Programação Orientada a Objetos*
VHDL Very High Speed Integrated Circuit Hardware Description Language Prof. Eduardo Todt 2008.
While While Condição // comandos End While. Exemplos While Var contador As Integer contador = 0 While (contador < 10) contador += 1 console.ConsoleWrite(contador)
Listas Encadeadas Circulares Listas Duplamente Encadeadas
2008 LCG/UFRJ. All rights reserved. 1 Standard Template Library STL Claudio Esperança Paulo Roma Cavalcanti.
1 Estruturas de Controle Márcia J. N. Rodrigues Lucena Especialização em Técnicas e Ferramentas de Apoio à Decisão Departamento.
Prof. José Fernando Rodrigues Júnior Pacotes Material original: Profa. Elaine Parros Machado de Sousa SCC Bancos de Dados e Suas Aplicações.
Procedimentos e Funções
Ronaldo Celso Messias Correia
Capítulo 10 Arrays. 2Capítulo 10 – Arrays Arrays Introdução Tipo do array Tamanho do array Preenchendo o array Varrendo um array Array com 2 dimensões.
Técnicas e Projeto de Sistemas André Mesquita Rincon Processo de Software Técnico Subsequente – Módulo III.
FORTRAN 90 Denise Yumi Takamura.
INTRODUÇÃO À COMPUTAÇÃO PARALELA
SQL Procedural Junho/2006.
SQL procedural – parte 2.
Subconsultas em SQL. Subconsulta Estrutura geral SELECT.... FROM.... WHERE [at] OPERADOR ( SELECT... FROM... [WHERE... ]) Declaração SELECT localizada.
SQL-3. Novo contexto e necessidade de : Manipular imagens Outros tipos de dados além de texto e números Recuperação de dados mais complexos Níveis distintos.
Modularização de Código. Modularizar código Construção do algoritmo em um módulo único (Início...Fim/ Program... End) Único arquivo.
Container Managed Persistent Bean Kellyton Brito Projeto Compose
Algoritmos com laços (ou seja, com conjuntos de instruções que devem ser executados repetidas vezes)
Slide 1 Rede Nacional de Ensino e Pesquisa Treinamento em Gradep - junho 2005 Serviço ContextManager Treinamento no GRADEp Framework Master-Worker.
Slide 1 Rede Nacional de Ensino e Pesquisa Treinamento em Gradep - julho 2005 Serviço Worb Treinamento no GRADEp Serviço Worb WorbDemo.
Slide 1 Rede Nacional de Ensino e Pesquisa Treinamento em Gradep - junho 2005 Serviço Collector Treinamento no GRADEp Serviço Collector CollectorDemo e.
Classes Internas e Anônimas
Servidores e Programação Web Redes de Computadores.
Mais sobre classes Baseada no Livro: Deitel&Deitel - C++ How To program Cap. 7 Prentice Hall 1994 SCE 213 Programação Orientada a Objetos, ICMC - USP 2.
Profa. Graziela Santos de Araújo Algoritmos e Programação II, 2010
Introdução A fim de preparar a geração de código, deve-se relacionar o fonte estático do programa às ações em tempo de execução. Durante a execução, o.
O Fluxo de Testes © Alexandre Vasconcelos
Templates e Questões de Design Programas são geralmente construídos segundo um design que é relativamente bem mapeado nos mecanismos oferecidos pela linguagem.
Agregado Homogêneo e Heterogêneo
01/08/20061 CT-282 Tutores Inteligentes ITA - INSTITUTO TECNOLÓGICO DE AERONÁUTICA.
Curso Técnico em Informática La Salle - Canoas
Business Process Management e Workflow - jBPM Aluno: Filipe Ferraz Salgado Orientador: Francisco Reverbel Novembro 2006.
ALOCAÇÃO DINÂMICA DE MEMÓRIA
C/C++.
Laboratório de Programação Prof. Oscar Luiz Monteiro de Farias
Tecnologia para Web JavaScript Enrique Pimentel Leite de Oliveira
Recursividade Estrutura de Dados.
Marco Antonio Montebello Júnior
Elaine Harada Teixeira de Oliveira – DCC – ICE - UFAM
Orientação a Objetos Uma Introdução à Programação Orientada a Objetos
Entendendo as definições de classe
Curso de Programação em C++
Curso de Programação em C++ Universidade Federal do Ceará Departamento de Engenharia Estrutural e Construção Civil Prof: Evandro Parente Junior Monitor:
Baseado no documento do Prof. Ronaldo Martins da Costa
LINGUAGENS DE PROGRAMAÇÃO
04:27 Introdução Tipos de Fluxo de Dados e de Arquivos Manipulação de Arquivos em Java Classes FileReader e FileWriter Classes FileInputStream e FileOutputStream.
Sistemas de Informação Prof. Me. Everton C. Tetila Modelo de dados relacional Banco de Dados I.
Objetos Distribuídos - Programação Distribuída Orientado a Objetos Luiz Affonso Guedes.
Programação Concorrente com Thread Java
Introdução Ciência da Computação estudo de algoritmos –ÊNFASE ao estudo de DADOS armazenamento manipulação refinamento (a partir de dados cru) estrutura.
Sincronização com Locks. Locks É um mecanismo de sincronização de processos/threads em que estas devem ser programadas de modo que seus efeitos sobre.
Melhorias e Mensagens Amigáveis ao Usuário Centro de Informática Universidade Federal de Pernambuco Bruno Felipe Marco André Paulo Fernando Rodolfo Santos.
INPE / CAP-315 Airam J. Preto, Celso L. Mendes Aula 30 (1) Empacotamento de Dados em MPI Tópicos: Buffer de Mensagem Empacotamento/Desempacotamento.
Java em Redes de Computadores
Scala Bruno Barros e Rebeka Gomes
Funções ou procedures Professor Esp. Diego André Sant’Ana
Java Generics Adeline de Sousa Silva.
ArrayList e Genéricos Profs. PROG2 - UNISINOS.
Tipos Especiais de Listas
Alisson Rafael Appio SOP aplicado em um jogo tipo de corrida usando a arquitetura cliente e servidor Alisson Rafael Appio
Programação Orientada a Objetos*
Programação Orientada a Objetos*
Transcrição da apresentação:

Programação Orientada a Objetos* Introdução Prof. Isabel Cafezeiro *Baseado no livro Introdução à Programação Orientada a Objetos usando JAVA – Rafael Santos – Editora Campus – Série SBC

Modelos Modelo: Abstração de uma realidade 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.

Modelos Entidade:Modelo: ComponentesDados ComportamentoOperações Informações propriamente ditas 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 de Modelos: Iniciar com Maiúscula Não usar acento, cedilha Nomes de Operações: Iniciar com minúscula Pode usar acento, cedilha

Modelos Exemplo: LampadaNome do modelo estadoDados 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

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 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 dataéVálida (d,m,a) início se ((dia > 1) e (dia < 31) ou..... )) retorna verdadeiro senão retorna falso fim mostra () início imprime dia,/,mês,/,ano fim

Modelos no Pseudocódigo, observar: Funções? Procedimentos? Operações atualizadoras? Consultoras? Inicializadoras? Delegação de tarefas?

Orientação a Objetos Modelos Classes representação computacional de entidades descritas pela classe Instâncias da classe: objetos representação abstrata da realidade Entidades do mundo real

Orientação a Objetos Modelos Classes representação computacional de entidades descritas pela classe Instâncias da classe: objetos representação abstrata da realidade Entidades do mundo real dados operações atributos métodos componentes comportamento

Programação Orientada a Objetos* Reuso de classes Prof. Isabel Cafezeiro *Baseado no livro Introdução à Programação Orientada a Objetos usando JAVA – Rafael Santos – Editora Campus – Série SBC

Reuso de código zMecanismo de Reuso: yDiminui a necessidade de re-escrever código: menos trabalho para o programador. yPermite o aproveitamento de código pré-existente (livre de erro e otimizado): menos chances de cometer erros yEm linguagens convencionais: biblioteca de funções e procedimentos

Delegação zReuso de classes em POO: Para criar uma classe que se aproveita de características de uma outra classe: yDelegação (composição) Uma instância da classe existente é usada como componente da nova classe. yHerança A nova classe é uma extensão da classe existente.

Reuso de código zReuso de classes em POO: Exemplo: Um aluno de um curso universitário é modelado pela classe RegistroAcadêmico. yDelegaçã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 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 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, ); System.out.println(millôr); } } // fim da classe DemoRegistroAcademicoDeGraduacao DemoRegistroAcademicoDeGraduacao.java

Reuso de código zReuso de classes em POO: Exemplo: Um aluno de um curso universitário é modelado pela classe RegistroAcadêmico. yHeranç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 A subclasse herda da classe: x todos os campos x 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 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 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 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", , 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", ,d2,d3,(float) ); s = f1.qualSalário(); i = f1.qualIdentidade(); System.out.println(f1); } Empresa.java Funcionário herda as operações de Pessoa

Herança 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 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 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

Hierarquia de classes em Java Hierarchy For Package java.lang Package Hierarchies: All Packages Class Hierarchy oclass java.lang. Object Object oclass java.lang. Boolean (implements java.io.Serializable) BooleanSerializable oclass java.lang. Character (implements java.lang.Comparable, java.io.Serializable) CharacterComparableSerializable oclass java.lang. Character.Subset Character.Subset oclass java.lang. Character.UnicodeBlock Character.UnicodeBlock oclass java.lang. Class (implements java.io.Serializable) ClassSerializable... oclass java.lang. Math Math oclass java.lang. Number (implements java.io.Serializable) NumberSerializable oclass java.lang. Byte (implements java.lang.Comparable) ByteComparable oclass java.lang. Double (implements java.lang.Comparable) DoubleComparable oclass java.lang. Float (implements java.lang.Comparable) FloatComparable oclass java.lang. Integer (implements java.lang.Comparable) IntegerComparable oclass java.lang. Long (implements java.lang.Comparable) LongComparable oclass java.lang. Short (implements java.lang.Comparable) ShortComparable...

Object: A raíz da hierarquia zTodas as classes herdam de Object, mesmo que não contenham a declaração de herança. zContém apenas métodos genéricos, que devem ser reimplementados pelas classes.

Object: A raíz da hierarquia Method Summary protected O bjectO bject cloneclone() Creates and returns a copy of this object. boolean equalsequals(Object obj) Indicates whether some other object is "equal to" this one.Object protected v oid finalizefinalize() Called by the garbage collector on an object when garbage collection determines that there are no more references to the object. Class getClassgetClass() Returns the runtime class of an object. int hashCodehashCode() Returns a hash code value for the object. void notifynotify() Wakes up a single thread that is waiting on this object's monitor. void notifyAllnotifyAll() Wakes up all threads that are waiting on this object's monitor. String toStringtoString() Returns a string representation of the object. void waitwait() Causes current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object. notify() notifyAll() void waitwait(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. notify() notifyAll() void waitwait(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. notify() notifyAll()

Reuso e Herança 1.Campos da superclasse que não sejam privados podem ser utilizados diretamente. 2.Campos privados da superclasse devem ser usados através dos serviços oferecidos pela superclasse. 3.Construtores da superclasse podem ser utilizados através da palavra super. 4.Somente os Construtores da superclasse imediata podem ser utilizados diretamente. 5.Métodos da superclasse que não sejam privados podem ser utilizados diretamente. 6.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 Funcionario Funcionário.java

Sobreposição z Sobreposição de campos: Um campo declarado na subclasse oculta o campo de mesmo nome da superclasse. z 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. z 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", , 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", ,d2,d3,(float) ); 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 f1 PESSOA psuper Pessoa(...) toString() FUNCIONÁRIO psuper qualsalário() pclasse nome:Rogerio identidade: nascimento: 01/12/1972 admissão: 01/12/2002 salário: toString() funcionário(...)

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", , 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", ,d2,d3,(float) ) 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 f1 PESSOA psuper Pessoa(...) toString() FUNCIONÁRIO psuper qualsalário() pclasse nome:Rogerio identidade: nascimento: 01/12/1972 admissão: 01/12/2002 salário: toString() funcionário(...) pclasse nome:Denise identidade: nascimento: 01/12/1967 p

Sobreposição z 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. z Classes declaradas como Final : tem todos os métodos final. Não pode ter subclasses. Mecanismo para barrar a herança !!!

Polimorfismo z 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. z 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 z Delegação: tem-um y Quando se quer as características de uma classe, mas não seus campos e métodos; y O componente auxilia na implementação da funcionalidade da subclasse. z Herança: é-um y Além de usar as características da superclasse, a subclasse também usa campos e/ou métodos da superclasse.

Programação Orientada a Objetos* Criando Aplicações em Java Prof. Isabel Cafezeiro *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 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 pode ser usado por outra classe. O método main pode ser chamado sem que seja criada uma instância da classe. O método main não tem dados de retorno. O método main pode receber como argumentos uma quantidade arbitrária de dados informados no momento da execução

A Aplicação em Java 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 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. 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: 1.Criar a instância: new 2.Declarar a referência para a classe. 3.Associar a referência à instância: atribuição Data hoje; hoje = new Data( ); Data hoje = new Data( ); (1) (2) (3)

A Aplicação em Java É possível criar múltiplas referências à instâncias: Referências que não são associadas à instâncias não podem ser usadas: Data hoje,d; hoje = new Data( ); hoje.inicializaData((byte)20,(byte)4,(short)2006); d = hoje; 20/04/2006 hojed 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 Erro de compilação!!! Tentativa de usar uma referência não instanciada.

A Aplicação em Java 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. Data d1 = null; d1.inicializaData((byte)20,(byte)4,(short)2006); C:\>java DemoData1 Exception in thread "main" java.lang.NullPointerException at DemoData1.main(DemoData1.java:8) Erro de execução!!! Tentativa de usar uma referência que aponta para o valor null.

A Aplicação em Java A impressão dos dados de uma classe: deve ser feita campo a campo, através do método print do campo out da classe System public void mostraData() { System.out.print(dia); System.out.print("/"); System.out.print(mês); System.out.print("/"); System.out.println(ano); } // fim do método mostraData Data.java System.out.println(dia+"/"+mês+"/"+ano);

A Aplicação em Java A impressão dos dados de uma classe: Pode ser facilitada pela declaração do método toString: quando declarado em uma classe, toString permite que os objetos da classe sejam impressos diretamente, como se fosse uma string. public String toString () { String saída = dia + "/" + mês + "/" + ano; return saída; } // fim do método toString Data d = new Data( ); d.inicializaData((byte)20,(byte)4,(short)2006); System.out.print(d); na classe Data.java na classe usuária de Data.java

A Aplicação em Java A leitura dos dados de uma classe: Keyboard class DemoData2 { public static void main(String[] argumentos) { Data hoje = new Data(); System.out.print("Entre com o dia: "); byte dia = Keyboard.readByte(); System.out.print("Entre com o mês: "); byte mês = Keyboard.readByte(); System.out.print("Entre com o ano: "); short ano = Keyboard.readShort(); hoje.inicializaData(dia,mês,ano); hoje.mostraData(); } // fim do método main } // fim da classe DemoData2 DemoData2.java

Programação Orientada a Objetos* Exercícios Prof. Isabel Cafezeiro *Baseado no livro Introdução à Programação Orientada a Objetos usando JAVA – Rafael Santos – Editora Campus – Série SBC

Figuras geométricas Imagine as seguintes entidades: Círculos, Quadrados e Triângulos. Quais são os componentes de cada uma destas entidades? Qual é o comportamento de cada uma entidade?

Figuras geométricas Círculos, Quadrados e Triângulos. Tomando como referência o modelo da lâmpada (aula 1); Escreva modelos para Círculos, Quadrados e Triângulos: Quais são os dados de cada modelo? Quais são as operações de cada modelo? Imagine que as figuras podem ser movidas, aumentadas, diminuídas, mostradas, comparadas, etc. Descreva em pseudo-código cada operação do modelo, lembrando-se de informar parâmetros e retorno de operações quando for o caso.

Figuras geométricas Círculos, Quadrados e Triângulos Escreva classes em Java para implementar Círculos, Quadrados e Triângulos. Não é preciso desenhar as figuras, apenas manipular suas coordenadas. Compile cada classe. Escreva uma classe usuária destas figuras, que permita testar cada método das figuras. Compile e teste as classes.

A documentação de java Círculos, Quadrados e Triângulos Problema surgido: Como se faz exponencial em Java? Como consultar a documentação de java? No diretório de instalação do java, Subdiretório Docs, Arquivo index.html. Ou em:

A documentação de java

API Specifications Package java.langjava.lang Package java.lang.refjava.lang.ref Package java.lang.reflectjava.lang.reflect Package java.utiljava.util Package java.util.prefsjava.util.prefs Package java.util.loggingjava.util.logging Package java.util.regexjava.util.regex Package java.util.jarjava.util.jar Package java.util.zipjava.util.zip

A documentação de java Package java.lang.... Class Summary BooleanBooleanThe Boolean class wraps a value of the primitive type boolean in an object. ByteByteThe Byte class wraps a value of primitive type byte in an object..... MathMathThe class Math contains methods for performing basic numeric operations such as the elementary exponential, logarithm, square root, and trigonometric functions.

A documentação de java java.lang Class Math java.lang.Objectjava.lang.Object java.lang.Math.... Method Summary static double abs(double a) Returns the absolute value of a double value.abs static float abs(float a) Returns the absolute value of a float value.abs.... static double exp(double a) Returns Euler's number e raised to the power of a double value.exp.... static doublepow(double a, double b) Returns the value of the first argument raised to the power of the second argument.pow

Empréstimos em Biblioteca Imagine um sistema para modelar a utilização de uma biblioteca, no que diz respeito ao empréstimo e devolução de livros. Considere que as entidades envolvidas neste sistema são livros e usuários. Os usuários pegam os livros emprestados, desde que estejam disponíveis, e devem devolvê-los no prazo de 5 dias. Utilize o modelo Data para gerenciar as datas. Pode ser necessário acrescentar algum serviço ao modelo Data.

Empréstimos em Biblioteca Quais são os componentes de cada entidade? Qual é o comportamento de cada entidade? Escreva modelos para cada entidade. Escreva classes para cada entidade, e compile. Escreva a classe Biblioteca, usuária das classes implementadas acima, compile e teste. Gere a documentação automática usando o javadoc.

Programação Orientada a Objetos* Construtores e Sobrecarga Prof. Isabel Cafezeiro *Baseado no livro Introdução à Programação Orientada a Objetos usando JAVA – Rafael Santos – Editora Campus – Série SBC

Construtores Construtores: zsão métodos especiais invocados no memento da criação de instâncias; zexiste um construtor padrão: não precisa ser programado; zé o primeiro método que um objeto executa: garante a inicialização correta da instância.

Construtores zExemplo: Data d = new Data(); Data d = new; declaração de referência para a classe Data associação da referência à instância invocação do construtor Data() criação da instância C:\>javac demodata1.java demodata1.java:5: expected Data hoje = new; ^ 1 error Erro de compilação!!! Criação da instância sem a chamada do construtor

Construtores Os construtores garantem a inicialização correta da instância Exemplo: Na classe Data, o uso do método inicializaData deveria ser obrigatório: esta tarefa deveria ser efetuada por um construtor.

Construtores zConstrutor padrão: inicializa dados da instância com o valor padrão do tipo nativo padrão, ou null (para instâncias de classes) tipo nativo valor padrão booleanfalse charespaço tipos numéricoszero do tipo

Construtores Construtores x outros métodos: zOs construtores têm o nome da classe, respeitando maiúsculas e minúsculas. zOs construtores não retornam valor (nem mesmo void). Devem ser declarados sem retorno. zNão podem ser chamados sem o new.

Construtores Na classe Data: eliminar o método inicializaData, criar inicializações adequadas usando construtores. DataCons.java DataCons(byte d,byte m,short a) { if (dataÉVálida(d,m,a)) { dia = d; mês = m; ano = a; } else { dia = 0; mês = 0; ano = 0; } } // fim do método DataCons

Sobrecarga de métodos A melhor forma de inicializar uma data é... ¿¿ informando cada componente membro a membro ?? (transparência 7) ¿¿ utilizando uma outra instância de data já criada ?? DataCons.java DataCons(DataCons outraData) { byte d = outraData.dia; byte m = outraData.mês; short a = outraData.ano; if (dataÉVálida(d,m,a)) { dia = d; mês = m; ano = a; } else { { dia = 0; mês = 0; ano = 0; } } // fim do método DataCons

Sobrecarga de métodos Possibilidade de usar o mesmo nome para métodos (com o mesmo propósito) e argumentos diferentes. zMecanismo já existente em diversas LPs convencionais; zMecanismo largamente explorado em POO. Exemplo:DataCons(d,m,a); DataCons(hoje); mesmo nome, argumentos diferindo em tipo e/ou quantidade. O método a ser executado é determinado, sem ambiguidade pela seqüência de argumentos !!!

Sobrecarga de métodos DataCons.java public void alteraDia(byte d) { dia = d; System.out.println("Efetuou alteraDia(byte d)"); } // fim do método alteraDia public void alteraDia(int d) { if (d>31) System.out.println("Valor inválido para dia"); else dia = (byte)d; System.out.println("Efetuou alteraDia(int d)"); } // fim do método alteraDia

Sobrecarga de métodos DemoDataCons.java byte b = 4; int i = 4; hoje.alteraDia(b); Efetua alteraDia(byte d) hoje.mostraData(); hoje.alteraDia(i); Efetua alteraDia(int d) hoje.mostraData(); hoje.alteraDia(4); Efetua alteraDia(int d) hoje.mostraData();

Sobrecarga de métodos zEm Java: yO tipo do retorno não pode ser usado para identificar o método; ySobrecarga se aplica a métodos em geral, e não somente à construtores.

Construtores A invocação de Construtores zSomente construtores podem chamar construtores (outros métodos não podem); zSe um construtor for chamado a partir de outro, esta deve ser a primeira linha de código do chamador; zConstrutores são chamados pela palavra reservada this; zConstrutores não podem ser recursivos. zA presença de um construtor definido pelo programador impede o uso do construtor padrão da classe, mesmo que o construtor programado tenha assinatura diferente do padrão.

Construtores A invocação de Construtores DataCons(DataCons outraData) { this(outraData.dia,outraData.mês,outraData.ano); } // fim do método DataCons DataCons.java comparar com o construtor da transparência 8 verificar que esta chamada invoca o construtor da transparência 7

This (Auto-referência) zInvocar o construtor da classe zDiferenciar os campos do objeto das variáveis locais DataCons(byte dia,byte mês,short ano) { if (dataÉVálida(dia,mês,ano)) { this.dia = dia; this.mês = mês; this.ano = ano; } else { this.dia = 0; this.mês = 0; this.ano = 0; } } // fim do método DataCons variáveis locais com o mesmo nome do que os campos this diferencia variáveis locais e campos

Programação Orientada a Objetos* Campos e Métodos Estáticos Prof. Isabel Cafezeiro *Baseado no livro Introdução à Programação Orientada a Objetos usando JAVA – Rafael Santos – Editora Campus – Série SBC

Campos e métodos estáticos zCampos estáticos: Campos compartilhados por todas as instâncias de uma classe zMétodos estáticos: Métodos que podem ser executados sem que instâncias da classe sejam criadas

Campos estáticos Campos estáticos (campos de classe) zSomente um valor é armazenado em um campo estático. zA alteração deste valor por qualquer instância afeta todas as outras instâncias da classe.

Campos estáticos hoje DataCons psuper DataCons(...) pclasse dia: 4 mês: 5 ano: 2006 DataCons(...)... retornaDia( )... amanhã pclasse dia: 4 mês: 5 ano: campos estáticos aqui !!!

Campos estáticos Exemplo: c1c2c3c4c5 c1c2c3c4c5 Banco com múltiplas filas Banco com fila única

Campos estáticos class SimuladorDeCaixaDeBanco0 { private int númeroDoCliente; private int númeroDoCaixa; SimuladorDeCaixaDeBanco0(int n) { númeroDoCaixa = n; númeroDoCliente = 0; System.out.println("Caixa "+númeroDoCaixa+" iniciou operação."); } // fim do construtor public void próximoAtendimento() { númeroDoCliente = númeroDoCliente + 1; System.out.print("Cliente com a senha número "+númeroDoCliente+", favor "); System.out.println("dirigir-se ao caixa número "+númeroDoCaixa+"."); } } // fim da classe SimuladorDeCaixaDeBanco0 SimuladorDeCaixaDeBanco0.java Exemplo: Caixa de banco

Campos estáticos class DemoSimuladorDeCaixaDeBanco0 { public static void main(String[] argumentos) { SimuladorDeCaixaDeBanco0 c1 = new SimuladorDeCaixaDeBanco0(1);.... SimuladorDeCaixaDeBanco0 c5 = new SimuladorDeCaixaDeBanco0(5); c1.próximoAtendimento(); c2.próximoAtendimento(); c4.próximoAtendimento(); c5.próximoAtendimento(); c3.próximoAtendimento(); c5.próximoAtendimento(); c2.próximoAtendimento(); } // fim do método main } // fim da classe DemoSimuladorDeCaixaDeBanco0 DemoSimuladorDeCaixaDeBanco0.java Exemplo: Caixa de banco c1c2c3c4c A alteração da senha é local à instância: não afeta as outras instâncias !!!!

Campos estáticos Utilizar contador de senha no main: solução ruim: A cargo do programador usuário!!! Não assegura o uso correto !!! class DemoSimuladorDeCaixaDeBanco01 { public static void main(String[] argumentos) { int senha = 0; SimuladorDeCaixaDeBanco0 c1 = new SimuladorDeCaixaDeBanco0(1);... SimuladorDeCaixaDeBanco0 c5 = new SimuladorDeCaixaDeBanco0(5); senha = c1.próximoAtendimento(senha);.... senha = c2.próximoAtendimento(senha); } // fim do método main } // fim da classe DemoSimuladorDeCaixaDeBanco01 DemoSimuladorDeCaixaDeBanco01.java Sobrecarregar o método próximoAtendimento() na classe SimuladorDeCaixaDeBanco0

Campos estáticos Utilizar campos estáticos: class SimuladorDeCaixaDeBanco { static private int númeroDoCliente = 0; private int númeroDoCaixa; SimuladorDeCaixaDeBanco(int n) { númeroDoCaixa = n; // númeroDoCliente = 0; System.out.println("Caixa "+númeroDoCaixa+" iniciou operação."); } // fim do construtor public void próximoAtendimento() { númeroDoCliente = númeroDoCliente + 1; System.out.print("Cliente com a senha número "+númeroDoCliente+", favor "); System.out.println("dirigir-se ao caixa número "+númeroDoCaixa+"."); } } // fim da classe SimuladorDeCaixaDeBanco SimuladorDeCaixaDeBanco.java para poder iniciar e atender em qualquer ordem

Campos estáticos zOutro uso de campos estáticos: declaração de constantes final static public double raizDe2 = ; impede a modificação do valor do campo

Campos estáticos zExercício: 1.Acrescentar à classe DataCons um contador de instâncias que informe quantas datas foram criadas. 2.Acrescentar à classe DataCons um método que informe quantas datas foram criadas. 3.Chamar a nova classe de DataCont. 4.Implementar a classe que testa DataCont. Nomear a nova classe DemoDataCont. 5.Testar.

Campos estáticos zExercício: Atenção: datas criadas datas existentes Para fazer um contador de datas existentes seria necessário subtrair as datas destruídas pelo coletor de lixo. O método finalize(), que é efetuado sempre que o coletor de lixo elimina uma instância poderia ser utilizado com este propósito: protected void finalize() { cont = cont-1; } Observação: não há como garantir a execução do coletor de lixo, mesmo quando invocado explicitamente. System.gc();

Métodos estáticos Métodos estáticos (métodos de classe) zPodem ser executados sem que instâncias da classe sejam criadas ymain yMétodos independentes dos campos da classe: só necessitam dos parâmetros para serem utilizados. yMétodos que funcionam sempre da mesma forma, mesmo quando aplicados à instâncias diferentes.

Métodos estáticos class ConversaoDeUnidadesDeComprimento { public static double polegadasParaCentímetros(double polegadas) { double centímetros = polegadas*2.54; return centímetros; } public static double pésParaCentímetros(double pés) { double centímetros = pés*30.48; return centímetros; } public static double milhasParaQuilômetros(double milhas) { double quilômetros = milhas*1.609; return quilômetros; } } // fim da classe ConversaoDeUnidadesDeComprimento ConversaoDeUnidadesDeComprimento

Métodos estáticos class DemoConversaoDeUnidadesDeComprimento { public static void main(String[] argumentos) { ConversaoDeUnidadesDeComprimento conv = new ConversaoDeUnidadesDeComprimento(); System.out.println("vinte pés: "+conv.pésParaCentímetros(20)+" centímetros"); System.out.println("cinco polegadas;"+conv.polegadasParaCentímetros(5)+" centímetros"); System.out.println("vinte pés :"+ ConversaoDeUnidadesDeComprimento.pésParaCentímetros(20)+ " centímetros"); System.out.println("cinco polegadas:"+ ConversaoDeUnidadesDeComprimento.polegadasParaCentímetros(5)+ " centímetros"); } // fim do método main } // fim da classe DemoConversaoDeUnidadesDeComprimento DemoConversaoDeUnidadesDeComprimento

Métodos estáticos Observações sobre o método main: zA classe que contém o método main pode conter outros métodos, que podem ser chamados pelo main. yEvitar repetição de código yEfetuar tarefas particulares Métodos chamados a partir do main devem ser obrigatoriamente estáticos!!! Campos da classe acessados pelo main devem ser obrigatoriamente estáticos!!! simplificar o código do main

Métodos estáticos Observações sobre o método main: zO método main pode ser chamado por outros métodos: uma aplicação inteira pode ser parte componente de outra aplicação. class DemoChamadaAoMain { public static void main(String[] argumentos) {... DemoConversaoDeUnidadesDeComprimento.main(argumentos);.... } // fim do método main } // fim da classe DemoChamadaAoMain

Métodos estáticos Fábrica de instâncias: são métodos que criam e retornam instâncias da própria classe. class DataComFábrica {.... public static DataComFábrica Natal(Short ano) { return new DataComFábrica ((byte) 25,(byte)12,ano); } // fim do método Natal } // fim da classe DataComFábrica

Campos estáticos zExercício: 1.Fazer o contador de instâncias da classe de DataCont ser campo estático. 2.Modificar DemoDataCont para invocar o método que informa a quantidade de datas criadas de maneira independente de instâncias. 3.Testar.