Documente Academic
Documente Profesional
Documente Cultură
Parte 3: Mtodos
LEEC@IST
Java 1/45
Mtodos (1)
Sintaxe Qualif Tipo Ident ( [ TipoP IdentP [, TipoP IdentP]* ] ) { [ Varivel_local | Instruo ]* }
Qualif: qualificador (visibilidade, entre outros) Tipo: tipo de retorno do mtodo Ident: identificador do mtodo TipoP: tipo dos parmetros do mtodo IdentP: identificador dos parmetros do mtodo { [ Varivel | Instruo ]* } : corpo do mtodo
LEEC@IST Java 2/45
Mtodos (2)
Qualificadores de mtodo:
Visibilidade: public: mtodo acessvel onde quer que a classe seja acessvel. private: mtodo acessvel apenas na classe. protected: mtodo acessvel na classe, subclasses e classes no mesmo pacote. abstract: mtodo sem corpo. static: mtodo de classe. final: mtodo que no pode ser redefinido nas subclasses.
LEEC@IST
Java 3/45
Mtodos (3)
No caso de omisso de um qualificador de visibilidade, o mtodo acessvel na classe e classes no mesmo pacote. Com excepo dos qualificadores de visibilidade, um mtodo pode ter mais do que um qualificador. Contudo, um mtodo no pode ser ao mesmo tempo abstract e final. Um mtodo esttico s pode aceder a atributos estticos e chamar mtodos estticos da classe.
LEEC@IST
Java 4/45
Mtodos (4)
O tipo de retorno de um mtodo obrigatrio, podendo ser:
tipo primitivo (boolean, char, byte, short, int, long, float e double) referncias (classes e interfaces definidas pelo Java, por exemplo, classe String, e classes e interfaces definidas pelo programador) void
LEEC@IST
Java 5/45
Mtodos (5)
Um mtodo pode ter zero, um, ou mais parmetros:
Tipos possveis de parmetros: tipo primitivo (boolean, char, byte, short, int, long, float e double) referncias (classes e interfaces definidas pelo Java, por exemplo, classe String, e classes e interfaces definidas pelo programador)
LEEC@IST
Java 6/45
Mtodos (6)
O ltimo parmetro de um mtodo pode ser declarado como uma sequncia de parmtetros.
Permite que o mtodo seja chamado com um nmero varivel de argumentos (incluindo zero). Mtodos com sequncia de parmetros so denominados como mtodos de argumento varivel, contrastando com os mtodos de argumento fixo. A aridade de um mtodo dada pelo nmero de parmetros do mesmo. Os mtodos de argumento varivel so mtodos de aridade varivel, enquanto que, os mtodos de argumento fixo so de aridade fixa. Definido com reticncias (...) antes do tipo de parmetro mas depois do seu identificador.
LEEC@IST Java 7/45
Mtodos (7)
Declarar um parmetro como uma sequncia de parmetros nada mais que pedir ao compilador para construir uma tabela com os elementos que se querem passar ao mtodo.
public void imprimeAnimais(String... strings) { for (int i=0; i<strings.length; i++) System.out.println(strings[i]); } imprimeAnimais("Leo","Tigre","Urso");
imprime no terminal
LEEC@IST
Java 8/45
Mtodos (8)
Em Java, os parmetros so sempre passados por valor:
O valor dos parmetros so sempre cpias dos valores passados como argumento. O mtodo pode moficar o valor dos seus parmetros sem afectar o respectivo valor no cdigo que chamou o mtodo. Quando o parmetro uma referncia para um objecto, a referncia para o objecto que passada por valor.
O mtodo pode alterar o objecto para quem o parmetro faz referncia sem afectar a referncia que lhe foi passada. Contudo, alteraes a nvel dos atributos do objecto recebido como parmetro, ou chamada a mtodos que alterem o estado do objecto recebido como parmetro, alteram o objecto em todos as partes do programa que tenham uma referncia para o mesmo.
Um parmetro pode ser declarado final, quando no se quer que o seu valor seja alterado no corpo do mtodo.
LEEC@IST Java 9/45
Mtodos (9)
public class Demo { static void foo(int arg1) { arg1 = 10; } public static void main(String args[]){ int arg = 5; foo(arg); System.out.println("arg = " + arg); } }
LEEC@IST
Java 10/45
Mtodos (10)
public class Demo { public static void foo(Conta c) { c.quantia += 10000; } public static void main(String args[]){ Conta arg = new Conta(Joo Pires,250); foo(arg); System.out.println(arg.quantia = " + arg.quantia); } }
LEEC@IST
Java 11/45
Mtodos (11)
public static void imprimeAnimais(final int i, final String... s) { for (; i<s.length; i++) System.out.println(s[i]); }
imprime no terminal
LEEC@IST
Foca Urso
Java 12/45
Mtodos (12)
Um mtodo de uma classe acedido pelo operador ponto (.) na forma referncia.metodo(params). A referncia um identificador de: objecto, se o mtodo no tiver qualificador static. classe, se o mtodo tiver qualificador static.
LEEC@IST
Java 13/45
Mtodos (13)
Chamada sucessiva: Um mtodo pode retornar um objecto, ao qual se pode chamar outro mtodo. Existem duas formas de chamar sucessivamente os mtodos:
1. Guardar objecto numa varivel
Classe var = obj.metodo1(); var.metodo2();
2. Chamar directamente
obj.metodo1().metodo2();
LEEC@IST
Java 14/45
Mtodos (14)
Dentro de um mtodo de instmcia, o objecto sobre o qual est a ser invocado o mtodo pode ser refernciado pelo this. No existe a referncia this em mtodos estticos. Normalmente, o this usado para passar o objecto sobre o qual est a ser chamado o mtodo como argumento para outros mtodos.
LEEC@IST
Java 15/45
Mtodos (15)
public void deposito(float valor){ quantia += valor; } public void deposito(float valor){ this.quantia += valor; }
Tambm pode ser necessrio usar o this na presena de um atributo escondido por uma varivel local ou parmetro.
public void deposito(float quantia){ this.quantia += quantia; }
LEEC@IST
Java 16/45
Mtodos (16)
possvel definir dois mtodos, na mesma classe, com o mesmo nome mas com diferente nmero ou tipo de parmetros. Neste caso, diz-se que um mtodo uma sobreposio do outro. O compilador decide qual o mtodo a chamar consoante o nmero e tipo dos parmetros passados ao mtodo em causa. Normalmente, a sobreposio usada quando um mtodo pode receber a mesma informao de diferentes formas, ou quando alguns dos parmetros podem tomar valores por omisso (e nesse caso no precisam de ser passados ao mtodo).
LEEC@IST
Java 17/45
Mtodos (17)
No caso de mtodos de argumento varivel, uma sequncia de parmetros T... tratada como sendo um parmetro de tipo tabela T[].
Se dois mtodos sobrepostos diferem apenas porque um declara uma sequncia de parmetros T... e outro declara um parmetro de tipo tabela T[], tal dar origem a um erro de compilao.
Em caso de ambiguidade, um mtodo de argumento fixo ser sempre escolhido antes de um mtodo de argumento varivel.
LEEC@IST
Java 18/45
Mtodos (18)
public static void print(String title){...} public static void print(String title, String... messages){...} public static void print(String... messages){...}
print(Hello);
print(Hello,World);
A soluo seria:
LEEC@IST
Java 19/45
Todas as classe numa aplicao podem ter um mtodo main. O mtodo main a executar especificado de cada vez que se corre o programa.
LEEC@IST
Java 20/45
LEEC@IST
Java 21/45
LEEC@IST
Java 22/45
Variveis locais
A declarao de uma varivel local semelhante declarao de um atributo, sendo que o nico qualificador que pode ser aplicado a esta final.
Tal como no caso dos atributos, quando a incializao de uma varivel local com o qualificador final feita fora da sua declarao, essa varivel local dita final em branco.
LEEC@IST
Java 23/45
Instrues (1)
Um bloco agrupa zero ou mais instrues. Um bloco delimitado pelos parntesis { e }. Uma varivel local existe apenas enquanto o bloco que a contm est a ser executado. Uma varivel local pode ser declarada em qualquer ponto do bloco a que pertence, e no apenas no incio, mas sempre antes de ser usada.
LEEC@IST
Java 24/45
Instrues (2)
Atribuio Var = Expr [, Var = Expr]*;
Var: varivel local Expr: expresso Relembrar operador de atribuio: A atribuio Var = Var op Expr equivalente a Var op= Expr.
LEEC@IST
Java 25/45
Instrues (3)
Atribuio de objectos apenas copia referncias!
Conta c1 = new Conta(), c2; c1.depositar(1000); c2 = c1; // c2 referencia mesmo objecto que c1 System.out.println(Saldo c1 = " + c1.saldo()); System.out.println(Saldo c2 = " + c2.saldo()); c1.depositar(100); c2.depositar(200); System.out.println(Saldo c1 = " + c1.saldo()); System.out.println(Saldo c2 = " + c2.saldo());
Instrues (4)
Execuo condicional if (Expr-Bool) instruo1 [else instruo2]
Expr_Bool: expresso Booleana
LEEC@IST
Java 27/45
Instrues (5)
char c; /* identifica espcie de caractere */ if (c>=0 && c<=9) System.out.println("Digito!"); else if ((c>=a && c<=z) || (c>=A && c<=Z)) System.out.println(Letra!); else System.out.println("Outra coisa!");
LEEC@IST
Java 28/45
Instrues (6)
Seleco valores switch (Expr) { case literal: instruo1 case literal: instruo2 default: instruoN }
Valor de expresso Expr (char, byte, short ou int, ou correspondentes classes de embrulho, ou enum) comparado com literais. Execuo interrompida pela instruo break.
LEEC@IST Java 29/45
Instrues (7)
int i = 3; switch (i) { case 3: System.out.print("3, "); case 2: System.out.print("2, "); case 1: System.out.print("1, "); case 0: System.out.println("Boom!"); default: System.out.println("Um numero,por favor!"); }
LEEC@IST
Java 30/45
Instrues (8)
int i = 3; switch (i) { case 3: System.out.print("3, "); case 2: System.out.print("2, "); case 1: System.out.print("1, "); break; case 0: System.out.println("Boom!"); default: System.out.println("Um numero,por favor!"); }
No terminal impresso 3, 2, 1,
LEEC@IST
Java 31/45
Instrues (9)
int i = 4; switch (i) { case 3: System.out.print("3, "); case 2: System.out.print("2, "); case 1: System.out.print("1, "); case 0: System.out.println("Boom!"); default: System.out.println("Um numero,por favor!"); }
LEEC@IST
Java 32/45
Instrues (10)
Ciclo condicional while (Expr-Bool) instruo-corpo
A instruo-corpo executada enquanto a expresso booleana Expr-Bool for avaliada a true. O teste pode ser feito depois de executar a instruo-corpo. Em qualquer dos ciclos condicionais: Dentro da instruo-corpo o programa pode regressar avaliao da expresso boolean Expr-Bool mediante a instruo continue. Sada do ciclo pode ser antecipada pela instruo break.
LEEC@IST Java 33/45
Instrues (11)
Ciclo iterativo for (inicializao; Expr-Bool; instruo) instruo-corpo
Varivel de controlo que percorre gama de valores. A inicializao feita antes de entrar no ciclo (tipicamente, varivel de controlo colocada no incio da gama de valores). Expresso booleana Expr-Bool avaliada no incio do ciclo, que executado enquanto for true (tipicamente, testa se varivel de controlo atingiu fim da gama de valores). A instruo executada depois de executado o corpo do ciclo instruo-corpo (tipicamente, altera varivel de controlo em direco ao valor final da gama).
LEEC@IST Java 34/45
Instrues (12)
Varivel de controlo pode ser declarada na inicializao, e acessvel no corpo. Podem existir vrias variveis de controlo, podendo todas elas ser inicializadas na inicializao (separadas por vrgulas). Nesse caso, a instruo pode conter tantas instrues (separadas por vrgulas) quantas as variveis de controlo a alterar em direco ao valor final da gama. Os trs campos pode ser nulos.
Por omisso, o segundo campo avaliado a true. As instrues for(;;) e while(true) so instrues equivalentes.
Dentro da instruo-corpo o programa pode regressar avaliao da expresso Booleana Expr-Bool mediante a instruo continue. Sada do ciclo pode ser antecipada pela instruo break.
LEEC@IST Java 35/45
Instrues (13)
/* Imprime pares at 20 */ for(int i=0, j=0; i+j<=20; i++, j++) System.out.print(i+j + " "); System.out.println();
No terminal impresso 0 2 4 6 8 10 12 14 16 18 20
LEEC@IST
Java 36/45
Instrues (14)
Cliclo iterativo (variante): for-each loop for (Tipo var-ciclo: conjunto) instruo-corpo
O conjunto um objecto que define um conjunto de valores sobre os quais se pretende iterar (tabela, ) Em cada passo do ciclo a varivel local var-ciclo toma um valor diferente do conjunto e executado a instruo-corpo (tipicamente, usando a varivel var-ciclo para algo). O ciclo termina quando no existem mais valores no conjunto.
LEEC@IST
Java 37/45
Instrues (15)
static double media(int[] valores) { double soma = 0.0; for (int val : valores) soma += val; return soma / valores.length; } int[] valores={20,19,18,17,16,15,14,13,12}; System.out.println("A mdia dos valores " + media(valores));
Imprime no terminal
LEEC@IST
Java 38/45
Instrues (16)
A instruo break pode ser usada para sair de qualquer bloco. H duas formas possveis para a instruo break:
No etiquetado: break; Etiquetado: break etiqueta;
Um break no etiquetado termina a correspondente instrues switch, for, while ou do, e s pode ser usado neste contexto. Um break etiquetado pode terminar qualquer instruo etiquetada.
LEEC@IST
Java 39/45
Instrues (17)
public boolean modificaValor(float[][] matriz, float val) { int i, j; boolean encontrado = false; procura: for (i=0; i<matriz.length; i++) { for (j=0; j<matriz[i].length; j++) { if (matriz[i][j]==val) { encontrado = true; break procura; } } } if (!encontrado) return false; //modificar o valor matriz[i][j] da forma pretendida return true; }
LEEC@IST Java 40/45
Instrues (18)
public boolean modificaValor(float[][] matriz, float val) { int i, j; procura: { for (i=0; i<matriz.length; i++) { for (j=0; j<matriz[i].length; j++) { if (matriz[i][j]==val) break procura; } } //se chegamos aqui no encontramos o valor return false; } //modificar o valor matriz[i][j] da forma pretendida return true; }
LEEC@IST
Java 41/45
Instrues (19)
A instruo continue pode ser usada apenas em ciclos (for, while ou do) e transfere o controlo para o fim do correspondente corpo do ciclo. Esta transferncia de controlo faz com que a prxima instruo a ser executada seja:
No caso dos ciclos while e do, a avaliao da expresso booleana Expr-Bool. No caso do ciclo for (bsico), a instruo seguida da avaliao da expresso boolena Expr-Bool. No caso do ciclo for (for-each), prximo elemento do conjunto, se existir.
LEEC@IST Java 42/45
Instrues (20)
A instruo continue tambm tem duas formas:
No etiquetada: continue; Etiquetada: continue etiqueta;
Na forma no etiquetada, a instruo continue transfere o controlo para o fim do correspondente ciclo. Na forma etiquetada, transfere o controlo para o fim do ciclo com essa etiqueta.
LEEC@IST
Java 43/45
Instrues (21)
static void duplicaMatriz(int[][] matriz) { int dim = matriz.length; coluna: for (int i=0; i<dim; i++) { for (int j=0; j<dim; j++) { matriz[i][j]=matriz[j][i]=matriz[i][j]*2; if (i==j) continue coluna; } } }
LEEC@IST
Java 44/45
Instrues (22)
A instruo return termina a execuo dum mtodo e regressa ao ponto que o invocou.
Se o mtodo no retorna nenhum valor (void), usa-se apenas return; Se o mtodo retorna um valor, a instruo return deve incluir uma expresso com tipo compatvel com o tipo de retorno do mtodo.
O return tambm pode ser usado no contexto de um construtor (como os contrutores no tm tipo de retorno sempre usado na forma return;).
LEEC@IST
Java 45/45