quinta-feira, 26 de janeiro de 2012

Java: A Classe Principal e o Método Main

Dúvida recorrente na programação em Java é o tal método Main. Talvez essa dúvida seja explicada porque ele "tropeça" ou é uma exceção à orientação a objetos. Explicarei.


Antes, uma palavrinha sobre classe e objeto.

Como sabemos, Java é uma linguagem orientada a objetos. Nessa forma de programar, criamos objetos similares ao mundo real e fazemos com que eles interajam.É comum trabalharmos com classes, objetos e métodos. A confusão surge na distinção entre Classe e Objeto.

Fazendo uma analogia, imagine que queiramos construir um carro. O projeto desse carro, com seus atributos (tamanho, cor, potencia) e funções (acelerar, parar, frear) é o que chamamos Classe.  A partir do projeto, construímos o carro propriamente dito(objeto). Não podemos dirigir dentro do projeto do carro, dirigimos dentro do carro. Por isso, quando criamos um programa em Java, fazemos muitas classes e a partir delas construímos os objetos que atuarão no nosso sistema.

Para tornar mais visual, vamos criar a classe Carro:

public class Carro{

//Arqui defino características e funções (métodos) que o carro pode ter.

}

Até aqui criamos o projeto do carro. Ele ainda não existe.Para que exista, temos que criá-lo da seguinte maneira:

meuCarro = new Carro();

Agora sim existe o meuCarro, um objeto da Classe Carro. Assim como você existe, um objeto da classe Homo Sapiens (assim espero...).

Antes de explicar onde é que o método main entra nessa história, vamos primeiro entender como a linguagem do café é executada.

Quando escrevemos o código fonte de um programa em Java e o compilamos, ele é transformado em bytecode, que nada mais é que uma linguagem intermediária interpretada por uma máquina virtual,  a JVM (Java Virtual Machine). É a JVM que faz a ponte entre seu código fonte e a máquina, convertendo os bytecodes. Alguns criticam esse reprocessamento porque a linguagem perderia desempenho se comparada com outras, como o C, em que compilamos o código diretamente para linguagem de máquina.

Não é a intenção desse artigo entrar no mérito dessa discussão. Mas o leitor mais atento deve se perguntar: Por que diabos utilizar essa linguagem intermediária? A resposta tem um nome bonito: Portabilidade.

Portabilidade, nos ensina o dicionário, é a característica de um sistema que o torna capaz de ser executado em diferentes plataformas. Se o dispositivo tem uma JVM instalada,  seu programa rodará.(na teoria)

Mas a JVM tem de saber por onde começar. Ela está programada para executar o método main.É por isso que quando compilamos e executamos um arquivo, é o método main (principal) que primeiro executa.

A tendência é que cada sistema tenha somente um método main abrigado em uma classe principal, como acontece no C e C++, onde há somente uma função main para a aplicação toda. Porém, isto não é completamente verdadeiro para o Java e , em teoria, qualquer classe pode conter esse método.

Portanto é comum que tenhamos uma classe chamada "Principal" ou "Programa", que contem o método main, da seguinte maneira:

public class ClassePrincipal{

public static void main(String[] args) {

//Código a ser executado, o Adão e Eva do programa

}

}

Vamos entender a estrutura do código:

Criei a ClassePrincipal para abrigar nosso método main.

Na identificação da classe, temos um moderador de acesso public, isto quer dizer que esta é uma classe que pode ser chamada a partir de qualquer outra classe, ou seja, a condição de menor restrição possível.
class, como obviamente sugere, mostra que se trata de uma classe. Finalmente escrevemos o nome dela: ClassePrincipal.

Aqui um parênteses.É sempre bom seguir a padronização da escrita em Java, como escrever o nome da classe com as letras iniciais maiúsculas.Nada de inventar underline, ponto, espaço, etc. Como você entrará em contato com classes feitas por outras pessoas, classes nativas do Javax entre outras, acostumar-se às padronizações é requisito fundamental para desenvolver-se na área e não ficar reinventado a roda."escreva uma vez, rode em qualquer lugar”.

Embaixo definimos o método principal, novamente vemos o public assinalando tratar-se de um método público e, portanto, acessível a qualquer outra classe. O método main tem de ser público para que a máquina virtual Java o execute.

Outro possível moderador de acesso poderia ser protect, caso em que o método só poderia ser visível dentro do package específico. Poderia também ser friendly, assim o uso do método seria permitido dentro da classe que o contém e dentro de qualquer classe derivada desta.Outro é o private, que garante a privacidade do método deixando-o visível somente na classe em que se encontra.Finalmente temos o private protect; nesse caso o método é acessível pela classe que o contem e por qualquer classe derivada desta, porém, permitido apenas dentro de um mesmo arquivo-fonte.

Em seguida, temos a declaração static. Esse é o pulo do gato.

Se seguirmos a lógica da explicação sobre classe x objeto, essa ClassePrincipal nada poderia fazer enquanto não fosse criado (instanciado) um objeto dela. É como uma planta de uma sala – você não pode assistir TV na planta de uma sala, você assiste TV na sala.Porém, o método static foi criado justamente para se fazer a planta servir de sala.

Ou seja, quando criamos um método (função) dentro de uma classe e o declaramos como estático, podemos acessar esse método sem a necessidade de criar um objeto. E é exatamente isso que a JVM faz. Executa o método static main sem ter que criar um objeto da classe ClassePrincipal.

Apesar do static ser uma exceção ao mundo dos objetos, ele é muito útil. Como exemplo, tenho  em alguns programas uma classe chamada “conversor”, que faz uma série de funções, bastando para isso que eu o chame da seguinte forma “Conversor.métodoChamado(parâmetros);”, assim, não preciso criar um objeto da classe Conversor antes de utilizar o método. (isto cheira demais a linguagem procedural, quanto menos fizer, melhor)

Da mesma forma é o método main,, ele é static e vinculado à classe a qual pertence.

Outros possíveis modificadores de acesso seriam o abstract, final, native, synchronized, todos devidamente documentados.

Seguindo na estrutura do nosso código, o void marca que esse método não retorna valor algum.

E finalmente escrevemos o nome do método passando por parâmetro um array de string, que serão os argumentos: main (String[] args), tais argumentos servem para o caso em que se deseja executar o programa passando alguns parâmetros para o método main.

Portanto, ao compilar e executar esta classe, tudo que estiver dentro das chaves {} do método será executado pela JVM.

Para testar, experimente:


public class ClassePrincipal {


public static void main(String[] args) {

System.out.println("Método main executou, adão nasceu");


}

}

Até a próxima.
 
 
Copyright © Spalaor
Theme by Spalaor