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
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:
Componentes
Dados
Informações propriamente ditas
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 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:
Lampada
estado
acende ()
apaga ()
mostraDados ()
Nome do modelo
Dados
Operações
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
fim
mostraEstado()
início
se (estado == aceso)
imprime “Lâmpada acesa”
senão
imprime “Lâmpada apagada”
fim
fim
Modelos
Comparação com o estilo C, Pascal:
Código descreve uma entidade
Não há necessariamente um “programa principal”
Dados x Fluxo de execução
Operações e dados em um único bloco
Dados manipulados somente pelas operações
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
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,”/”,ano
fim
fim
Modelos
no Pseudocódigo, observar:
Funções?
Procedimentos?
Operações atualizadoras?
Consultoras?
Inicializadoras?
Delegação de tarefas?
Orientação a Objetos
Modelos
representação
abstrata da
realidade
Entidades
do mundo
real
Classes
representação
computacional de entidades
descritas pela classe
Instâncias da
classe: objetos
Orientação a Objetos
Modelos
representação
abstrata da
realidade
dados
operações
Entidades do
mundo real
componentes
comportamento
Classes
atributos
métodos
representação
computacional de entidades
descritas pela classe
Instâncias da
classe: objetos
Programação
Orientada a Objetos*
Reuso de classes
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
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
class RegistroAcademicoDeGraduacao
{
private String nomeDoAluno;
private Data dataDeNascimento;
private int númeroDeMatrícula;
delegação: campos que são instâncias de
classes. São manipulados da mesma forma que
tipos nativos
RegistroAcademicoDeGraduacao(String n,Data d,int m) {
nomeDoAluno = n;
dataDeNascimento = d;
Chamada implícita do método tostring da
númeroDeMatrícula = m;
classe Data. A classe
}
RegistroAcademicoDeGraduacao delega à
classe Data a formatação de seus dados.
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 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
A subclasse herda da classe:
mais especializada
todos os campos
todos os métodos
A subclasse pode conter atributos e métodos adicionais
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
classes herdeiras não podem
sobrepor este código.
Pessoa.java
Herança
class Funcionario extends Pessoa {
private DataCons admissão;
private float salário;
especifica a herança.
nome e idade são
privados em Pessoa:
mesmo nas subclasses
devem ser acessados
através dos serviços
oferecidos.
Funcionario(String nome,int id,DataCons nasc,
DataCons adm,float sal) {
super(nome,id,nasc);
admissão = adm;
O construtor desta classe delega ao
salário = sal;
construtor da superclasse a tarefa de
}
inicializar os dados herdados.
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
toString desta classe delega
a toString da superclasse a
impressão de seus dados.
Sintaxe diferente para
invocar construtor ou método
da superclasse.
Funcionário.java
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);
Funcionário herda as
}
operações de Pessoa
}
Empresa.java
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;
a herança é transitiva
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
Herança
Pessoa
nome,identidade,nascimento
Pessoa(n,i,nasc);
toString();
PacienteDeClínica
planoDeSaúde
PacienteDeClínica(n,i,nasc,plano);
toString();
Funcionário
admissão,salário
Funcionário(n,i,nasc,adm,sal);
qualSalário();
toString();
A herança é uma hierarquia:
da raiz para as folhas;
sem relacionamento entre irmãos.
Não há herança múltipla
ChefeDeDepartamento
departamento, promoçãoAChefe
ChefeDeDepartamento(n,i,nasc,adm,sal,dep,prom);
qualDepartamento();
toString();
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.UnicodeBlock
oclass 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)
...
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.
Object: A raíz da hierarquia
Method Summary
protected O
bject
boolean
clone()
Creates and returns a copy of this object.
equals(Object obj)
Indicates whether some other object is "equal to" this one.
protected v
oid
Class
finalize()
Called by the garbage collector on an object when garbage collection determines that there are no more references to the object.
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.
Reuso e Herança
1.
2.
3.
4.
5.
6.
Campos da superclasse que não sejam
privados podem ser utilizados
diretamente.
Campos privados da superclasse
devem ser usados através dos
serviços oferecidos pela superclasse.
Construtores da superclasse podem
ser utilizados através da palavra
super.
Somente os Construtores da
superclasse imediata podem ser
utilizados diretamente.
Métodos da superclasse que não
sejam privados podem ser utilizados
diretamente.
Métodos sobrepostos da superclasse
que não sejam privados podem ser
utilizados através da palavra super.
class Funcionario extends Pessoa {
private Data admissão;
private float salário;
Funcionario(String nome,int id,Data
nasc,Data adm,float sal) {
super(nome,id,nasc);
(3)
admissão = adm;
salário = sal;
}
public String toString() {
(6)
return super.toString()+"\n"+
"Data de admissão: "+admissão+
"\n" + "Salário: "+salário;
}
final public float qualSalário() { return
salário; }
} // fim da classe Funcionario
Funcionário.java
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();
instância de Pessoa, método de Pessoa
Funcionario f1 =
new Funcionario ("Rogerio", 93452128 ,d2 ,d3 ,(float)1000.00);
s = f1.qualSalário();
i = f1.qualIdentidade();
instância de Funcionário, método de
System.out.println(f1);
Pessoa
}
}
Empresa.java
Amarração Tardia de Tipos
pclasse
nome:“Rogerio”
f1
identidade:
457928
nascimento:
01/12/1972
admissão:
01/12/2002
salário: 1000.00
PESSOA
psuper
Pessoa(...)
toString()
FUNCIONÁRIO
psuper
funcionário(...)
qualsalário()
toString()
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);
referência de Pessoa passa a apontar
para instância de Funcionário
invoca toString de Pessoa? de Funcionário?
EmpresaDin.java
Amarração Tardia de Tipos
pclasse
p
nome:“Denise”
pclasse
identidade:
3454637
nascimento:
01/12/1967
nome:“Rogerio”
f1
identidade:
457928
nascimento:
01/12/1972
admissão:
01/12/2002
salário: 1000.00
PESSOA
psuper
Pessoa(...)
toString()
FUNCIONÁRIO
psuper
funcionário(...)
qualsalário()
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 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.
Programação
Orientada a Objetos*
Criando Aplicações em Java
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
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
prevêem e disponibilizam os
serviços a serem oferecidos
pela classe
contrato
programadores
usuários
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)
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
Recomenda-se: main: o único método de uma 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();
Erro de compilação! Tentativa de acesso a campo
privado.
amanhã.mês = 10;
} // fim do método main
} // fim da classe DemoData
C:\>javac DemoData1.java
DemoData1.java:16: mês has private access in Data
amanhã.mês = 10;
^
1 error
DemoData1.java
A Aplicação em Java
Para usar um objeto da classe:
1.
2.
3.
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( );
(1)
(3)
Data hoje = new Data( );
(2)
(1)
(3)
A Aplicação em Java
É possível criar múltiplas referências à instâncias:
Data hoje,d;
hoje = new Data( );
hoje.inicializaData((byte)20,(byte)4,(short)2006);
d = hoje;
20/04/2006
hoje
d
Referências que não são associadas à instâncias não
podem ser usadas:
Erro de compilação!!! Tentativa
Data d1;
de usar uma referência não
d1.inicializaData((byte)20,(byte)4,(short)2006);
instanciada.
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
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);
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)
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
System.out.println(dia+"/"+mês+"/"+ano);
Data.java
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
[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
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: http://java.sun.com/j2se/1.5.0/docs/index.html
A documentação de java
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
A documentação de java
Package 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.
A documentação de java
java.lang
Class Math
java.lang.Object java.lang.Math
....
Method Summary
static 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.
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
[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
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.
Construtores
 Exemplo:
Data d = new Data();
declaração de referência para a
classe Data
criação da instância
associação da
referência à instância
Data d = new;
Erro de compilação!!! Criação da
instância sem a chamada do
construtor
invocação do construtor
Data()
C:\>javac demodata1.java
demodata1.java:5: <identifier> expected
Data hoje = new;
^
1 error
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
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
boolean
char
tipos numéricos
valor padrão
false
espaço
zero do tipo
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.
Construtores
Na classe Data:
eliminar o método inicializaData,
criar inicializações adequadas usando construtores.
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
DataCons.java
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(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
DataCons.java
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 !!!
Sobrecarga de métodos
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
DataCons.java
Sobrecarga de métodos
byte b = 4;
int i = 4;
hoje.alteraDia(b);
hoje.mostraData();
Efetua alteraDia(byte d)
hoje.alteraDia(i);
hoje.mostraData();
Efetua alteraDia(int d)
hoje.alteraDia(4);
hoje.mostraData();
Efetua alteraDia(int d)
DemoDataCons.java
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.
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.
Construtores
A invocação de Construtores
DataCons(DataCons outraData)
{
this(outraData.dia,outraData.mês,outraData.ano);
} // fim do método DataCons
• comparar com o
construtor da
transparência 8
• verificar que
esta chamada
invoca o
construtor da
transparência 7
DataCons.java
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) {
variáveis locais com o mesmo
if (dataÉVálida(dia,mês,ano))
nome do que os campos
{
this.dia = dia; this.mês = mês; this.ano = ano;
}
else
this diferencia variáveis locais
e campos
{
this.dia = 0; this.mês = 0; this.ano = 0;
}
} // fim do método DataCons
Programação
Orientada a Objetos*
Campos e Métodos Estáticos
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
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
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.
Campos estáticos
pclasse
DataCons
dia: 4
psuper
mês: 5
DataCons( ...)
ano: 2006
DataCons( ...)
...
...
hoje
amanhã
pclasse
retornaDia( )
dia: 4
...
mês: 5
ano: 2006
campos estáticos aqui !!!
Campos estáticos
Exemplo:
c1
c1
c2
c3
c4
c2
c3
c4
c5
c5
Banco com múltiplas
filas
Banco com fila única
Campos estáticos
class SimuladorDeCaixaDeBanco0
{
private int númeroDoCliente;
private int númeroDoCaixa;
Exemplo: Caixa de banco
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
Campos estáticos
class DemoSimuladorDeCaixaDeBanco0
Exemplo: Caixa
{
public static void main(String[] argumentos)
banco
{
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();
c1
c2
c3
c4
c5
1
1
2
3
1
1
1
2
de
A alteração da
senha é local à
instância: não
afeta as outras
instâncias !!!!
} // fim do método main
} // fim da classe DemoSimuladorDeCaixaDeBanco0
DemoSimuladorDeCaixaDeBanco0.java
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
Sobrecarregar o método
próximoAtendimento() na
classe
SimuladorDeCaixaDeBanco0
DemoSimuladorDeCaixaDeBanco01.java
Campos estáticos
Utilizar campos estáticos:
class SimuladorDeCaixaDeBanco
{
static private int númeroDoCliente = 0;
private int númeroDoCaixa;
para poder iniciar e atender
SimuladorDeCaixaDeBanco(int n)
em qualquer ordem
{
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
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
Campos estáticos
 Exercício:
1.
2.
3.
4.
5.
Acrescentar à classe DataCons um contador de instâncias que
informe quantas datas foram criadas.
Acrescentar à classe DataCons um método que informe
quantas datas foram criadas.
Chamar a nova classe de DataCont.
Implementar a classe que testa DataCont. Nomear a nova
classe DemoDataCont.
Testar.
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();
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.
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:
 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
simplificar o código do main
Métodos chamados a partir do main devem ser obrigatoriamente
estáticos!!!
Campos da classe acessados pelo main devem ser obrigatoriamente
estáticos!!!
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
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
 Exercício:
1.
2.
3.
Fazer o contador de instâncias da classe de DataCont ser
campo estático.
Modificar DemoDataCont para invocar o método que informa a
quantidade de datas criadas de maneira independente de
instâncias.
Testar.
Download

Modelo