Aula teórica 14 Tema 12. Subprogramas (cont) Passagem de parâmetros. Valor de retorno Preparado por eng.tatiana Kovalenko 1
Variáveis globais Variáveis declarados no início da execução do programa, fora de qualquer método, chamam-se globais. Eles podem ser utilizados em qualquer método e são destruídas quando o programa termina. Não é boa prática declarar todas as variáveis como globais. public class AreaDominio_VarGlobais { static int v; public static void mudar() { v = 100; System.out.println("V= "+v+" dentro do metodo muda"); public static void main(string[] args) { v = 50; System.out.println("V= "+v+" antes da chamada"); mudar(); System.out.println("V= "+v+" depois da chamada"); O output será: V= 50 antes da chamada V= 100 dentro do método muda V= 100 depois da chamada 2
Analise exemplo a seguir: public class AreaDominio_VarGlobais2 { static int v; public static void mudar() { int v = 100; System.out.println("V= "+v+" dentro do metodo"); public static void main(string[] args) { v = 50; System.out.println("V= "+v+" antes da chamada"); mudar(); System.out.println("V= "+v+" depois da chamada"); O output será: V= 50 antes da chamada V= 100 dentro do método V= 50 depois da chamada Nota a diferença no output deste programa. 3
Passagem de parâmetros Em Java, a passagem de parâmetros de tipos predefinidos (int, float, boolean, etc.) é feita por valor, que significa que não é o parâmetro real que é passado ao método, mas apenas o seu valor. Este tipo de passagem implica que o valor da variável fica inalterável após a execução do subprograma, independentemente das alterações feitas. Exemplo: public class Exemplo { public static void mudar(int valor) { valor = 20; public static void main(string[] args) { int x = 10; mudar(x); //chamada do método mudar com passagem de parâmetro x System.out.println("O conteúdo da variavel x= "+x); O output será: O conteudo da variavel x= 10 4
A execução deste programa começa pelo subprograma main(), como é habitual. Após de inicialização da variável x com o valor 10 é invocado o método mudar(), tendo como parâmetro real a variável x. Este parâmetro corresponde ao parâmetro formal valor. Durante a execução do método mudar() a variável valor, inicialmente tendo o valor 10, passado na hora de chamada, recebe o novo valor 20. Ao terminar a execução do mudar(), o controlo é devolvido ao programa chamador, que executa a instrução a seguir, visualizando o valor da variável x que ficou inalterado. Isso acontece porque o valor da variável x que é passado ao subprograma e não a própria variável x. Valor de retorno Todos os métodos até agora considerados não devolvem qualquer resultado ao método que faz a sua chamada. Este facto é confirmado pela presença da palavra reservada void no cabeçalho. Quando é necessário que o método devolva um valor que calculou, a palavra void deve ser substituída pelo tipo de resultado que o método deve devolver. 5
Este programa testa o método chamado cubo() que devolve o cubo dum valor do tipo byte passado como parâmetro: public class TestarCubo { public static void main(string[] args) { for (byte i = 1; i<=5; i++) System.out.println (i + "\t"+ cubo(i)); public static int cubo (byte n) { return n*n*n; O output será: 1 1 O método main contém o ciclo for que invoca 5 vezes 2 8 o método println(). Por sua vez, o método println 3 27 invoca o método cubo(), passando o valor do argumento i 4 64 para o parâmetro n. O cabeçalho (linha 8) indica que o 5 125 método cubo() devolve um resultado do tipo int e recebe um parâmetro n do tipo byte. 6
Exemplo2: Este programa testa o método chamado factor() que implementa o calculo de factorial dos números de 0 a 8. O método declara uma variável local factor do tipo long. public class TestarFactorial { public static void main(string[] args) { for (byte i = 0; i <= 8; i++) System.out.println ("f("+i+")= "+factor(i)); public static long factor (byte n) { long fact = 1; //fact é a variavel local while (n > 1) fact *= n--; // ou fact *= n; n--; return fact; O output: f(0)= 1 f(1)= 1 f(2)= 2... f(8)= 40320 7
Num método pode haver mais do que uma instrução return. Por exemplo, encontrar o valor maior entre 3 valores inteiros. public class AcharMaior { public static int maior3 (int v1,int v2,int v3) { if (v1>v2 && v1>v3) return v1; else if (v2>v3) return v2; else return v3; Ø Ø public static void main(string[] args) { int a=5,b=2,c=8; System.out.print("O maior valor entre "+a+","+b+"e"+ c+"= "+maior3(a,b,c)); Os métodos podem retornar no máximo um valor! Definir um método dentro de outro método é um erro de sintaxe! 8
Referência bibliográfica: António José Mendes; Maria José Marcelino. Fundamentos de programação em Java 2. FCA. 2002. Elliot Koffman; Ursula Wolz. Problem Solving with Java. 1999. John R. Hubbard. Theory and problems of programming with Java. Schaum s Outline series. McGraw-Hill. H. Deitel; P. Deitel. Java, como programar. 4 edição. 2003. Bookman. Rui Rossi dos Santos. Programando em Java 2 Teoria e aplicações. Axcel Books. 2004 9