A declaração e uso de métodos/funções no Java exigem o cumprimento de algumas regras que se assemelham a boa parte das linguagens de programação. No entanto, ao contrário do JavaScript, por exemplo, a declaração de um método no Java não exige o uso de nenhuma palavra reservada, exige, porém, que seja informado o tipo de retorno que ela terá. Ou seja, se um método tem como resultado uma String, por exemplo, este tipo tem que ser informado antes do nome que será dado ao método, como mostrado no código abaixo.

Neste método, os parâmetros a e b, ambos Strings, são concatenados (unidos) e retornados (o que é indicado pela palavra reservada return). No entanto, existem métodos que não possuem retorno, eles apenas realizam algumas operações e finalizam por si só. Nestes casos, é usada a palavra reservada void. Por exemplo:

Além do tipo de retorno e o nome, o método também deve indicar quais são os parâmetros (e seus respectivos tipos) que devem ser passados para que ele funcione. No primeiro exemplo, a função uneDuasStrings() têm dois parâmetros, listados como a e b (a escolha do nome dos parâmetros também é arbitrária). No segundo exemplo, a função exibeMensagemNoConsole() não tem nenhum parâmetro, logo, os parênteses ficaram vazios. Não há um limite para o número de parâmetros que um método pode ter, mas, uma grande quantidade pode indicar uma falha na arquitetura do código.

A declaração de um método também conta com o modificador de acesso no início que sinaliza quem poderá ter acesso a ele. No final, um método tem a seguinte estrutura:

Figura 1 - Estrutura de um método no Java.

Toda a parte do método que está fora do seu corpo (antes das chaves) é chamado de assinatura do método. São as informações que indicam para o usuário como usá-la, por isso possuem este nome. Muitos também se referem como sendo o contrato para uso do método. Esta estrutura é primordial no uso de interfaces na orientação a objetos.

Depois de declarada, uma função precisa ser chamada para que possa ser executada. Esse processo é chamado de invocação de um método. Para isso, basta usar o nome do método acompanhado dos parênteses. Se o método exigir parâmetros, eles devem ser inseridos dentro dos parênteses, sem a necessidade de indicar o tipo. No exemplo abaixo, a função soma() recebe dois parâmetros por referência, ou seja, um ponteiro para a referência em memória das informações é enviado de tal modo que a função consegue acessar e manipular esses valores.

Outro aspecto interessante sobre os métodos no Java é que eles podem ser sobrescritos. Na prática, isso acontece quando há herança entre classes, ou seja, uma classe pai possui métodos que podem ter seu comportamento alterado nas classes filhas. Como todos os objetos no Java são extensões da classe Object, já existem alguns métodos que podem ser sobrescritos por qualquer classe. Esse processo é chamado de sobrecarga e é marcado no Java com a notação @Override. Um exemplo é o método equals() que pode – e em muitas situações deve – ser sobrescrito para descrever como dois objetos se diferenciam.

Por fim, métodos podem invocar a si mesmos. Esse processo é chamado recursividade. No exemplo abaixo, um método invoca a si mesmo até chegar no resultado.

Herança

herança é um mecanismo disponível nas linguagens de programação que se apoiam no paradigma de objetos que possibilita que características comuns a diversas classes sejam reunidas em uma classe base. A partir desta base, as demais classes podem ser especificadas de modo que cada classe derivada (ou subclasse) apresente características e comportamentos herdados da classe base e outras que foram definidas exclusivamente para elas. Na prática, isso significa reunir todas as características comuns entre várias entidades e a partir disso criar uma base em que todas elas se baseiam. Em resumo, as características e comportamentos de uma classe (base) são herdadas a outras classes (subclasses).

Um exemplo prático clássico é uma possível entidade Pessoa em sistemas que exigem cadastro. Geralmente a classe que representa uma pessoa física tem características comuns, tais como: nome, idade, endereço… No entanto, é possível abstrair desta entidade características mais específicas de acordo com o papel dela em uma empresa, por exemplo: vendedor, cliente, diretor… e assim por diante. Cada um destes papéis podem ter características e comportamentos diferentes, no entanto, todos eles parte do princípio de que é uma pessoa atuando, logo, apesar das particularidades, todos possuem nome, idade, endereço e todas as demais características da classe base.

Herança é sempre utilizada em Java, mesmo que não explicitamente. Quando uma classe é criada e não há nenhuma referência à sua classe base, implicitamente a classe criada é derivada diretamente da classe Object. É por esse motivo que todos os objetos podem invocar os métodos da classe Object, tais como equals() e toString().