Vous êtes sur la page 1sur 63

Introduo POO em Java

Carlos Bazilio
Depto de Cincia e Tecnologia
Plo Universitrio de Rio das Ostras
Universidade Federal Fluminense
Motivao

OO (Orientao Objetos) conhecimento


comum em Computao.
Uso da linguagem Java.
Programao Orientada Objetos
(POO)

Alternativa a Programao Procedural


Mdulos.
POO
Objetos e suas interaes com o mundo real.
Aproximao com o mundo real uma possvel
justificativa para o uso de POO.
Exemplo de Interao

Exemplo: Num banco, os objetos cliente e


atendente de caixa podem ter o seguinte
dilogo:
<cliente>: Gostaria de fazer uma retirada.
<atendente>: Qual valor?
<cliente>: R$100,00.
<atendente>: Entregue-me seu carto.
<atendente>: Digite sua senha no teclado ao lado.
<atendente>: Seu carto e sua retirada.
<cliente>: Obrigado.
POO

Existe alguma ao ou situao inadequada de


um cliente de banco?
O cliente pode no ter um nmero de conta?
O cliente pode querer consultar o preo atual da
passagem de nibus para Petrpolis?
E quanto ao atendente?
O atendente pode se recusar a responder por estar
cansado?
O atendente pode responder a uma operao de
saque com o valor convertido em bananas?
Conceito de Classe

comum esperarmos um comportamento


padro para objetos conhecidos no mundo real.
A este padro damos o nome de Classe em
POO.
Ou seja, podemos ter a Classe dos Clientes de
banco e a Classe dos Atendentes de caixa.
A cada uma dessas classes esperado um
comportamento padro.
Exemplo de Classes

Classes Cliente e Atendente e suas possveis


mensagens:
Classe ClienteBanco
RequisitaSaque, RequisitaSaldo, RequisitaExtrato,
EntregaCarto, InformaSenha, ...
Classe AtendenteCaixa
PerguntaOperao, SolicitaCarto,
RequisitaSenha, ...
Diferena entre Indivduos

Se Eu sou um cliente de banco, esperado que eu


interaja com um atendente de acordo com a classe
ClienteBanco.
Voc, sendo um cliente de banco, ter a mesma
capacidade.
Ento, num sistema bancrio, o que difere Eu de
Voc?
No mundo real, clientes de banco se diferem pelo No.
da Conta, No. da Agencia, Dados Cadastrais, ...
Caractersticas de uma Classe

Ou seja, esperado que um cliente, alm de


interagir com um atendente, tambm possua
caractersticas;
Exemplos de caractersticas (atributos) da
classe ClienteBanco:
No. da Conta, Nome, Telefone, ...
Que atributos a classe AtendenteCaixa poderia
ter?
Formato das Classes

Com isso, a classe ClienteBanco passa a ter o


seguinte formato:
Atributos: No. da Conta, Nome, Telefone, ..
Mensagens: InformaNumeroConta, InformaAgencia,
InformaOperaoDeseja, ...
Analogamente, a classe AtendenteCaixa poderia ser:
Atributos: Nome, Salrio, Tempo de Servio ...
Mensagens: SolicitaOperao, SolicitaAgencia,
SolicitaConta, ...
Conceito de Objeto

Com isso, podemos ter os seguintes clientes:


Nome: Eu; Conta: 0001; Tel: 5555-5555
Nome: Voce; Conta: 0002; Tel: 3333-3333
Cada cliente acima chamado de exemplo,
instncia ou objeto da classe ClienteBanco.
Ou seja, classe uma frma para construo
de peas; Cada pea construda um objeto
desta classe;
Java

Linguagem POO que surgiu em 1995.


Sintaxe (forma de escrita) similar linguagem C++ (linguagem
POO que uma extenso da linguagem C).
Programas Java so compilados (gerao dos bytecodes -
.class) e interpretados pela JVM (Java Virtual Machine).
Multiplataforma: um mesmo programa (objeto bytecode) pode
ser executado em diferentes plataformas.
Difuso aumentada com a popularizao da Internet e o fato de
ser multiplataforma.
LPs no-Multiplataforma

Cdigo Compilador .exe


em LP / Linux
LP Linux

Compilador .exe
LP / Windows
Windows
Java (Multiplataforma)

.class JVM
Windows

Compilador
.java
Java .class
JVM
Linux
Java (Ambiente de
Desenvolvimento)
Atravs do link (http://java.sun.com/javase/)
fazemos o download do JDK (Java Development Kit);
Escolha o kit correspondente ao seu Sistema
Operacional (Linux, Windows, ..);
Instale o kit; Como sugesto, escolha algum caminho
simples, como C:\>Java
Verifique se as seguintes variveis de ambiente
existem:
JAVA_HOME = <Caminho_escolhido_na_instalao>
Java (Ambiente de
Desenvolvimento)
Um breve histrico das verses da linguagem
Java pode ser encontrado no Wikipedia:
http://en.wikipedia.org/wiki/Java_version_histor
y
Java (Alo Mundo!)

Para ilustrar o uso do compilador, utilizaremos


o seguinte programa:

public class Principal {


public static void main(String[] args) {
System.out.println(Alo Mundo!);
}
}
Java (Alo Mundo!)

O nome do arquivo deve ter o mesmo nome da classe. Ou seja,


salve o programa do slide anterior com o nome Principal.java
em algum diretrio;
Utilize o editor de textos de sua preferncia;
No mesmo diretrio, execute o seguinte comando:
javac Principal.java
Observe que ser gerado o arquivo Principal.class (arquivo
objeto - bytecode)
Execute-o atravs do seguinte comando:
java Principal
Sistema Bancrio em C/C++

Deseja-se criar um sistema para manipulao de


contas bancrias.
Como representamos os dados de uma conta em
C/C++ (nome, cpf, nmero da conta, saldo, )?
Como definimos operaes sobre os dados de uma
conta (saldo, saque, depsito, )?
Como trabalhar com tipos de contas diferentes
(poupana, corrente, especial, )?
Analogia do
Sistema Bancrio em Java
Classes substituem as estruturas de dados que
representam os tipos de clientes
As funes e procedimentos utilizados para
manipular estas estruturas so substitudas por
mtodos dessas classes
Na classe ClienteBanco temos:
Atributos: Nome, Conta, Saldo
Mtodos: RealizaSaque, RequisitaSaldo
Como representamos uma classe em Java?
Classe ClienteBanco em Java

public class ClienteBanco {


String nome;
int conta;
float saldo;

void RealizaSaque (float s) {


saldo = saldo s;
}
float RequisitaSaldo() {
return saldo;
}
}
Classes em Java

Assim, temos um exemplo de frma (classe)


para clientes de banco em Java.
Como criamos as peas (indivduos, objetos ou
instncias) da frma ClienteBanco?
Atravs do operador new, responsvel por criar
instncias de uma classe.
Classes em Java Criao de
Instncias
public class ClienteBanco {
String nome;
int conta;
float saldo;
// RealizaSaque()
// RequisitaSaldo()
}

public class Principal {


public static void main (String arg[]) {
ClienteBanco cliente1, cliente2;

cliente1 = new ClienteBanco ();


cliente1.nome = eu; cliente1.conta = 0001;
cliente2 = new ClienteBanco ();
cliente2.nome = voce; cliente2.conta = 0002;

System.out.println (Nome do Cliente : + cliente1.nome);


System.out.println (Saldo : + cliente1.saldo);
}
}
Classes em Java - new

A palavra new um comando em Java que cria


uma instncia de uma dada classe.
Para esta criao, a classe precisa prover um
mtodo especial, chamado de construtor.
Um construtor um mtodo definido na classe
com o mesmo nome da classe.
Classes em Java - Construtor

Para que o comando new abaixo funcione:



cliente1 = new ClienteBanco (eu, 0001, 500);
cliente2 = new ClienteBanco (voce, 0002, 2000);

necessrio a existncia do seguinte
construtor:
ClienteBanco (String pNome, int pConta, float pSaldo)
{
nome = pNome;
conta = pConta;
saldo = pSaldo;
}
Classes em Java - Construtor
public class ClienteBanco {
String nome; int conta; float saldo;
// RealizaSaque() e RequisitaSaldo()

ClienteBanco (String pNome, int pConta, float pSaldo) {


nome = pNome; conta = pConta; saldo = pSaldo;
}
}

public class Principal


{
public static void main (String arg[]) {
ClienteBanco cliente1, cliente2;
cliente1 = new ClienteBanco (eu, 0001, 500);
cliente2 = new ClienteBanco (voce, 0002, 2000);
System.out.println (Nome do Cliente : +
cliente1.nome);
System.out.println (Saldo : + cliente1.saldo);
}
}
Classes em Java - Exerccios

Implementar e testar a classe ClienteBanco


dada.
Classes em Java (Construtor)

No necessrio que todos os valores dos


atributos sejam passados para o construtor.
Supondo que para a criao de uma conta
bancria seja obrigatrio o saldo mnimo de
200 dinheiros, podemos ter o seguinte
construtor:

ClienteBanco (String pNome, int pConta) {


nome = pNome;
conta = pConta;
saldo = 200;
}
Classes em Java (Construtor)
Uma alternativa para a implementao anterior
a seguinte:
ClienteBanco (String pNome, int pConta) {
this (pNome, pConta, 200); // (1)
}
Neste caso, a instruo (1) uma chamada
primeira verso do construtor;
A vantagem desta verso a reutilizao
(reuso) de cdigo (cdigo do primeiro
construtor).
O operador this faz referncia prpria classe;
mais tarde veremos um outro uso deste
operador
Classes em Java
(Construtores)
Uma classe pode ter tantos construtores quanto
necessrio:
public class ClienteBanco {
String nome; int conta; float saldo;
// RealizaSaque() e RequisitaSaldo()
ClienteBanco (String pNome, int pConta, float pSaldo) {
nome = pNome; conta = pConta; saldo = pSaldo;
}
ClienteBanco (String pNome, int pConta) {
this(pNome, pConta, 200);
}

}
Distino entre Construtores

ClienteBanco (String pNome, int pConta)


{
ClienteBanco (String pNome, int pConta, float pSaldo)
this (pNome, pConta, 200);
{
}
nome = pNome;
conta = pConta;
saldo = pSaldo;
}


cliente1 = new ClienteBanco (eu, 0001, 500);
cliente2 = new ClienteBanco (voce, 0002);

Distino entre Construtores

Nas chamadas de new, o que indicar a


chamada de um ou outro construtor?
A distino feita pelos parmetros do
construtor.
No caso anterior, o 1. construtor tem 3
parmetros, enquanto o 2. tem 2;
Construtor Padro
Uma caso extremo desta variao de
parmetros do construtor seria no termos
nenhum parmetro.
Neste caso, o construtor recebe o nome de
construtor padro.
ClienteBanco ()
{
this (Annimo, 0000, 200);
}

cliente1 = new ClienteBanco ();

Inadequado para algumas classes pela


repetio dos valores entre objetos.
Construtor Padro

Caso uma classe no oferea um construtor, a


chamada de new invocar este construtor
implicitamente.
Construtores e Mtodos

A distino entre os construtores se baseia nas


seguintes caractersticas:
Quantidade, Tipos e Ordem dos parmetros
Como o construtor um tipo especial de
mtodo, estas regras de distino tambm
valem para os mtodos em geral;
Alm destas, os mtodos tambm podem ser
distinguidos por:
Nome e Tipo de retorno do mtodo
Distino entre Mtodos
public class ClienteBanco {
String nome; int conta; float saldo; cliente1 cliente2
// Outros mtodos eu voce
void RealizaDeposito (float pValor) { 0001 0002
saldo = saldo + pValor; 500
730 2000
2400
}
void RealizaDeposito (float pValorNota, int pQuantNotas) {
RealizaDeposito(pValor*pQuantNotas);
}
public static void main (String arg[]) {
ClienteBanco cliente1, cliente2;
cliente1 = new ClienteBanco (eu, 0001, 500);
cliente2 = new ClienteBanco (voce, 0002, 2000);
cliente1.RealizaDeposito(230);
cliente2.RealizaDeposito(50, 8);
}
}
Importncia dos Mtodos
Qual a diferena entre estas 2 retiradas?
public class ClienteBanco {
void RealizaSaque (float s) {
String nome; intifconta; float saldo;
(s > saldo)
void RealizaSaque System.out.println(Saldo
(float s) { insuficiente);
saldo = saldo s;
else
} saldo = saldo s;
public static void
} main (String arg[]) {
ClienteBanco cliente1, cliente2;
cliente1 = new ClienteBanco (eu, 0001, 500);
cliente1.saldo = cliente1.saldo 100;
..
cliente1.RealizaSaque(100);
}
}
Importncia dos Mtodos

Com isso, devemos nos habituar com a


definio e uso de mtodos;
Mais adiante veremos que linguagens OO
oferecem mecanismos para obrigar este
formato de definio e uso.
Importncia dos Mtodos
Qual a diferena entre estas 2 retiradas?
public class ClienteBanco {
String nome;void RealizaSaque (float s) {
int conta;
if (s > saldo)
private float saldo;
System.out.println(Saldo
public void RealizaSaque (float s) { insuficiente);
saldo = saldo else
s;
} saldo = saldo s;
} main (String arg[]) {
public static void
ClienteBanco cliente1, cliente2;
cliente1 = new ClienteBanco (eu, 0001, 500);
cliente1.saldo = cliente1.saldo 100;
..
cliente1.RealizaSaque(100);
}
}
Operador delete?

Em Java a remoo de memria no referenciada


feita por um coletor de lixo
Com isso, no h um operador delete (dual do
operador new) para a remoo de um objeto da
memria
Entretanto, observe que:
Esta remoo realizada de forma assncrona, ou seja, no
temos controle sobre o momento de sua realizao
No h liberao de outros recursos, como fechamento de
arquivos ou conexo banco de dados; ou seja, isso
tarefa do programador
Operador delete?

Seguindo comparao com C++, como no


temos o operador delete, tambm no temos os
mtodos destrutores
Recursos alocados um objeto podero ser
liberados no bloco finally (a ser apresentado
junto com Excees) ou sobrecarregando o
mtodo finalize() da classe java.lang.Object
Manipulao de Variveis na
Memria
Em Java, tipos primrios (p. ex., int, boolean,
float, double, char, ...) so alocados
estaticamente (na pilha)
Os objetos (p. ex., Integer, String,
ContaBancaria, ...), diferentemente, so
alocados no heap i

int i = 10; 00001 10

cliente
ContaCC cliente =
00100 10000
new ContaCC (eu, 1, 50000);

10000 eu 1 50000
Manipulao de Variveis na
Memria
cliente

ContaCC cliente = 00100 10000


new ContaCC (eu, 1, 50000);
10000 eu 1 50000
ContaCC cliente2 = cliente;
cliente2
00104 10000
ContaCC cliente3 =
cliente3
new ContaCC (voce, 2, 8000);
00108 10000
10100

cliente3 = cliente;
10100 voce 2 8000
Passagem de Parmetros
Mtodos
Esta forma de manipulao tem relao direta
com a passagem de parmetros
Em Java, a passagem de parmetros feita
por valor
Ou seja, quando as variveis passadas tem tipo
primrio, copiado o valor armazenado na
varivel
Quando a varivel contm um objeto, copiado
o endereo para o qual a varivel aponta
Passagem de Parmetros
Mtodos

public class X {
public static void triplo (double v) {
v = 3 * v;
}
public static void main (String arg[]) {
double valor = 1000;
X.triplo(valor);
System.out.println(Valor = + valor);
}
}
Valor = 1000
Passagem de Parmetros
Mtodos

public class X {
public static void triplo (ContaCC c) {
c.setSalario (3 * c.getSalario());
}
public static void main (String arg[]) {
ContaCC cliente = new ContaCC (eu, 1, 1000);
X.triplo(cliente);
System.out.println(Valor = + cliente.getSalario());
}
}
Valor = 3000
Exerccio

Implementar um mtodo para realizar a


operao de transferncia entre contas.
Codifique este e os outros mtodos, compile,
execute e compare as sadas das verses sem
e com o desconto do CPMF.
Soluo do Exerccio de
Transferncia entre Contas s/
Desconto

class ClienteBanco {
String nome; int conta; float saldo;
void TransferirOutraConta (float pValor,
ClienteBanco pBeneficiado) {
RealizaSaque(pValor);
pBeneficiado.RealizaDeposito(pValor);
}
public static void main (String arg[]) {
ClienteBanco cliente1, cliente2;
cliente1 = new ClienteBanco (eu, 0001, 500);
cliente2 = new ClienteBanco (voce, 0002, 2000);
cliente1.TransferirOutraConta(100,cliente2);
}
}
Soluo do Exerccio de
Transferncia entre Contas c/
Desconto

public class ClienteBanco {



void TransferirOutraConta (float pValor,
ClienteBanco pBeneficiado) {
RealizaSaque(pValor*(1 - taxa_CPMF));
pBeneficiado.RealizaDeposito(pValor*(1 - taxa_CPMF));
}
}
Identificando Atributos
Considere o mtodo de transferncia entre
contas sem chamadas a mtodos:
public class ClienteBanco {

void TransferirOutraConta (float pValor,
ClienteBanco pBeneficiado) {
saldo = saldo - pValor;
pBeneficiado.saldo = pBeneficiado.saldo + pValor;
}
}

A quem pertence o atributo saldo usado na


subtrao?
Identificando Atributos
Esta pergunta respondida observando a chamada
ao mtodo; cliente1 cliente2
eu voce
public class ClienteBanco { 0001 0002
String nome; int conta; float saldo; 500 2000
void TransferirOutraConta (float pValor,
ClienteBanco pBeneficiado) {
saldo = saldo - pValor;
pBeneficiado.saldo = pBeneficiado.saldo + pValor;
}
public static void main (String arg[]) {
ClienteBanco cliente1, cliente2;
cliente1 = new ClienteBanco (eu, 0001, 500);
cliente2 = new ClienteBanco (voce, 0002, 2000);
cliente1.TransferirOutraConta(100,cliente2);
}
}
Identificando Atributos
cliente1
public class ClienteBanco { eu
String nome; int conta; float saldo; 0001
500
void TransferirOutraConta (float pValor,
ClienteBanco pBeneficiado) {
this.saldo = this.saldo - pValor;
pBeneficiado.saldo = pBeneficiado.saldo + pValor;
}
public static void main (String arg[]) {
ClienteBanco cliente1, cliente2;
cliente1 = new ClienteBanco (eu, 0001, 500);
cliente2 = new ClienteBanco (voce, 0002, 2000);
cliente1.TransferirOutraConta(100,cliente2);
}
}
Atributos estticos

H situaes onde o valor de um atributo deve


ser compartilhado entre todas as instncias de
uma classe;
Exemplo: O valor da taxa CPMF cobrada por
movimentaes bancrias;
Nestas situaes utilizamos atributos estticos;
Ou seja, atributos cujos valores sero
constantes para todas as instncias de uma
classe.
Atributos estticos

public class ClienteBanco {


String nome;
int conta;
float saldo;
static float taxa_CPMF = 0.01F; // Exemplo: 1%

void RealizaDeposito (float pValor) {


saldo = saldo + pValor*(1 - taxa_CPMF);
}
}
Mtodos Estticos

Analogamente aos atributos estticos, podemos ter


comportamentos que devem ser nicos (independente do
objeto) em uma classe
Por exemplo, um mtodo para exibir dados estatsticos das
contas: quantidade de clientes, volume de dinheiro total, etc.
Ou seja, no faz sentido um objeto retornar uma consulta sobre
um conjunto no qual ele est inserido
Nestas situaes utilizamos mtodos estticos
Em livros costumamos encontrar os termos mtodo de classe
(esttico) e mtodos de instncia (mtodos comuns, aplicados
a objetos)
Mtodos Estticos
public class ClienteConta {
private String nome;
private int conta;
private float saldo;
private static float taxa_cpmf;
private static int qtd_clientes = 0;

ClienteConta (String pNome, int pConta, float pSaldo) {


nome = pNome; conta = pConta; saldo = pSaldo;
qtd_clientes++;
}
public static int QuantidadeClientes () {
return qtd_clientes;
}
} public class Principal {
public static void main(String[] args) {
ClienteCC cliente1 = new ClienteCC(eu, 1, 5000, 500);
System.out.println(Quantidade de clientes: +
ClienteConta.QuantidadeClientes());
}
}
Gerao de Documentao

Java possui uma ferramenta para gerao de


documentao das classes chamada Javadoc
Esta ferramenta gera documentao no formato html
Para tal, temos que comentar nossas classes de
forma particular
Os comentrios estaro sempre entre as seguintes
marcaes:
/** Comentrio Javadoc */
Dentro destas marcaes teremos tags (palavras-chave
prefixadas com o smbolo @)
Gerao de Documentao
/**
* Classe que apresenta estrutura bsica de uma conta
* bancria
* @author bazilio
*/
public class ClienteConta {
private String nome;
private int conta;
private float saldo;

/**
* Construtor da classe Conta
* @param pNome Nome do cliente
* @param pConta Nmero da conta
* @param pSaldo Saldo inicial do cliente
*/
ClienteConta (String pNome, int pConta, float pSaldo) {
nome = pNome; conta = pConta; saldo = pSaldo;
}
}
Gerao de Documentao
Gerao de Documentao
Gerao de Documentao
Mtodos
Cada comentrio deve preceder imediatamente
o mtodo que descreve
Tags comuns:
@param <nome-param> <descrio>
@return <descrio>
@throws <descrio da exceo gerada>
Naturalmente, estas tags devem ser utilizadas
quando adequado (p. ex, @return somente
quando o mtodo no void)
Gerao de Documentao
Classes
Cada comentrio deve preceder imediatamente
a classe que descreve
Tags comuns:
@author <nome-do-autor>
@version <descrio-da-verso>
@since <verso-de-introduo-classe>
@deprecated <classe-no-recomendada>
P. ex.,
http://java.sun.com/javase/6/docs/api/java/util/Date.html
Gerao de Documentao
Classes
Tags comuns:
@see <link-para-outra-seo-afim>
Uso mais comum para fazer referncia outras classes
e/ou mtodos de outras classes
P.ex.: @see java.lang.String#concat(String)
Ou seja, @see <nome-do-pacote>#<assinatura-do-
mtodo>

Vous aimerez peut-être aussi