...

Adaptação dos acetatos originais do livro: Java- An Introduction to Problem Solving & Programming, 4ª Edição Autor: Walter Savitch, ISBN 013149020 © 2005.

by internet

on

Report

Category:

Documents

Download: 0

Comment: 0

102

views

Comments

Description

Download Adaptação dos acetatos originais do livro: Java- An Introduction to Problem Solving & Programming, 4ª Edição Autor: Walter Savitch, ISBN 013149020 © 2005.

Transcript

  • Slide 1
  • Adaptação dos acetatos originais do livro: Java- An Introduction to Problem Solving & Programming, 4ª Edição Autor: Walter Savitch, ISBN 013149020 © 2005 Pearson Education Mais sobre Objectos e métodos Capítulo 5
  • Slide 2
  • Adaptação dos acetatos originais do livro: Java- An Introduction to Problem Solving & Programming, 4ª Edição Autor: Walter Savitch, ISBN 013149020 © 2005 Pearson Education Objectivos Aprender a sobrecarga de métodos Saber definir e usar construtores Aprender técnicas de desenho top-down Aprender técnicas para testar os métodos ( incluindo o uso de stubs e programas de teste ) Saber definir e usar métodos e variáveis estáticas Saber construir packages e usar a instrução import
  • Slide 3
  • Adaptação dos acetatos originais do livro: Java- An Introduction to Problem Solving & Programming, 4ª Edição Autor: Walter Savitch, ISBN 013149020 © 2005 Pearson Education Sobrecarga e construtores Sobrecarga (overloading) Construtores
  • Slide 4
  • Adaptação dos acetatos originais do livro: Java- An Introduction to Problem Solving & Programming, 4ª Edição Autor: Walter Savitch, ISBN 013149020 © 2005 Pearson Education Sobrecarga (overloading) Dois ou mais métodos da mesma classe podem ser definidos com o mesmo nome se a lista de parâmetros usada servir para determinar qual o método que está a ser invocado (e.g. println ). –Isto é denominado sobrecarga (overloading). –O número de argumentos e o tipo dos argumentos determina qual o método invocado. Se não existir nenhum, são tentadas conversões simples de tipo. Caso não exista possibilidade de conversão, será produzida um mensagem de erro. A sobrecarga pode ser aplicada a métodos estáticos e de instância.
  • Slide 5
  • Adaptação dos acetatos originais do livro: Java- An Introduction to Problem Solving & Programming, 4ª Edição Autor: Walter Savitch, ISBN 013149020 © 2005 Pearson Education Exemplo - Sobrecarga public class Pessoa { String nome; int idade; public String getNome() { return nome; } public int getIdade() { return idade; } public void set( String n ) { nome = n; } public void set( int i ) { if ( i > 0) idade = i; } public void set( String n, int i ) { set(n);set(i); } public String toString() { return getNome()+ " – "+ getIdade()+ " anos"; } public class TestePessoa { public static void main( String [] args ) { Pessoa p = new Pessoa(); p.set("Ana"); p.set(12); System.out.println( p.toString() ); p.set("Rita", 9); System.out.println( p.toString() ); } }
  • Slide 6
  • Adaptação dos acetatos originais do livro: Java- An Introduction to Problem Solving & Programming, 4ª Edição Autor: Walter Savitch, ISBN 013149020 © 2005 Pearson Education Sobrecarga e tipo de retorno Não é possível sobrecarregar um nome de método providenciando duas definições com cabeçalhos que apenas diferem no tipo de retorno.
  • Slide 7
  • Adaptação dos acetatos originais do livro: Java- An Introduction to Problem Solving & Programming, 4ª Edição Autor: Walter Savitch, ISBN 013149020 © 2005 Pearson Education Sobrecarga e conversão automática podem interferir uma na outra. Dependendo como a sobrecarga e a conversão de tipo interactuarem, pode ficar ambíguo qual o método a invocar. Como as ambiguidades não são permitidas o compilador Java produz uma mensagem de erro. –Exemplo public static void oops(double n1, int n2){…} public static void oops(int n1, double n2){…} A invocação: sample.oops(5,10) produz uma mensagem de erro na compilação. Sobrecarga e Conversão Automática
  • Slide 8
  • Adaptação dos acetatos originais do livro: Java- An Introduction to Problem Solving & Programming, 4ª Edição Autor: Walter Savitch, ISBN 013149020 © 2005 Pearson Education Construtores Quando se cria um objecto duma classe, por vezes é necessário efectuar acções que coloquem valores iniciais nas variáveis de instância. O construtor é um método especial que permite realizar as acções de iniciação. Novos objectos são criados usando o operador new Nome_Class nome_Object = new Nome_Class(parametros); O construtor é chamado automaticamente quando é criado um objecto. –new Nome_Class( parametros ) invoca o construtor e retorna a referência para o objecto instanciado. –Define o estado inicial de um objecto (tipicamente corresponde à iniciação das variáveis de instância.
  • Slide 9
  • Adaptação dos acetatos originais do livro: Java- An Introduction to Problem Solving & Programming, 4ª Edição Autor: Walter Savitch, ISBN 013149020 © 2005 Pearson Education Exemplo - Construtores public class Data { private int dia=1, mes=1, ano= 2005; public Data(){ } // Construtor sem parâmetros public Data( int a, int m, int d){ set(a, m, d); } public Data( String d ) { set(d); }... } public class TesteData { public static void main( String [] args ) { Data d= new Data(); Data natal= new Date(2005, 12, 25); Data anos= new Data("1996/10/23");... } }
  • Slide 10
  • Adaptação dos acetatos originais do livro: Java- An Introduction to Problem Solving & Programming, 4ª Edição Autor: Walter Savitch, ISBN 013149020 © 2005 Pearson Education Definição dos Construtores Cada construtor tem o mesmo nome que a classe. O construtor não tem tipo de retorno, nem mesmo void. Construtores frequentemente são sobrecarregados, cada um com diferente número de parâmetros ou diferentes tipos de parâmetros. Quando na definição da classe não existem definições de construtores, é criado automaticamente um construtor por omissão (default), que não tem parâmetros. Se for definido pelo menos um construtor para a classe, não é criado automaticamente o construtor sem parâmetros.
  • Slide 11
  • Adaptação dos acetatos originais do livro: Java- An Introduction to Problem Solving & Programming, 4ª Edição Autor: Walter Savitch, ISBN 013149020 © 2005 Pearson Education Uso de Construtores O construtor só pode ser invocado quando se cria um objecto. Data natal = new Data(2005, 12, 25); // válido Depois dum objecto ser criado, os métodos set são necessários para modificar o valor de uma ou mais variáveis de instância Data d = new Data(); d.Data( 2005, 12, 25 ); // inválido d.set( 2005, 12, 25 ); // válido
  • Slide 12
  • Adaptação dos acetatos originais do livro: Java- An Introduction to Problem Solving & Programming, 4ª Edição Autor: Walter Savitch, ISBN 013149020 © 2005 Pearson Education Desenho Top-Down Para realizar uma tarefa complexa é conveniente decompo-la em várias tarefas. Cada tarefa pequena (sub-tarefa) pode, se necessário, ser decomposta em tarefas ainda mais pequenas. As várias tarefas pequenas frequentemente são mais fáceis de codificar do que uma tarefa grande. A colecção de tarefas pequenas trabalham em conjunto de forma a realizar uma tarefa grande. Tipicamente, sub-tarefas são auxiliares, isto é, são implementadas como métodos private. Esta técnica é denominada desenho top-down ou dividir para conquistar
  • Slide 13
  • Adaptação dos acetatos originais do livro: Java- An Introduction to Problem Solving & Programming, 4ª Edição Autor: Walter Savitch, ISBN 013149020 © 2005 Pearson Education Exemplo de desenho Top-Down Classe Data: Métodos publico que avança para o próximo dia public class Data { int dia, mes, ano; …………… /** * passa a data para o dia seguinte */ public void diaSeguinte() { dia++; if (dia > diasNoMes(mes, ano)) { dia=1; mes++; if (mes > 12) { mes=1; ano++; }
  • Slide 14
  • Adaptação dos acetatos originais do livro: Java- An Introduction to Problem Solving & Programming, 4ª Edição Autor: Walter Savitch, ISBN 013149020 © 2005 Pearson Education Exemplo de desenho Top-Down Classe Data: Métodos auxiliares para o cálculo do dia seguinte public class Data { int dia, mes, ano; /** * Indica se determinado ano é bissexto * @param ano * @return true se ano for bissexto */ private boolean bissexto(int ano) { return (ano %4 == 0 && ano % 100 != 0) || ano % 400 == 0; } /** * Indica o número de dias do mês m" no ano a * @param m mês * @return número de dias do mês m */ private int diasNoMes(int m, int a) { switch (m) { case 4: case 6: case 9: case 11: return 30; case 2: return bissexto(a) ? 29 : 28; default: return 31; }........... }
  • Slide 15
  • Adaptação dos acetatos originais do livro: Java- An Introduction to Problem Solving & Programming, 4ª Edição Autor: Walter Savitch, ISBN 013149020 © 2005 Pearson Education Teste bottom-up Para teste de um método ou de uma classe deve-se escrever um programa de teste específico que permita testar cada um dos métodos fora do contexto da aplicação em que vão ser usados. Um programa de teste : –Trabalha e invoca testando cada um dos métodos individualmente. –Depois do método ou classe estar testado adequadamente, o programa de teste pode ser deitado fora. Se o método A usa o método B, então o método B tem que ser testado antes de testar o método A. Testando todos os métodos de nível inferior invocados pelo método do nível superior antes do teste do método nível superior é denominado teste bottom-up.
  • Slide 16
  • Adaptação dos acetatos originais do livro: Java- An Introduction to Problem Solving & Programming, 4ª Edição Autor: Walter Savitch, ISBN 013149020 © 2005 Pearson Education Stubs Às vezes uma aproximação geral tem que ser testada antes de escrever todos os métodos. Um stub é uma versão simplificada do método que é suficientemente boa para o teste do objectivo, apesar de não ser suficientemente boa como definição final. –Pode, por exemplo, retornar um valor arbitral, desde que seja suficiente para o teste aproximado.
  • Slide 17
  • Adaptação dos acetatos originais do livro: Java- An Introduction to Problem Solving & Programming, 4ª Edição Autor: Walter Savitch, ISBN 013149020 © 2005 Pearson Education Information Hiding - revisitada A classe pode ter variáveis de instância de qualquer tipo, incluindo tipos classe. Variáveis de instância de tipos classe contêm o endereço em memória do objecto associado. Qualquer modificação feita na variável de instância de tipos classe, por vezes não intencional, indirectamente afecta todas as outras referências do objecto associado.
  • Slide 18
  • Adaptação dos acetatos originais do livro: Java- An Introduction to Problem Solving & Programming, 4ª Edição Autor: Walter Savitch, ISBN 013149020 © 2005 Pearson Education Variáveis de instância do tipo classe public class Pessoa { private Data nascimento; private String nome; Pessoa(String n, int a, int m, int d) { nome = n; nascimento = new Data(a, m, d); } public String getNome() { return nome; } public Data getData() { return nascimento;} public void escrever(){ System.out.print("Nome: " + nome); System.out.println(" nasceu em:" + nascimento.toString()) ; } } public class TestePessoa { public static void main( String [] args ) { Pessoa p = new Pessoa("Ana", 1993, 1, 6); p.escrever(); Data d = p.getData(); d.set(2005,1,6); // Altera a data de nascimento da Ana p.escrever(); } }
  • Slide 19
  • Adaptação dos acetatos originais do livro: Java- An Introduction to Problem Solving & Programming, 4ª Edição Autor: Walter Savitch, ISBN 013149020 © 2005 Pearson Education Evitar problemas Uma solução fácil é usar unicamente variáveis instância do tipo primitivo ou do tipo String, que não tem métodos que possibilitem modificar os dados. Uma solução mais dura é produzir uma cópia exacta do objecto chamada um clone. –A referência para o clone é retornada como alternativa da referência para o objecto. –Apêndice 8 do livro para detalhes. Outra solução é definir métodos que permitam o acesso aos dados sem que estes possam ser modificados.
  • Slide 20
  • Adaptação dos acetatos originais do livro: Java- An Introduction to Problem Solving & Programming, 4ª Edição Autor: Walter Savitch, ISBN 013149020 © 2005 Pearson Education Evitar problemas – 1ª solução public class Data {... public Data clone() { return new Data(ano, mes, dia); } } public class Pessoa {... public Data getData(){ return nascimento.clone();} } public class TestePessoa { public static void main( String [] args ) { Pessoa p= new Pessoa("Ana", 1993, 1, 6); p.escrever(); Data d = p.getData(); d.setAno(2005); // Não altera a data de nascimento da Ana p.escrever(); } } Retorna uma nova data
  • Slide 21
  • Adaptação dos acetatos originais do livro: Java- An Introduction to Problem Solving & Programming, 4ª Edição Autor: Walter Savitch, ISBN 013149020 © 2005 Pearson Education Evitar problemas – 2ª solução public class Data {... public int getDia(){ return dia;} public int getMes(){ return mes;} public int getAno(){ return ano;} } public class Pessoa {... public String getDataNasc(){ return nascimento.toString();} public int getDia(){ return nascimento.getDia();} public int getMes(){ return nascimento.getMes();} public int getAno(){ return nascimento.getAno();} } public class TestePessoa { public static void main( String [] args ) { Pessoa p= new Pessoa("Ana", 1993, 1, 6); p.escrever(); System.out.println("Nasceu no ano: ", p.getAno() ); Data d = new Data( p.getAno(), p.getMes(), p.getDia() ); d.setAno(2005); p.escrever(); } }
  • Slide 22
  • Adaptação dos acetatos originais do livro: Java- An Introduction to Problem Solving & Programming, 4ª Edição Autor: Walter Savitch, ISBN 013149020 © 2005 Pearson Education Métodos e variáveis da classe (estáticas) Métodos da classe Variáveis da classe Classe Math Integer, Double, e outras Classes Wrapper Métodos estáticos e variáveis estáticas pertencem a uma classe e não requerem qualquer objecto.
  • Slide 23
  • Adaptação dos acetatos originais do livro: Java- An Introduction to Problem Solving & Programming, 4ª Edição Autor: Walter Savitch, ISBN 013149020 © 2005 Pearson Education Métodos estáticos Alguns métodos não têm ligação a qualquer objecto. Por exemplo: –Calcular a raiz quadrada de um número –Converter uma letra minúscula em maiúscula –Gerar um número aleatório (random) Estes métodos podem ser definidos como estáticos. Um método estático é definido como qualquer método da classe, mas inclui a keyword static no cabeçalho. public static double areaCirculo(double raio); Na definição não se pode referir ao this, aceder a variáveis de instância, nem invocar métodos da classe não estáticos. Um método estático é invocado usando o nome da classe em vez do nome de variável de tipo classe. Nome_classe.nome_método_static( parametros );
  • Slide 24
  • Adaptação dos acetatos originais do livro: Java- An Introduction to Problem Solving & Programming, 4ª Edição Autor: Walter Savitch, ISBN 013149020 © 2005 Pearson Education Exemplo - métodos estáticos public class Data { private int dia, mes, ano; static public boolean anoBissexto(int a) { return a % 400 == 0 || a%4 == 0 && a%100 != 0; } static public int numDiasMes(int a, int m) { switch ( m ) { case 2: return anoBissexto(a) ? 29 : 28;... } static public boolean validaMes(int m){return m>=1 && m 0 && validaMes(m) && d>=1 && d
Fly UP