Sunteți pe pagina 1din 45

Programao por Objectos Java

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

Valor retornado pela instruo return.

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

Leo Tigre Urso

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); } }

No terminal impresso arg = 5

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); } }

No terminal impresso arg.quantia = 10250

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]); }

final parameter i may not be assigned for (; i<strings.length; i++) 1 error


public static void imprimeAnimais(final int i, final String... s) { s[i]="Foca"; for (int j=i; j<s.length; j++) System.out.println(s[j]); } imprimeAnimais(1,"Leo","Tigre","Urso");

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);

Ok, chamaria o 1 mtodo (argumento fixo)!

print(Hello,World);

Daria origem a um erro de compilao!

A soluo seria:

print(Hello, new String[] {World}); print(new String[] {Hello,World});

LEEC@IST

Java 19/45

Mtodo main (1)


O interpretador JVM executa sempre o mtodo main da classe indicada na linha do comando:
Qualificadores: public static Retorno: void Parmetros: String[] args

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

Mtodo main (2)


Class Echo { public static void main(String[] args) { for(int i=0; i<args.length; i++) System.out.print(args[i]+ ); System.out.println(); } } > javac Echo.java > java Echo estou aqui > estou aqui

LEEC@IST

Java 21/45

Mtodo main (3)


O programa termina quando executada a ltima instruo do main. Se for necessrio terminar antecipadamente o programa, chamar o mtodo: System.exit(int status); onde o parmetro status identifica o cdigo de terminao (sucesso - 0 em Linux, 1 em Windows).

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.

Qualif* Tipo Ident [ = Expr ] [, Ident = Expr ]* ;


As variveis locais tm de ser inicializadas antes de ser usadas, ou quando so declaradas, ou por atribuio antes de ser usada.
Ao contrrio dos atributos, no h inicializao por omisso de variveis locais.

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());

No terminal impresso Saldo c1 = 1000


Saldo c2 = 1000 Saldo c1 = 1300 Saldo c2 = 1300
LEEC@IST Java 26/45

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!"); }

No terminal impresso 3, 2, 1, Boom!


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!"); }

No terminal impresso 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

do instruo-corpo while (Expr-Bool)


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

A mdia dos valores 16.0

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

S-ar putea să vă placă și