Paradigmas de Programao
Classes
Campos ou variveis de instncia Construtores Mtodos
Modificadores/mutantes Seletores/acessores
Variveis Campos Parmetros Variveis locais
this
Interao entre Objetos Modularizao e abstrao
Criao de objetos por objetos
Diagrama de classes e de objetos
Invocao interna e externa de mtodos
Da aula anterior, j conseguem explicar
O que uma classe?
O que contm uma classe? Quais so os membros de uma classe?
O que so variveis de instncia ou campos?
O que so mtodos?
O que o cabealho de um mtodo?
O que a assinatura de um mtodo?
O que so os parmetros de um mtodo?
Projeto Ticket Machine
Verso muito bsica...
Diz o preo (nico...) int getPrice()
Aceita moedas toa void insertMoney(amount)
Diz o saldo int getBalance()
Emite bilhete void printTicket()
Olhemos para o cdigo fonte... Campos
Construtores
Mtodos
No exemplo so 3
J sabemos o que representam!
Vejamos onde esto e como esto
So mtodos especiais!
Automaticamente invocados aquando da criao do objeto
Tm a responsabilidade de preparar os novos objetos, inicializando os seus campos
Caractersticas Nome igual ao da sua classe Sem tipo de retorno public public TicketMachine(int ticketCost){
price = ticketCost;
balance = 0;
total = 0;
}
J falmos um pouco do que so
e das suas assinaturas e cabealhos
As assinaturas dos mtodos e dos construtores determinam que tipos de dados requerem so os parmetros do mtodo
public TicketMachine(int ticketCost)
public void insertMoney(int amount)
Os parmetros tm um tempo de vida mais curto que os campos!! Existem enquanto o mtodo estiver a ser executado
criada uma cpia da varivel passada aquando da invocao do mtodo!!!
passagem por valor!!!!!!!
balance
total
...
Execuo de um mtodo
o sistema cria na memria novas variveis que so cpias das que recebe como parmetro e sobre essas que trabalha!!!!
Se o parmetro de tipo primitivo as alteraes feitas dentro do mtodo ao seu valor no afetam o valor da varivel fora do mtodo!!! (a cpia alterada e no a original)
Se o parmetro de tipo no primitivo, a cpia que passada a da referncia do objeto (e no o objeto)
se alterar o valor dos campos desse objeto dentro do mtodo isso vai-se notar c fora!!!
public class Test{
private int x;
public void sampleMethod2(int i, Test z){
i = 400;
z.x = 100;
}
public static void main(String[] args){
int i = 500;
Test t = new Test();
System.out.println("Teste antes i: " + i);
System.out.println("Teste antes t: " + t.x);
t.sampleMethod2(i, t);
System.out.println("Teste depois i: " + i);
System.out.println("Teste depois t: " + t.x);
}
}
Tambm so mtodos especiais
So os mais simples
retornam informao de estado do objeto!!!
/**
* Return the price of a ticket.
*/
public int getPrice(){
return price;
}
Porque so necessrios?
Tambm so mtodos especiais
Modificam o estado do objeto
public void insertMoney(int amount){
balance += amount;
}
Porque so necessrios?
Para imprimir a partir de mtodos
System.out.println(# The BlueJ Line);
System.out.println(# Ticket);
System.out.println(# + price + cents.);
Com o operador + podem concatenar-se Strings
+ um operador polimrfico!!
Projeto Better Ticket Machine
Dar troco; verificar quantias introduzidas antes de emitir bilhete; ...
Instruo condicional if (expressoBoleana){ Instrues para o caso true; }
else {
Instrues para o caso false; }
if (expressoBoleana) Instruo para o caso true;
else Instruo para o caso false;
O tipo boolean
Expresso
Um bloco... ...outro bloco
true false
Alm dos campos (variveis de instncia) e dos parmetros...
...podemos usar variveis locais
O mtodo retorna o valor inserido at ao momento:
public int refundBalance()
{
int amountToRefund; // varivel local
amountToRefund = balance;
balance = 0;
return amountToRefund;
}
Variveis locais nunca se declaram fora de mtodos!!!
Resumindo
Campos (variveis de instncia) Definidos fora dos construtores e mtodos da classe, utilizveis nestes
Se private, invisveis de fora da classe
Tempo de vida igual ao do seu objeto
Automaticamente inicializadas
Parmetros vivem durante a execuo do mtodo
S so visveis dentro do mtodo
Variveis locais Definidas dentro de mtodos
Existem e so manipulveis desde o momento em que so declaradas at que termina o bloco em que so declaradas
Tm que ser inicializadas!!!!
public class Test{
private int x;
public void sampleMethod2(int i, Test z){
i = 400;
z.x = 100;
}
public static void main(String[] args){
int i = 500;
Test t = new Test();
System.out.println("Teste antes i: " + i);
System.out.println("Teste antes t: " + t.x);
t.sampleMethod2(i, t);
System.out.println("Teste depois i: " + i);
System.out.println("Teste depois t: " + t.x);
}
}
Passemos a outro exemplo
Como implementar?
Em vez de uma classe s... Vamos lidar com a complexidade dividindo o problema em mdulos,
ou sub-problemas (Dividir para conquistar)
Depois pegamos na soluo de cada mdulo e abstramos dos seus detalhes
De volta ao software: escrever vrias classes pequenas em vez de uma gigante
programa a funcionar ter vrios objetos pequenos em vez de um grande
12:05
Em vez de um mostrador com 4 dgitos...
...vamos adotar dois mostradores de 2 dgitos O primeiro vai de 0 a 23 (o limite de horas)
O segundo de 0 a 59 (o limite dos minutos)
Vamos primeiro escrever a classe NumberDisplay (mostrador de 2 dgitos)
...e depois basta criar dois objetos com limites diferentes
12
12:05
35
Projeto clock-display
Classe NumberDisplay
Duas variveis de instncia private int limit;
private int value;
Um construtor
Um mtodo seletor (obter valor)
Dois mtodos modificadores (inicializa e incrementa valor)
Classe ClockDisplay Duas variveis de instncia
private NumberDisplay hours;
private NumberDisplay minutes;
...
O relgio tem dois mostradores de 2 dgitos
Perspetiva esttica, diagrama de classes:
Perspetiva dinmica, diagrama de objetos:
hours
minutes
relogio1:
ClockDisplay 12
: NumberDisplay
20 : NumberDisplay
Como constri ClockDisplay os seus NumberDisplay ?
Invoca construtor de NumberDisplay! hours = new NumberDisplay(24)
minutes = new NumberDisplay(60);
Parmetro formal especificado na assinatura do construtor e
o argumento dado ao invocar o construtor
Uma classe pode ter vrios construtores
ClockDisplay(), ClockDisplay(hour, minute)
Numa classe podemos ter construtores ou mtodos com o mesmo nome mas assinaturas diferentes: overloading!!
Um mtodo pode ser invocado
dentro da classe > invocao interna!
Exemplo: no construtor de ClockDisplay: updateDisplay();
ou a partir de outra classe > invocao externa!
Exemplo: no mtodo timeTick(): minutes.increment();
Projeto mail-system um sistema de correio eletrnico
Classe MailItem no instanciada pelo utilizador, usada pelas outras classes!!
O construtor de MailItem tem uma coisa interessante:
public class MailItem {
private String from;
private String to;
private String message;
public MailItem(String from, String to, String message){
this.from = from;
this.to = to;
this.message = message;
}
...
}
this desambigua nomes!!
Uma ferramenta til
Debugger
Definir breakpoints (pontos de paragem)
Quando a execuo chegar a este ponto, o programa vai parar para bisbilhotarmos
Permite... mandar parar a execuo num ponto
inspecionar campos e variveis locais
prosseguir a execuo passo a passo, saltando invocaes de mtodo... ou acompanhando a entrada num mtodo!
Pretende-se implementar o funcionamento de um bloco de notas que guarde e mostre um nmero ilimitado de notas (strings)
Como posso guardar e manipular 5 notas no meu sistema?
String anotacao1 = new String(Primeira anotao);
String anotacao2 = new String(Segunda anotao);
String anotacao5 = new String(Quinta anotao);
E se fossem 1000 anotaes!?!?!
Como posso guardar e manipular um nmero X de anotaes (objetos) no meu sistema?
Pelo uso de estruturas especiais, que podem ser de 2 tipos
Arrays
Collections
So a forma mais eficiente de guardar e manipular um grupo de elementos
So criados na HEAP
mas todos os seus elementos so de um tipo especfico
e tm tamanho fixo
Ateno para no exceder o tamanho!!
Podem conter elementos de um tipo primitivo ou de tipo objeto
J agora
possvel passar um array como parmetro para um mtodo!
possvel retornar um array de um mtodo!
public String[] saboresEscolhidos(int n)
Declarao de um array private int[] hourCounts;
Criao de um array alunos = new int[24];
Inicializao de um array alunos = {12134, 34145, 51643, 222398, }
Declarao, criao e inicializao (3 em 1) private int[] alunos = {12134, 34145, 51643, 222398, }
:int[] 0 1 2 23 ...
Manipulao dos elementos de um array faz-se com um ndice
int al = alunos[3];
String p = nomes[al+10-y];
machines[2] = new TicketMachine(500);
possvel saber o tamanho de um array
no quantos elementos l esto em determinado momento
alunos.length
Com ciclo for !!!!!!!
Exemplo
double[] alturas = new double[MAXALT];
int[] idades = new int[50];
double somaAlturas = 0.0;
for (int i = 0; i < MAXALT; i++) {somaAlturas += alturas[i];}
for (double altura : alturas) { somaAlturas += altura; }
int soma = 0;
for (int idade : idades) soma += idade;
Analisemos a classe TestArrays
Classe Array existe no package java.lang
No tem que ser importada!!!!!!
Contm mtodos estticos para criar e aceder a arrays Mtodos getXxx()
Mtodos setYyy()
Mtodo getLength(Object array)
Classe Arrays existe no package java.util
Tem que ser importada!!!!!!
Contm mtodos estticos que realizam funes teis para a manipulao de arrays
Principais mtodos equals(xxx[] a, xxx[] b) -> compara 2 arrays
fill( ) -> preenche um array com um valor
sort( ) -> ordena um array
binarySearch( ) -> procura um elemento num array ordenado
J agora para copiar um array System.arraycopy( )
Para serem considerados iguais, os arrays devem
Ter o mesmo nmero de elementos
Cada elemento de um array deve ser igual ao elemento correspondente do outro array
Esta igualdade determinada pelo uso do mtodo equals()
Analisemos o mtodo ComparacaoArrays() implementado na classe TestArray
Veremos mais frente!!!
Alternativa aos arrays...
as collections!!!!
ArrayList
Bibliotecas de classes: packages
import java.util.ArrayList // Importa esta classe
...
private ArrayList notes; // Ateno!!!!
...
notes = new ArrayList();
...
notes.add(note);
Analisemos o cdigo
notes
meuBloco:
Notebook
:ArrayList
Preparar slides
:String
Atualizar site
:String
Exemplo de estrutura de objetos dentro de uma collection
notes
meuBloco:
Notebook
:ArrayList
Preparar slides
:String
Atualizar site
:String
Enviar email
:String
A posio de um objecto na collection o ndice (index)
notes
meuBloco:
Notebook
:ArrayList
Preparar slides
:String
Atualizar site
:String
Enviar email
:String
0 1 2
Ao remover um item, a collection renumerada.
Aps remover o item 1:
notes
meuBloco:
Notebook
:ArrayList
Preparar slides
:String
Enviar email
:String
0 1
// Operaes bsicas int size()
boolean isEmpty()
boolean contains(Object element)
boolean add(E element) //opcional
boolean remove(Object element)
E get(int index)
// Operations sobre toda a collection boolean containsAll(Collection c)
boolean addAll(Collection c) //opcional
void clear() //optional
... Ainda h mais
para a frente voltaremos a isto!
H trs formas possveis
Ciclos habituais
Com estrutura foreach (> JAVA5)
for (E elem : coleccao) { ... };
foreach no permite parar as procuras!!!
ArrayList texto = new ArrayList();
for (String s : texto) {System.out.println(s);}
Usando Iteradores
Histrias do dia Classes tm campos, construtores e mtodos, que definem estado e
comportamento
Os corpos dos construtores e mtodos contm instrues alterando o estado e implementando comportamento
Para lidar com a complexidade dividem-se os problemas. Podemos identificar sub-componentes do que queremos construir, e fazer classes mais pequenas. Para descobrir erros vale tudo ler o cdigo, fazer diagramas de objetos, usar um debugger
Conceitos: Campo/varivel de instncia, construtor, mtodo, corpo de mtodo,
mtodo seletor/acessional, mtodo modificador/mutante, declarao, inicializao, bloco, afetao, instruo condicional, expresso, operador, varivel local, tempo de vida
abstrao, modularizao, diviso e conquista, diagrama de classes, diagrama de objetos, overloading, invocao e externa de mtodos, debugger, breakpoint