programação orientada a objetos*

98
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

Upload: gerry

Post on 05-Jan-2016

42 views

Category:

Documents


0 download

DESCRIPTION

Programação Orientada a Objetos*. Introdução Prof. Isabel Cafezeiro [email protected] 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. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Programação Orientada a Objetos*

ProgramaçãoOrientada a Objetos*

IntroduçãoProf. Isabel [email protected]://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

Page 2: Programação Orientada a Objetos*

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.

Page 3: Programação Orientada a Objetos*

Modelos

Entidade: Modelo:Componentes Dados

ComportamentoOperações

Informações propriamente ditas

Efetuam alguma tarefa sobre os dados:inicializaçãoatualizaçãoconsultadestruição

Page 4: Programação Orientada a Objetos*

Modelos

Modelos são estruturáveis !!!Entidades são compostas por outras entidades

Exemplo: Modelo RestauranteCaseiro pode conter o modelo MesaDoRestaurante

Page 5: Programação Orientada a Objetos*

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

Page 6: Programação Orientada a Objetos*

Modelos

Exemplo:

Lampada Nome do modelo

estado Dadosacende ()apaga () OperaçõesmostraDados ()

Opeações podem necessitar:parâmetro / retorno

Page 7: Programação Orientada a Objetos*

ModelosLampadainício

estado // indica se está ligada ou desligada

acende ()início estado = ligadofim

apaga ()início estado = apagadofim

mostraEstado()início se (estado == aceso)

imprime “Lâmpada acesa” senão

imprime “Lâmpada apagada” fimfim

fim

Page 8: Programação Orientada a Objetos*

Modelos

Comparação com o estilo C, Pascal:

Código descreve uma entidadeNão há necessariamente um “programa principal”

Operações e dados em um único blocoDados manipulados somente pelas operações

Dados x Fluxo de execução

Encapsulamento

Page 9: Programação Orientada a Objetos*

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

Page 10: Programação Orientada a Objetos*

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.

Page 11: Programação Orientada a Objetos*

Modelos

Exemplo:

Datadia, mês, anoinicializa (d,m,a)dataéVálida (d,m,a)mostra ()

Page 12: Programação Orientada a Objetos*

ModelosDatainício

dia,mês,ano

inicializa (d,m,a) início se dataéVálida (d,m,a)

dia = dmês = mano = a

senãodia = 0mês = 0ano = 0

fim fim

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,”/”,anofim

fim

Page 13: Programação Orientada a Objetos*

Modelos

no Pseudocódigo, observar:

Funções?Procedimentos?

Operações atualizadoras?Consultoras?

Inicializadoras? Delegação de tarefas?

Page 14: Programação Orientada a Objetos*

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

Page 15: Programação Orientada a Objetos*

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

dadosoperações

atributosmétodos

componentescomportamento

Page 16: Programação Orientada a Objetos*

ProgramaçãoOrientada a Objetos*

Reuso de classesProf. Isabel [email protected]://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

Page 17: Programação Orientada a Objetos*

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

Page 18: Programação Orientada a Objetos*

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çaA nova classe é uma extensão da classe existente.

Page 19: Programação Orientada a Objetos*

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 20: Programação Orientada a Objetos*

Delegação ou Composiçãoclass 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.

Page 21: Programação Orientada a Objetos*

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

Page 22: Programação Orientada a Objetos*

Reuso de código

Reuso de classes em POO:

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

HerançaAlunos 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 23: Programação Orientada a Objetos*

HerançaRelacionamento hierárquico entre classes:

(super)classe ou ancestral

(sub)classe ou classe herdeira

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

A subclasse pode conter atributos e métodos adicionais

mais especializada

Page 24: Programação Orientada a Objetos*

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();

Page 25: Programação Orientada a Objetos*

Herançaclass 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.javaclasses herdeiras não podem sobrepor este código.

Page 26: Programação Orientada a Objetos*

Herançaclass 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.

Page 27: Programação Orientada a Objetos*

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

Page 28: Programação Orientada a Objetos*

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();

Page 29: Programação Orientada a Objetos*

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

Page 30: Programação Orientada a Objetos*

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

Page 31: Programação Orientada a Objetos*

Hierarquia de classes em Java

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)

. . .

Page 32: Programação Orientada a Objetos*

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.

Page 33: Programação Orientada a Objetos*

Object: A raíz da hierarquiaMethod 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.

Page 34: Programação Orientada a Objetos*

Reuso e Herança1. 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 FuncionarioFuncionário.java

Page 35: Programação Orientada a Objetos*

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.

Page 36: Programação Orientada a Objetos*

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

Page 37: Programação Orientada a Objetos*

Amarração Tardia de Tipos

f1

PESSOA

psuper

Pessoa(...)

toString()

FUNCIONÁRIO

psuper

qualsalário()

pclasse

nome:“Rogerio”

identidade: 457928

nascimento: 01/12/1972

admissão: 01/12/2002

salário: 1000.00

toString()

funcionário(...)

Page 38: Programação Orientada a Objetos*

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?

Page 39: Programação Orientada a Objetos*

Amarração Tardia de Tipos

f1

PESSOA

psuper

Pessoa(...)

toString()

FUNCIONÁRIO

psuper

qualsalário()

pclasse

nome:“Rogerio”

identidade: 457928

nascimento: 01/12/1972

admissão: 01/12/2002

salário: 1000.00 toString()

funcionário(...)

pclasse

nome:“Denise”

identidade: 3454637

nascimento: 01/12/1967

p

Page 40: Programação Orientada a Objetos*

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 !!!

Page 41: Programação Orientada a Objetos*

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.

Page 42: Programação Orientada a Objetos*

Delegação X HerançaDelegaçã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.

Page 43: Programação Orientada a Objetos*

ProgramaçãoOrientada a Objetos*

Criando Aplicações em JavaProf. Isabel [email protected]://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

Page 44: Programação Orientada a Objetos*

A Aplicação em Java

Classes implementam modelos.

Aplicações ?Programa ?Sistema ?

Dinâmica da execução ?

Page 45: Programação Orientada a Objetos*

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

Page 46: Programação Orientada a Objetos*

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

Page 47: Programação Orientada a Objetos*

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.javaDemoData1.java:16: mês has private access in Data amanhã.mês = 10; ^1 error

Page 48: Programação Orientada a Objetos*

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) (1)

(2)

(2)

(3) (3)

Page 49: Programação Orientada a Objetos*

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

hoje d

Data d1;d1.inicializaData((byte)20,(byte)4,(short)2006);

C:\>javac DemoData1.javaDemoData1.java:20: variable d1 might not have been initializedd1.inicializaData((byte)20,(byte)4,(short)2006);^1 error

Erro de compilação!!! Tentativa de usar uma referência não instanciada.

Page 50: Programação Orientada a Objetos*

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.

Page 51: Programação Orientada a Objetos*

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);

Page 52: Programação Orientada a Objetos*

A Aplicação em JavaA 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

Page 53: Programação Orientada a Objetos*

A Aplicação em JavaA 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

Page 54: Programação Orientada a Objetos*

ProgramaçãoOrientada a Objetos*

ExercíciosProf. Isabel [email protected]://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

Page 55: Programação Orientada a Objetos*

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?

Page 56: Programação Orientada a Objetos*

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.

Page 57: Programação Orientada a Objetos*

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.

Page 58: Programação Orientada a Objetos*

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: http://java.sun.com/j2se/1.5.0/docs/index.html

Page 59: Programação Orientada a Objetos*

A documentação de java

Page 60: Programação Orientada a Objetos*

A documentação de java

API Specifications

Package java.lang

Package java.lang.ref

Package java.lang.reflect

Package java.util

Package java.util.prefs

Package java.util.logging

Package java.util.regex

Package java.util.jar

Package java.util.zip

Page 61: Programação Orientada a Objetos*

A documentação de javaPackage java.lang

  ....Class Summary

BooleanThe Boolean class wraps a value of the primitive type boolean in an object.

ByteThe Byte class wraps a value of primitive type byte in an object.

  ....MathThe class Math contains methods for performing basic numeric operations such as the elementary exponential, logarithm, square root, and trigonometric functions.

Page 62: Programação Orientada a Objetos*

A documentação de java

java.lang Class Math

java.lang.Object java.lang.Math

....Method Summarystatic double abs(double a)

          Returns the absolute value of a double value.static float abs(float a)

          Returns the absolute value of a float value.

....static double exp(double a)

          Returns Euler's number e raised to the power of a double value.

....static doublepow(double a, double b)

          Returns the value of the first argument raised to the power of the second argument. 

Page 63: Programação Orientada a Objetos*

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.

Page 64: Programação Orientada a Objetos*

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.

Page 65: Programação Orientada a Objetos*

ProgramaçãoOrientada a Objetos*

Construtores e SobrecargaProf. Isabel [email protected]://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

Page 66: Programação Orientada a Objetos*

Construtores

Construtores:

são métodos especiais invocados no memento da criação de instâncias;

existe um construtor padrão: não precisa ser programado;

é o primeiro método que um objeto executa: garante a inicialização correta da instância.

Page 67: Programação Orientada a Objetos*

Construtores

Exemplo:

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.javademodata1.java:5: <identifier> expected Data hoje = new; ^1 error

Erro de compilação!!! Criação da instância sem a chamada do construtor

Page 68: Programação Orientada a Objetos*

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.

Page 69: Programação Orientada a Objetos*

Construtores

Construtor 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ãoboolean falsechar espaçotipos numéricos zero do tipo

Page 70: Programação Orientada a Objetos*

Construtores

Construtores x outros métodos:

Os construtores têm o nome da classe, respeitando maiúsculas e minúsculas.

Os construtores não retornam valor (nem mesmo void). Devem ser declarados sem retorno.

Não podem ser chamados sem o new.

Page 71: Programação Orientada a Objetos*

ConstrutoresNa 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

Page 72: Programação Orientada a Objetos*

Sobrecarga de métodosA 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

Page 73: Programação Orientada a Objetos*

Sobrecarga de métodos

Possibilidade de usar o mesmo nome para métodos (com o mesmo propósito) e argumentos diferentes.

Mecanismo já existente em diversas LP’s convencionais; Mecanismo 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 !!!

Page 74: Programação Orientada a Objetos*

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

Page 75: Programação Orientada a Objetos*

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();

Page 76: Programação Orientada a Objetos*

Sobrecarga de métodos

Em Java:

O tipo do retorno não pode ser usado para identificar o método;

Sobrecarga se aplica a métodos em geral, e não somente à construtores.

Page 77: Programação Orientada a Objetos*

Construtores

A invocação de Construtores

Somente construtores podem chamar construtores (outros métodos não podem);

Se um construtor for chamado a partir de outro, esta deve ser a primeira linha de código do chamador;

Construtores são chamados pela palavra reservada this; Construtores não podem ser recursivos. A 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.

Page 78: Programação Orientada a Objetos*

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

Page 79: Programação Orientada a Objetos*

This (Auto-referência) Invocar o construtor da classe Diferenciar 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

Page 80: Programação Orientada a Objetos*

ProgramaçãoOrientada a Objetos*

Campos e Métodos EstáticosProf. Isabel [email protected]://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

Page 81: Programação Orientada a Objetos*

Campos e métodos estáticos

Campos estáticos:Campos compartilhados por todas as instâncias de

uma classe

Métodos estáticos:Métodos que podem ser executados sem que

instâncias da classe sejam criadas

Page 82: Programação Orientada a Objetos*

Campos estáticos

Campos estáticos (campos de classe)

Somente um valor é armazenado em um campo estático.

A alteração deste valor por qualquer instância afeta todas as outras instâncias da classe.

Page 83: Programação Orientada a Objetos*

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: 2006

...

campos estáticos aqui !!!

Page 84: Programação Orientada a Objetos*

Campos estáticos

Exemplo:

c1 c2 c3 c4 c5

c1 c2 c3 c4 c5

Banco com múltiplas filas Banco com fila

única

Page 85: Programação Orientada a Objetos*

Campos estáticosclass 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

Page 86: Programação Orientada a Objetos*

Campos estáticosclass DemoSimuladorDeCaixaDeBanco0 { public static void main(String[] argumentos) { SimuladorDeCaixaDeBanco0 c1 = new SimuladorDeCaixaDeBanco0(1); .... SimuladorDeCaixaDeBanco0 c5 = new SimuladorDeCaixaDeBanco0(5); c1.próximoAtendimento(); c2.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

c1 c2 c3 c4 c5

1 12

1 112

3

A alteração da senha é local à instância: não afeta as outras instâncias !!!!

Page 87: Programação Orientada a Objetos*

Campos estáticosUtilizar 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

Page 88: Programação Orientada a Objetos*

Campos estáticosUtilizar 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

Page 89: Programação Orientada a Objetos*

Campos estáticos

Outro uso de campos estáticos:declaração de constantes

final static public double raizDe2 = 1.4142135623730950488;

impede a modificação do valor do campo

Page 90: Programação Orientada a Objetos*

Campos estáticos

Exercí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.

Page 91: Programação Orientada a Objetos*

Campos estáticos

Exercí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();

Page 92: Programação Orientada a Objetos*

Métodos estáticos

Métodos estáticos (métodos de classe)

Podem ser executados sem que instâncias da classe sejam criadas

main

Métodos independentes dos campos da classe: só necessitam dos parâmetros para serem utilizados.

Métodos que funcionam sempre da mesma forma, mesmo quando aplicados à instâncias diferentes.

Page 93: Programação Orientada a Objetos*

Métodos estáticosclass 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

Page 94: Programação Orientada a Objetos*

Métodos estáticosclass 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

Page 95: Programação Orientada a Objetos*

Métodos estáticos

Observações sobre o método main: A classe que contém o método main pode conter outros

métodos, que podem ser chamados pelo main.

Evitar repetição de código Efetuar 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

Page 96: Programação Orientada a Objetos*

Métodos estáticos

Observações sobre o método main:

O 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

Page 97: Programação Orientada a Objetos*

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

Page 98: Programação Orientada a Objetos*

Campos estáticos

Exercí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.