sexta-feira, 28 de março de 2008

[14] Entendendo métodos - PARTE 1 DE 3

Os métodos são as ações de uma classe. Até agora criamos métodos apenas para exibir mensagens no Console, e utilizamos alguns métodos já prontos de outras classes, como o nextInt() da classe Scanner, por exemplo. Neste Post vamos aprender um pouco mais sobre as estruturas dos métodos e como realizar cálculos matemáticos simples dentro dos métodos.


Estrutura básica de declaração de um método


MODIFICADOR DE ACESSO TIPO DO RETORNO IDENTIFICADOR (PARÂMETROS)


Observe esta declaração do método imprimir():

public void imprimir(){
//seus comandos de impressão
}
public: é um dos quatro modificadores de acesso existentes na linguagem Java. Falaremos sobre modificadores de acesso em Posts posteriores.

void: é um tipo de retorno "vazio". Isto significa dizer que o método imprimir() não retornará nenhum valor. Entraremos em detalhes sobre os tipos de retorno adiante.

imprimir: identificador do método. É através do identificador que um método pode ser chamado. Por exemplo, para o método imprimir ser chamado teríamos o seguinte código deve ser chamado:

imprimir();

(): dentro dos parênteses devem ser informados quais parâmetros o método requer para que possa ser chamado. No caso do método imprimir(), nenhum parâmetro foi informado.


Tipos de retorno


Um método pode retornar valores tanto do tipo primitivo quanto valores do tipo referência. Além desses tipos, um método pode retornar um valor especial, que representa "vazio". Tal valor é representado pela palavra-chave void. Caso o tipo de retorno NÃO seja void, a palavra-chave return deve ser chamada. Esta palavra-chave encerra o método e retorna o valor desejado.

Embora um método possa conter mais de uma instrução return, apenas uma das instruções return será chamada (a primeira que o compilador encontrar, dependendo do fluxo de execução). Isso quer dizer que um método só retorna um valor a cada vez que ele é chamado.

Retornando void

Quando na declaração de um método está definido que ele retornará void, isso implica em dizer que tal método não retornará valor algum. Qualquer tentativa de retorno de valor causará um erro de compilação. Observe um exemplo válido de um método com tipo de retorno void:

public void imprimeNomes(){

System.out.println("Java");
System.out.println("Imediato");
System.out.println("Seu tutorial Java");

}

Caso alguma tentativa de retorno ocorra, o compilador acusará um erro. Observe este exemplo:

public void imprimeNomes(){

System.out.println("Java");
System.out.println("Imediato");
System.out.println("Seu tutorial Java");

//retorno
return 40;

}
O seguinte erro será acusado pelo compilador:

Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Void methods cannot return a value


Quando o tipo de retorno do método é void, a instrução return pode ser utilizada para finalizar o método, mas não para retornar um valor. Observe este exemplo:

public void imprimeNomes(){

System.out.println("Java");
System.out.println("Imediato");
System.out.println("Seu tutorial Java");
return;

}
Este código está livre de erros. Quando o compilador ler a instrução return, ele vai simplesmente finalizar o método. Nenhuma ação funcional ocorrerá. Porém, se você inserir neste método alguma instrução abaixo do return, o compilador lhe exibirá a seguinte mensagem:

Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Unreachable code

Isto quer dizer que há códigos no método que não podem ser alcançados. Isto ocorre porque o return finaliza o método, desde já não faria sentido para o compilador existir instruções que não serão alcançadas dentro do método.


Retornando Tipos Primitivos

Como visto no Post 11, os tipos primitivos são:
  • * char
  • * byte
  • * short
  • * int
  • * long
  • * float
  • * double
  • * boolean
Desde já um método pode retornar qualquer um desses tipos de acordo com sua finalidade. Observe este método que calcula a soma de 5 + 10:

public int somar(){

return 5 + 10;

}
Note que a soma 5+10 retorna um número inteiro: 15. Logo, não seria viável, por exemplo, definir void como tipo de retorno do método somar() . Isto causaria o seguinte erro de compilação:

Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Void methods cannot return a value


Observe agora o método a seguir. Ele retorna um valor do tipo boolean:

public boolean retornarVerdadeiro(){

return true;

}
Qualquer outro valor retornado no método retornarVerdadeiro() que não seja do tipo boolean causará um erro de compilação, como no exemplo abaixo:

public boolean retornarVerdadeiro(){

return 30606f;

}
O seguinte erro de compilação será acusado:

Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Type mismatch: cannot convert from float to boolean



Retornando Tipos de Referência

Vimos no Post 12 que variáveis do tipo referência referenciam objetos, e é justamente um objeto que um método deve retornar caso seu tipo de retorno seja um tipo referência. Porém, o tipo de retorno especificado na declaração do método deve ser o tipo exato do objeto que o método deve retornar (ou subclasses do tipo informado. Estudaremos este detalhe em Posts posteriores).

Dada uma classe Pessoa:

public class Pessoa{

//atributos
String nome;
String idade;

//métodos
public void imprimirNome(){
System.out.println("NOME: "+nome);
}

}

Vamos declarar em uma classe qualquer o seguinte método:

public Pessoa retornarPessoa(){

Pessoa p = new Pessoa();
p.nome = "ANDRÉ";
p.idade = 23;

return p;

}
Este método está declarado corretamente e compilará sem erros. Note que o tipo de retorno de retorno é Pessoa, classe que criamos anteriormente. Lembre-se, um tipo de referência é uma classe.

O seguinte método também é válido:

public String retornarString(){

return "Uma string qualquer";

}
String também é um tipo, e "Uma string qualquer" é um objeto do tipo String. Mas, por favor, não se aborreça com este detalhe agora, pois estudaremos este detalhe em Posts Posteriores. Você pode iniciar uma pesquisa sobre isto para adiantar seus estudos. O seguinte método apresenta um erro. Tente identificá-lo antes de ler o comentário sobre ele:

public Pessoa retornarPessoa(){

Pessoa p = new Pessoa();
p.nome = "Juliana";
p.idade = 27;

return Pessoa;

}

Se você apontou que o erro está no momento do retorno, você está correto(a). O tipo de retorno deve ser um OBJETO Pessoa, e não a CLASSE Pessoa. Neste caso deveríamos retornar o objeto p para satisfazer o tipo de retorno exigido no método.

Bem, encerramos por aqui a primeira parte do tópico Entendendo métodos.

Um abraço e até a próxima

0 comentários: