Classes e Métodos Estáticos
Vamos a mais um importante conceito da POO, que são as classes e métodos estáticos. Elas são muito simples e seus nomes já são bastante sugestivos, mas antes de falarmos delas, vamos relembrar um pouco o conceito de classes.
Classes são a “receita” para a criação dos objetos, pois contém as instruções de todas as ações que eles poderão executar e ainda descrevem todos os atributos que o objeto possuirá. Então, sempre que instanciamos uma classe, geramos um novo objeto ativo na memória, e a partir disso podemos manipular seus atributos através de métodos. Vejam abaixo o exemplo de uma classe chamada "Carro", que contém dois atributos e métodos para inserir e ler o conteúdo destes.
Nós podemos criar quantas instâncias desse objeto quisermos e, a cada nova instância, um novo objeto é gerado na memória, conforme a figura abaixo:
Muito bem, esse é o funcionamento de uma classe comum. O que diferencia uma classe estática de uma classe não estática é que a estática não pode ser instanciada, portanto não gera essas múltiplas instâncias dos objetos na memória.
Quando o programa que referencia uma classe estática é carregado, ela é alocada na memória automaticamente, sem a necessidade de se chamar um construtor através da palavra reservada new, como acontece com as classes não estáticas. Essa classe estática permanecerá na memória durante toda a execução do programa e, a partir de qualquer local do código que se tentar recuperar seus valores, eles serão sempre os mesmos para todos os requisitantes, já que estaremos lidando com uma mesma fonte de dados, e não com várias, como pode acontecer com as classes não estáticas. É como se no início da execução do programa um objeto dessa classe estática fosse instanciado e não mais permitisse a instanciação de nenhum outro. Ele será único durante todo o tempo em que o programa permanecer sendo executado.
Vejam o que acontece quando eu altero o tipo da classe Carro para static:
A estrutura de uma classe estática é realmente diferente de uma não estática. A imagem acima mostra uma classe que tinha dois atributos, que eram a marca e o modelo, e métodos para acessa-los, seja para inserir essas informações ou para lê-las. Vejam como a estrutura de uma classe estática com as mesmas funções é mais simples:
Vale a observação de que os atributos da classe estática precisam ser estáticos também. Vejam o que acontece se eu tentar deixa-los não estáticos e compilar a aplicação:
Vou recolocar a palavra static depois do modificador de acesso public e demonstrar como é simples acessar esses atributos da classe estática "Carro".
Agora vejam como o acesso a esse membro da classe estática é feito:
Aqui farei uma observação importante. Os membros estáticos podem, sim, ter seu valor alterado durante a execução da aplicação, vejam esse complemento do código acima:
Faço a inserção do valor “FIAT”, depois o exibo em uma caixa de mensagens, em seguida troco esse valor por “GM”, então faço a exibição novamente. Vejam:
E, depois de clicar em OK:
Vejam que o valor foi alterado corretamente.
Agora vamos falar um pouco sobre os métodos estáticos. Eles, na verdade, possuem funcionamento igual ao de um método não estático. Nesse caso existe somente uma pequena mudança que se refere à classe, que agora não vai estar instanciada.
Criei, para usar de exemplo, um método chamado calculaPreco(int qtde), que recebe a quantidade de veículos vendidos por uma concessionária e, dependendo dessa quantidade, lhe fornece um desconto, retornando um preço final já com o desconto calculado, que pode ser de 2000 ou 4000 reais.
Criei um Textbox para o usuário digitar a quantidade de veículos vendidos e um botão para retornar o preço final, conforme figura abaixo:
Para o retorno e exibição do valor, o código ficou da seguinte forma:
Exibição do valor:
Também poderíamos atribuir esse valor de retorno a uma variável, que é o que normalmente acontece quando utilizamos métodos estáticos. Segue um exemplo:
Dessa forma é que funcionam as classes e métodos estáticos. Eles são de enorme importância, mas devem ser usados com cautela. É preciso que se saiba claramente qual classe ou membro você quer que fique disponível para todas as outras classes (ou instâncias delas), pois no fundo esse é o papel dos componentes estáticos.
Fazendo uma comparação grosseira, é como se eles fossem variáveis globais da aplicação, pois serão alocados na memória logo que ela for executada pela primeira vez e permanecerão lá o tempo todo. Use-os somente quando não necessitar manipular valores de membros da instância.
Se por um lado o código fica mais simples, por outro ele ocupa espaço na memória o tempo todo. Também é importante lembrar que os dados armazenados em uma classe estática não possuem uma identidade única, como acontece com as classes não estáticas. Para estas últimas podemos criar várias instâncias, cada um com um identificador e colocar dados diferentes neles. Isso não é possível com componentes estáticos.
Enfim, espero que tenha ficado claro todas as diferenças entre classes e métodos estáticos e os não estáticos. Com este tópico encerramos o minicurso de POO. Na sequência temos o de C#, que fará uso de vários conceitos aprendidos aqui.