pp aula3 classes interaccao

47
Par adigmas de Programação 

Upload: melissa-hughes

Post on 16-Oct-2015

9 views

Category:

Documents


0 download

TRANSCRIPT

  • 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