Você está na página 1de 42

Reviso: Orientao a Objetos e Java

Modelos
Abstraes do mundo real Como um objeto ou mecanismo do mundo real funciona?
Quais so as informaes (atributos) que ele representa? Que aes podemos executar com estas informaes?

Limites de modelos

Orientao a Objetos
Paradigma de programao onde:
Modelamos coisas do mundo real para que possam ser processadas por programas de computador. Descrevemos modelos atravs de seus atributos (dados) e operaes.

Criamos classes a partir destes modelos usando uma linguagem de programao orientada a objetos. Criamos instncias destas classes para processamento dos seus dados. Algum cria as classes, algum usa as classes em suas aplicaes.

Encapsulamento
Oculta dados para que estes sejam processados somente da forma planejada. Uma interface existe para uso da classe que encapsula os dados. Algumas operaes tambm podem ser ocultadas do usurio da classe.

UML
Unified Modeling Language
Esquemas para representao de classes e sua interao Nome da Diagrama de classes: Classe

CartaoDePonto
-cdigo:int -horasTrab:int -valorHora:float +marcaEntrada(Hora ):voi d +marcaSada(Hora): void +calculaSalrio(): float

Campos da Classe (atributos ou dados) Mtodos da Classe (operaes)

Codificao em Java
CartaoDePonto
-cdigo:int -horasTrab:int -valorHora:float +marcaEntrada(Hora ):voi d +marcaSada(Hora): void +calculaSalrio(): float
Esqueleto de uma classe: no contm o que os mtodos fazem.
/** * Esta a classe CartaoDePonto. Representa os dados * de um carto de ponto de um trabalhador em um * determinado dia. */ public class CartaoDePonto { private int cdigo; private int horasTrabalhadas; private float valorHora; public void marcaEntrada(Hora agora) { // registra a hora de entrada } public void marcaSada(Hora agora) { // registra a hora de sada } public float calculaSalrio() { // calcula e retorna o salrio } }

Codificao em Java
Nomes de classes:
Seguem padro UsaMaiusculasEmCadaPalavra No devem ter acentos Nome da classe + .java = nome do arquivo Padro: public class MinhaClasse
Deve ser declarada no arquivo MinhaClasse.java

Codificao em Java
Modificadores de acesso:
public: permite que o campo ou mtodo seja acessado de outra classe. private: o campo ou mtodo somente pode ser acessado da classe que o contm Normalmente campos so todos private (encapsulamento) e mtodos so todos public. Classes devem ser public.

Codificao em Java
Tipos de dados para representao de atributos:
boolean, char, short, int, long, float, double: tipos nativos String: classe que pode ser usada como tipo nativo void: no um tipo, usado para indicar que um mtodo no retorna nada

Codificao em Java
Nomes de campos
Seguem padro comeaEmMinsculas Podem conter acentos Somente um tipo por campo Vrios campos do mesmo tipo podem ser declarados ao mesmo tempo Exemplos:
private int nmeroDePessoas; public boolean Bolsista; public String nomeDoAluno; public byte dia,ms; public float nota1,nota2,nota3;

Codificao em Java
Nomes de mtodos
Seguem padro comeaEmMinsculas Podem conter acentos Podem ter ou no argumentos (entre parnteses)
Se no houver argumentos, usar parnteses sem nada

Devem ter um nico tipo de retorno ou void


Se houver tipo de retorno diferente de void, deve retornar um valor do tipo declarado

Exemplos:
private int calculaFatorial() public void setBolsista(boolean Bolsista) public boolean getBolsista() public float mdia(float nmero1,float nmero2)

Codificao em Java
Assinatura de um mtodo
Nome do mtodo mais argumentos Somente mtodos com assinaturas compatveis podem ser executados
int pode ser visto como long, float, double float pode ser visto como double double no pode ser visto como int, etc.

Assinaturas incompatveis causam erros de compilao

public static void main(String[] args)


Mtodo mgico, permite que uma classe seja executada como um programa.

Escrevendo Mtodos
Todo o processamento feito dentro de mtodos
Declarao de variveis locais (da mesma forma que campos mas sem modificadores de acesso) Criao de instncias se necessrias Laos, decises, entrada e sada

Sobrecarga
Podemos ter mtodos com o mesmo nome mas assinaturas diferentes
public float calculaSalrioDoDia() { // assume que foram trabalhadas oito horas } public float calculaSalrioDoDia(int horas) { // usa o nmero de horas dado como argumento } public float calculaSalrioDoDia(int horas,int minutos) { // usa o nmero de horas e minutos dados como argumento }

Exemplo: System.out.println

Arrays
Arrays de dados
Podem ser usados como campos, argumentos, variveis, etc. Contm vrios dados do mesmo tipo com um nico nome ndices permitem acesso a dados individuais Devem ser alocados
int[] idades = new int[20]; idades[6] = 23; boolean[] bolsistas; bolsistas = new boolean[50]; bolsistas[32] = true; double[] salrios; salrios[0] = 10000;

Instanciando Classes
Quando precisamos de uma instncia de uma classe:
NomeDaClasse nomeDaInstncia = new NomeDaClasse();

Podemos declarar para instanciar depois:


NomeDaClasse instncia1,instncia2,instncia3; instncia1 = new NomeDaClasse(); instncia3 = new NomeDaClasse();

Somente podemos executar mtodos de classes instanciadas (exceto static):


instncia1.umMtodo(); // OK instncia2.umMtodo(); // Erro de execuo

Mtodos Estticos
So declarados com a palavra-chave static
public static int entraValor(int mnimo,int mximo) { // Corpo do mtodo }

Funcionam como subrotinas Suas classes no precisam ser instanciadas para que os mtodos sejam executados Podem ser usadas em pequenas aplicaes onde a criao de classes no seja necessria ou justificvel

Exemplo
public class ContaBancaria { private String nome; private float saldo; public void deposita(float valor) { saldo = saldo + valor; } public void retira(float valor) { if (saldo >= valor) saldo = saldo - valor; public class DemoContaBancaria } { public float saldo() public static void main(String[] args) { { return saldo; ContaBancaria exPrefeito = new ContaBancaria(); } exPrefeito.deposita(100.0f); } exPrefeito.retira(50.0f); exPrefeito.deposita(1200.0f); System.out.println("O saldo do ex-prefeito "+ exPrefeito.saldo()); // 1250.0 ContaBancaria exSenador = new ContaBancaria(); exSenador.deposita(2200.0f); exSenador.retira(120.0f); System.out.println("O saldo do ex-senador "+ exSenador.saldo()); // 2080.0 } }

Classe que representa um conceito (modelo) Aplicao que usa outras classes

Construtores
O que seria retornado com:
ContaBancaria exPrefeito = new ContaBancaria(); System.out.println("O saldo do ex-prefeito "+ exPrefeito.saldo());

Campos no inicializados so iguais a zero (ou null ou false) Se quisermos inicializar algo antes de poder usar a classe, devemos criar construtores Mtodos iguais aos outros exceto que:
No devem retornar nada, nem mesmo null Devem ter exatamente o mesmo nome da classe

Construtores
public class ContaBancaria { private String nome; private float saldo; public ContaBancaria(String n,float s) { nome = n; saldo = s; } public void deposita(float valor) { saldo = saldo + valor; }

O construtor sempre o primeiro mtodo a ser executado em uma classe. executado quando criamos a instncia com new Garante que no podemos criar instncias sem passar argumentos previstos na classe

public void retira(float valor) { if (saldo >= valor) public class DemoContaBancaria saldo = saldo - valor; { } public static void main(String[] args) { public float saldo() ContaBancaria exPrefeito = new ContaBancaria(); { ContaBancaria exSenador = return saldo; } new ContaBancaria("Senador X",1200f); } } }

Condicionais: if/else
Expresses que definem caminhos de execuo nos mtodos if(expresso booleana) comandos; if(expresso booleana) { comandos; }
if (saldo >= valor) saldo = saldo - valor;

if(expresso booleana) { comandos; } else { comandos; }


if (saldo >= valor) saldo = saldo - valor; else System.out.println("No tem saldo.");

Expresses booleanas
Valores booleanos: true e false Expresses de comparao:
Numricas
a > b; a < b; a >= b; a <= b; a == b; a != b

Booleanas
a == true (mesmo que a); b == false (mesmo que !b)

Comparao de Strings
a.equals(b)

Combinaes:
e lgico: && ou lgico: || no lgico: !

Condicionais:switch
Seleciona uma entre vrias opes e executa comandos
Argumento sempre um enumervel case: corresponde a uma das opes break: evita que comandos de case seguintes sejam executados public byte diasNoMs(int ms) { default: ser executado byte dias; se nenhum case tiver a switch(ms) { opo correta case 2: dias = 28; break;
case 4: case 6: case 9: case 11: dias = 30; break; default: dias = 31; } return dias; }

Laos: while
while(condio booleana) { comandos; }
public static int entraValor(int mnimo,int mximo) { int valor = mnimo-1; while((valor < mnimo) || (valor > mximo)) { String input = JOptionPane.showInputDialog("Entre um valor entre "+ mnimo+" e "+mximo); valor = Integer.parseInt(input); } return valor; }

public static void main(String[] args) { int valor = entraValor(10,20); System.out.println(valor); }

Laos: for
for(inicializao;verificao;atualizao) { comandos; } Muito til para contadores
public static long fatorial(int valor) { long resultado = 1; for(int contador=1;contador<=valor;contador++) { resultado = resultado * contador; } return resultado; } public static void main(String[] args) { long valor = fatorial(15); // 1307674368000 System.out.println(valor); }

Associao, Agregao e Composio


Representam relaes entre objetos
Associao: um objeto associado a outro e pode mandar mensagens para este. Agregao: representa relaes parte/todo, onde uma parte no pode conter um todo. A parte pode existir independentemente do todo. Composio: representa relaes parte/todo onde a parte geralmente controlada pelo todo.

Nem sempre a distino clara !

Referncia: http://ootips.org/uml-hasa.html

Exemplo: Relao 1 para 1

public class Motor { private float potncia; private String combustvel; public Motor(float pot,String comb) { potncia = pot; combustvel = comb; } public void imprimeDados() { System.out.println("Motor: com "+potncia+" cavalos, "+ "movido a "+combustvel); } }

Exemplo: Relao 1 para 1

public class Automovel { private String modelo; private short ano; private Motor motor; public Automovel(String mod,short a,Motor mot) { modelo = mod; ano = a; motor = mot; } public void imprimeDados() { System.out.println("Modelo:"+modelo); System.out.println("Ano:"+ano); motor.imprimeDados(); } }

Exemplo: Relao 1 para 1


public class TesteAutomovel { public static void main(String[] args) { Motor motFusca = new Motor(47f,"gasolina"); Automovel fusca66 = new Automovel("Fusca",(short)1966,motFusca); fusca66.imprimeDados(); Automovel beetle2002 = new Automovel("New Beetle",(short)2002, new Motor(150f,"gasolina")); beetle2002.imprimeDados(); } }

Exemplo: Relao 1 para N (1..*)

Para cada pedido podemos ter N instncias de Item Podemos declarar N instncias da classe Item na classe Pedido
Como saber o valor de N quando escrevemos a classe Pedido?

Podemos usar arrays Podemos usar a classe Vector

Usando a classe Vector


import java.util.Vector;
... Vector v = new Vector(); String nome1 = "Bigus"; String nome2 = "Petchel"; String nome3 = "Buckland"; v.add(nome1); v.add(nome2); v.add(nome3); v.add("Witten"); System.out.println(v); // [Bigus, Petchel, Buckland, Witten] System.out.println(v.size()); // 4 String segundo = (String)v.elementAt(1); // Petchel v.removeElementAt(1); String terceiro = (String)v.elementAt(2); // Witten for(int elemento=0;elemento<v.size();elemento++) { System.out.println((elemento+1)+" -> "+v.elementAt(elemento)); } String ltimo = (String)v.elementAt(v.size()); // Exceo !

Exemplo: Relao 1 para N (1..*)


public class Data { private byte dia,ms; private short ano; public Data(byte d,byte m,short a) { dia = d; ms = m; ano = a; } public void imprime() { System.out.println("Data: "+dia+"/"+ms+"/"+ano); } }

Exemplo: Relao 1 para N (1..*)


public class Item { private int cdigo; private int quantidade; private float preoUnitrio; public Item(int cod,int quant,float preo) { cdigo = cod; quantidade = quant; preoUnitrio = preo; } public void imprime() { System.out.println("Item: cdigo "+cdigo+", "+ quantidade+" unidades a "+ preoUnitrio+" cada."); } public float custoTotal() { return quantidade*preoUnitrio; } }

Exemplo: Relao 1 para N (1..*)


import java.util.Vector; public class Pedido { private int nmero; private int vendedor; private Data dia; private Vector lista; public Pedido(int n,int v,Data d,Item primeiro) { nmero = n; vendedor = v; dia = d; lista = new Vector(); adicionaItem(primeiro); }

Exemplo: Relao 1 para N (1..*)


public void adicionaItem(Item i) { lista.add(i); } public float calculaTotal() { float total = 0f; for(int qual=0;qual<lista.size();qual++) { Item umItem = (Item)lista.elementAt(qual); total = total + umItem.custoTotal(); } return total; }

Exemplo: Relao 1 para N (1..*)


public void imprime() { System.out.println("Pedido #"+nmero+" do vendedor +vendedor); dia.imprime(); System.out.println("Itens:"); for(int qual=0;qual<lista.size();qual++) { Item umItem = (Item)lista.elementAt(qual); System.out.print(" * "); umItem.imprime(); } System.out.println("Total do pedido: "+calculaTotal()); } }

Exemplo: Relao 1 para N (1..*)


public class TestePedido { public static void main(String[] args) { Data hoje = new Data((byte)19,(byte)10,(short)2003); Item Item Item Item i1 i2 i3 i4 = = = = new new new new Item(1215,10, 9.45f); Item(1217, 1,21.00f); Item(1223, 1,22.05f); Item(1249, 3,50.95f);

Pedido p = new Pedido(1,3,hoje,i1); p.adicionaItem(i2); p.adicionaItem(i3); p.adicionaItem(i4); p.imprime(); } }


Pedido #1 do vendedor 3 Data: 19/10/2003 Itens: * Item: cdigo 1215, 10 unidades a 9.45 cada. * Item: cdigo 1217, 1 unidades a 21.0 cada. * Item: cdigo 1223, 1 unidades a 22.05 cada. * Item: cdigo 1249, 3 unidades a 50.95 cada. Total do pedido:290.40002

Herana
Agregao, associao e composio: relaes usa ou contm Herana: relaes -um-tipo-de
Reutilizamos classes j existentes e descrevemos as diferenas Tambm conhecida como relao de especializao/generalizao Classe herdeira herda todos os campos e mtodos mas s pode acessar os pblicos
ClasseAncestral ClasseHerdeira

Herana: Exemplo
ContaBancaria
+ + + + + n omeCo rrentista: String s aldo: double C ontaB ancaria(String,double) d eposi ta(double):void r etira (double):void g etSal do():double g etNom e():String

ContaEspecial
- l imite: double + C ontaEspecial(String,doubl e,double) + g etSaldo():double

Classe ContaEspecial herdar todos os mtodos de ContaBancaria menos o construtor Conta especial simulada como tendo saldo adicional (limite) Problema: mtodo getSaldo() de ContaBancaria no serviria para ContaEspecial! Soluo: sobreposio do mtodo.

Herana: Exemplo
public class ContaBancaria { private String nomeCorrentista; private double saldo; public ContaBancaria(String n,double s) { nomeCorrentista = n; saldo = s; } public double getSaldo() { return saldo; } public String getNome() { return nomeCorrentista; } public void deposita(double quantia) { saldo = saldo + quantia; } public void retira(double quantia) { if (quantia < saldo) saldo = saldo - quantia; } }

Herana: Exemplo
public class ContaEspecial extends ContaBancaria { private double limite; public ContaEspecial(String n,double s,double l) { super(n,s); limite = l; deposita(limite); // simula dinheiro a mais ! } public double getSaldo() { return super.getSaldo()-limite; // saldo verdadeiro } }

Palavra-chave super: permite a chamada de mtodo da classe ancestral


Somente construtores podem executar construtores

Herana: Exemplo
public class TesteContaEspecial { public static void main(String[] args) { ContaBancaria minha = new ContaBancaria("Eu",200); minha.retira(120); minha.retira(100); System.out.println(minha.getSaldo()); // 80 ContaEspecial gugu = new ContaEspecial("Gugu",10000,2000); gugu.retira(5000); gugu.retira(6000); System.out.println(gugu.getSaldo()); // -1000 } }

Você também pode gostar