1. Objetivos Criação de métodos em Java Identifica os principais tipos de métodos usados em Java; Levar o leitor a compreender as vantagens de uso dos métodos; Introduzir o conceito de modularidade a partir da criação de métodos; Fornecer subsídios para que o leitor possa criar seus próprios métodos; Descrever os mecanismos necessários para a troca de dados entre os métodos. 2. Métodos Este capitulo apresenta os conceitos básicos para a elaboração e utilização de métodos. Espera-se que o leitor adquira conhecimento suficientes para criar seus próprios métodos. Métodos soa trechos de códigos que permitem modularizar um sistema, isto é, são pequenos blocos que, juntos, compõem um sistema maior. Os métodos recebem um determinado nome e podem ser chamados varias vezes durante a execução de uma classe, ou seja, é uma sub-rotina que pode ser invocada toda vez que sua funcionalidade for necessária em um trecho da classe ou ainda a partir de outra classe. Os principais motivos que levam a utilizar métodos se referem à redução do tamanho total do código de um sistema, à melhoria da modularização do sistema (cada trecho de código realiza uma tarefa) e à facilitação e agilização do processo de manutenção. Considere o método um programa autossuficiente que possui internamente todas as definições necessárias para seu funcionamento, no entanto ele compõe um sistema maior do qual é membro. O método pode ser comparado ao setor de uma empresa especializado numa determinada tarefa. Para ilustra estes conceitos, imagine um grande sistema (envolvendo muitas classes em Java) em que existe a necessidade de verificar se uma determinada data é valida. Imagine ainda que em diversas aplicações isso deve ser realizado, isto é, a mesma validação de data dever ser realizada em diversas classes. Um programador pouco experiente talvez repita o mesmo trecho de programa em diversas classes no sistema. Isso não é bom, pois alem de o código dos programas fica maior, pode ser preciso alterar alguma coisa na rotina. Por exemplo, a data era considerada com dois dígitos para o ano e depois foi necessário tratá-la para ser aceita com quatro dígitos. É preciso alterar todas as classes que utilizam essa validação. Suponha que em 15 casses diferentes, com diversos métodos distintos em cada uma, essas rotina fosse utilizada. Seria necessário alterar e compilar as 15 classes novamente. Por outro lado, se essa rotina de validação estivesse armazenada na forma de método em uma classe, todas as outras classes poderiam usar (importar) esse método. E melhor ainda, caso alterações no método fossem necessárias, apenas ele seria alterado e todas as classes que o utilizam seriam atualizadas automaticamente. Caso este exemplo não tenha sido muito bem compreendido, Linguagem de Programação Página 1
não se preocupe, pois os exemplos que seguem vão tornar estes conceitos mais claros. Um método pode invocar outro método, isto é, durante a execução do método1 pode ser necessária à execução do método2 que pode invocar o método3 e assim por diante. Todo método possui uma declaração e um corpo, cuja estrutura simplificada é formada por: modificador-de-acesso tipo-do-retorno nome-do-método ([lista-de-argumentos]) { Sendo: código do corpo modificador-de-acesso: Define a visibilidade do método. A Sun define como nível de acesso (accesslevel) do método. Trata-se de uma forma de especificar se o método é visível apenas à própria classe em que esta declarada, ou pode ser visualizado (e utilizado) por classes externas. O modificador de acesso do método pode ser do tipo: public: o método é visível por qualquer classe. É o modificador de acesso mais aberto no sentido de que qualquer classe pode usar esse método. private: o método é visível apenas pela própria classe. É o modificador mais restrito. protected: o método é visível pela própria classe, por suas subclasses e pelas classes do mesmo pacote. Tipo-de-retorno: refere-se ao tipo de dado retornado pelo método. Métodos que não retornam valores devem possuir nesse parâmetro a palavra void. Sempre que void for usada em uma declaração de método, nenhum valor é retornado após sua execução, isto é, o metodo atua com uma procedure de outras linguagens de programação. Um método pode ter como retorno qualquer tipo primitivo (int, float, double, etc.), um vetor (abordado mais a frente) ou ainda um objeto qualquer. Nome-do-método: pode ser qualquer palavra ou frase, desde que iniciada por uma letra. Se o nome for uma frase, não podem existir espaços em branco entre as palavras. Como padrão da linguagem Java, o nome de um método sempre inicia com uma palavra com letras minúsculas. Se outras palavras forem necessárias, então elas devem iniciar com maiúsculas. São exemplos de nomes de métodos de acordo com o padrão da linguagem: imprime, imprimefrase, gravearquivotexto. É importante dar os métodos nomes sugestivos, ou seja, que identificam facilmente a tarefa executada pelo método. Lista-de-argumentos: trata-se de uma lista de variáveis opcionais, que podem ser recebidas pelo método para tratamento interno. Quando um método é invocado (chamado), ele ode receber valores de quem o chamou. Esses valores podem ser manipulados internamente e devolvidos ao emissor da solicitação. Esse processo ser comparado ao de fabricação industrial: entra matéria-prima (os valores passados ao método) e sai um produto acabado (o retorno do método). Um mesmo Linguagem de Programação Página 2
método pode receber diferentes tipos de variáveis, desde tipos primitivos até objetos complexos. Códigos do corpo: trata-se dos códigos Java que realizam os processos internos e retornam os valores desejados, isto é, constituem o programa do método. O nome do método e a lista de argumentos formam a assinatura do método, algo que identifica de maneira única. Toda vez que um método for invocado (chamado), a assinatura deve ser obedecida, uma maneira que torna possível identificar um método em relação aos demais. Se a assinatura for diferente, ou seja, se qualquer um dos componentes não coincidir com a declaração, o método não pode ser utilizado. Voltaremos a falar sobre a assinatura à medida que os exemplos forem analisados. Existem ainda outros aspectos referentes à declaração de métodos que serão citados em momentos oportunos, como, por exemplo, o uso da palavra static em que os métodos podem ser acessados sem a necessidade de instancia um objeto. 2.1. Métodos sem retorno Não retornam valores e são semelhantes às procedures encontradas na maioria das linguagens de programação. Os métodos que não retornam valores devem ser definidos como void. Desta forma, todos os métodos sem retorno observam a seguinte estrutura: modificador-de-acesso void nome-do-método ([lista-de-argumentos]) { código do corpo Além de diversos conceitos apresentados sobre métodos, eles podem ser usados também para a criação de outra linguagem, a partir da linguagem original. Considere método println() da classe System, utilizado varias vezes em exemplos anteriores (System.out.println(... )). É possível para um desenvolvedor criar um método chamado imprima() que faça exatamente o mesmo que println, como será demonstrado em seguida. Algumas declarações possíveis de métodos sem retorno podem ser as seguintes: 1. public void imprime() 2. public static void imprime() 3. private void imprimefrase() 4. protected void gravearquivotexto() Importante As declarações 1 e 2 são praticamente as mesmas, com a seguinte diferença: a 2 possui a palavra static na declaração do método. Isso faz com que o método seja considerado um método de classe, fato que não obriga a criação deu um objeto para chamá-lo. Esse aspecto torna o aprendizado um pouco mais simples. Por esse motivo, todos os métodos declarados nessas aulas serão definidos como static. Linguagem de Programação Página 3
Passando ao lado pratico da utilização, será mostrado um exemplo de método em que ele é chamado para que uma mensagem seja apresentada na tela. Na realidade, este pequeno exemplo talvez não tenha utilidade pratica, pois possui um meto que imprime na tela sempre a mesma mensagem. O exemplo mostra a chamada de um método (imprime) que imprime na tela uma frase qualquer. public class TesteMetodo { public static void main (String args[]) { imprime(); // invocação do método private static void imprime() { // declaração do método System.out.println("Aprendendo a Linguagem Java"); A classe TesteMetodo possui dois métodos: main() e imprime(). Esta é a primeira vez que um exemplo com dois métodos aparece. Observe que cada método possui um inicio, e um encerramento por meio de abre e fecha-chaves. Todas as vezes que um método for declarado, ele dever ser obrigatoriamente possuir uma chave inicial e uma final. A chave da classe TesteMetodo envolve os dois métodos. Isso e necessário porque a classe envolve todos os métodos que possui. Ao ser executada a classe TestaMetodo, é invocado automaticamente o método main enquanto o método imprime será invocado a partir de uma chamada de dentro do método main. É muito comum em Java um método chamar outro. Quando isso ocorre, a execução do método é suspensa e inicia-se a execução do método externo, no caso o método imprime. A chamada do método deve corresponder exatamente à sua declaração, ou melhor, à sua assinatura. Quando invocado, o método deve possuir o mesmo tipo de retorno, o mesmo nome e o mesmo número de argumento. Observe a assinatura do método imprime. Ela possui o nome imprime e não recebe nenhum tipo de argumento (nada dentro dos parentes). Agora observe a invocação do método imprime dentro do método main. O resultado da execução do meto não é atribuído a nenhuma variável, pois ele não tem retorno. Conforme descrito anteriormente, quando declarada à palavra reservada void, significa que não existe um valor de retorno. O método declarado como público (public), como já discutido, possibilita que ele seja utilizado externamente à classe em que é declarado. Um tipo de método de maior utilidade é aquela que recebe argumento e faz algum processamento com eles. São os métodos que recebem argumentos dentro dos parênteses. O próximo exemplo demonstra o uso de um método com passagem de argumento. O exemplo a seguir utiliza-se de um método para imprimir o conteúdo de uma variável String qualquer, funcionando de maneira similar a System.out.println(). Linguagem de Programação Página 4
public class TesteMetodoComArgumento { public static void main (String args[]) { String frase1 = "Sou muito"; String frase2 = "feliz porque sei"; String frase3 = "que Deus me ama!"; limpatela(); tela(frase1); // invocação do método tela(" "); tela(frase2); tela(" "); tela(frase3); public static void tela(string texto) { // declaração do método System.out.println(texto); public static void limpatela() { // declaração do método for(int i=1;i<=25;i++) { System.out.println(); A assinatura usada para invocar o método tela que recebe um argumento é tela(frasen), em que: tela e o nome do método que corresponde ao nome declarado frasen é o conteudo que será enviado ao método, ou seja, o método é invocado e recebe uma variável do tipo String. Além de uma variável, o método pode receber diretamente uma cadeira de caracteres, conforme usado em tela( ), em que um espaço em branco é enviado para ser impresso na tela. Ao declarar o método public static void tela(string texto), foi informado, entre parênteses, o tipo de variável a ser recebido (String texto). Este aspecto é muito importante: ao invocar um método, o tipo de variável a ser enviado deve corresponder ao tipo da variável declarado no método. Quando o método for invocado, a variável texto receberá a String enviada. O método limpatela, ira imprimir 25 linhas em branco na tela, provocando a sensação de que a tela foi limpa. O próximo exemplo apresenta outra classe com dois métodos que ano retornam valores (além do main) e são executadas em cascata, uma vez que o método main chamará tela que chamara tempo. Linguagem de Programação Página 5
public class TestaMetodoComArgumento2{ public static void main (String args[]) { String frase1 = "Sou muito"; String frase2 = "feliz porque sei"; String frase3 = "que Deus me ama!"; tela(frase1); // invocação do método tela(frase2); tela(frase3); public static void tela(string texto){ // declaração do método texto System.out.println(texto); tempo(1); public static void tempo(int segundos){ // declaração do método segundos try { Thread t; t = new Thread(); t.start(); t.sleep(segundos * 1000); catch (InterruptedException e) { Neste exemplo foi incluído um novo método, chamado tempo, que funciona como um temporizado durante a execução do programa. Ele realiza a mesma função que delay de outras linguagens de programação. Quanto maior o numero passado dentro dos parênteses (note que é um argumento inteiro) no momento de invocar esse método, maior será a temporização controlada pela variável segundo. O método main, o método tela pede que o conteúdo das variáveis frasen seja impresso. No método tela existe o chamamento do método tempo em que é enviado um numero inteiro correspondente à duração da temporização. Vale a pena considera que um método pode receber mais de um argumento do mesmo tipo ou não. Veja as declarações seguintes public static void tela(string arg1, String arg2) : informa que o método recebe dois argumentos do tipo string (arg1 e arg2). public static void tela(string arg1, int arg2) : informa que o método recebe um argumentos do tipo string (arg1) e um argumento do tipo inteiro (arg2). public static void tela(double arg1, int arg2, float arg3, String arg4) : informa que o método recebe um argumentos do tipo double (arg1), um argumento do tipo inteiro (arg2), um argumento do tipo float (arg3) e um argumento do tipo String (arg4). Linguagem de Programação Página 6
2.2. Métodos com Retorno de Valores Nos exemplos anteriores os métodos utilizados não retornavam nenhum valor (void), podendo ser comparados às procedures de outras linguagens de programação. Neste item são abordados métodos que retornam valores, os quais podem ser comparados às funções de outras linguagens. A sintaxe para a declaração de métodos que retornam valores é a mesma anteriormente apresentada, por exemplo: public static int soma(int x, int y) A declaração desse método informa que ele recebera dois argumentos inteiros (x,y) e retornara um numero do tipo inteiro (int). Os valores recebidos e retornados não precisam ser necessariamente do mesmo tipo, conforme aparece nesta declaração. Podem existir métodos que recebem números e retornam um string, recebem inteiros e retornam números com ponto flutuante, ou qualquer outra combinação. O exemplo abaixo apresentado em seguida demonstra a utilização de um método que recebe duas variáveis do tipo string e retorna a soma entre elas na forma de um numero do tipo inteiro. import javax.swing.*; public class TesteMetodoComRetorno { public static void main (String args[]) { String n1 = JOptionPane.showInputDialog(null, "forneça o 1º número inteiro"); String n2 = JOptionPane.showInputDialog(null, "forneça o 2º número inteiro"); int res = soma(n1,n2); JOptionPane.showMessageDialog(null, "Numeros fornecidos : " + n1 + ", "+ n2 + "\nresultado = " + res); public static int soma(string num1, String num2) { // declaração do método int x = 0,y = 0; try { x = Integer.parseInt(num1); y = Integer.parseInt(num2); catch(numberformatexception e) { JOptionPane.showMessageDialog(null, "Digite apenas caracteres numéricos!"); System.exit(0); // caso houver erro encerra o programa return (x + y); // retorna a soma dos argumentos passados Ao rodar a aplicação, o método main é executado e invoca a execução do método soma. O resultado da execução do método soma é armazenado na variável res, cujo tipo é o mesmo declarado para o retorno do método, isto é, inteiro. Ao invocar o método soma, são enviadas duas variáveis do tipo String que se referem aos valores fornecidos pelo usuário no momento da execução do programa (n1,n2). Veja que a assinatura do método e sua invocação são idênticas. Ao ser invocado, o método soma recebe duas variáveis do tipo String (num1 que recebe o conteúdo de n1 e num2 que recebe o conteúdo de n2), executa suas tarefas internas (entre chaves) e retorna um valor inteiro por meio da palavra return. Todo método que não for declarado como void, isto é, que retorna algum Linguagem de Programação Página 7
valor, necessita, obrigatoriamente, utilizar o método return() para retornar um valor. O valor retornado deve ser sempre do mesmo tipo declarado no método. O uso dos parênteses após a palavra return é opcional, apesar de ser esteticamente melhor. O exemplo mostrado, reforça a ideia de que nem sempre o tipo de retorno precisa ser igual ao tipo recebido, pois são recebidos valores do tipo String, que são convertidos em valores inteiros, e sua soma é retornada também no tipo inteiro. Uma classe pode possuir tantos métodos quantos forem necessários. Este exemplo poderia ter um método para cada operação matemática, ou seja, um para subtração, um para divisão, um para multiplicação ou ainda qualquer outro método. Desde que devidamente declarado. Os métodos representam um dois mais importantes recursos de programação, uma vez que sua funcionalidade pode ser reaproveitado em diferentes programas. Por exemplo, é possível a criação de métodos especialistas para a entrada de dados, pois um método possibilita a digitação de dados do tipo inteiro, outra de dados do tipo double, outra de dados do tipo String e assim por diante. Com isso toda vez que uma entrada via teclado for necessária, um método pode ser invocado. Linguagem de Programação Página 8