Métodos e Variáveis Estáticas


Variáveis e métodos estáticos pertencem à classe e não a uma instância. Isso quer dizer que eles podem ser utilizados sem ter que instanciar a classe. Além disso, quando esta classe for carregada, as variáveis estáticas serão compartilhadas por todos os objetos.
Variáveis estáticas não necessitam serem inicializadas, pois recebem o valor default, da mesma forma que variáveis de instância.
Utilizam-se variáveis estáticas para guardar valores que são específicos da classe e não de um objeto, ou seja, todos os objetos terão acesso à mesma cópia da variável estática. Isso quer dizer que quando a classe for chamada pela primeira vez pela JVM, a variável estática será inicializada; se essa variável for incrementada no construtor da classe, toda vez que essa classe for instanciada, essa variável será incrementada e esse valor será compartilhado para todas as instâncias.

public class Pessoa {  
      public static int cont = 0;
     
      public Pessoa() {
            cont++;
      }
     
      public static void main(String[] args) {
            Pessoa pessoa = new Pessoa();
            System.out.println(cont); //1
            pessoa = new Pessoa();
            System.out.println(cont); //2
            /* Qualquer parte do código que tiver
             * acesso a essa variável acessará
             * esse mesmo valor */
      }
}

Métodos estáticos não acessam variáveis de instância e métodos não estáticos, apenas variáveis estáticas e métodos estáticos, pois não há objeto criado no momento em que o método estático é chamado.

public class Aluno {   
      public int cod;
      public static int cont;
     
      public static void aprender() {
            /* métodos estáticos só podem acessar
             * variáveis e métodos estáticos */
            cont++;
            cod++;
            setMatricula();
            setNome();
      }
     
      public void fazerExercicio() {
            /* métodos não-estáticos podem acessar
             * variáveis e métodos de instância ou
             * estáticos */
            cont++;
            cod++;
            setMatricula();
            setNome();
      }
     
      public static void setMatricula() { }
     
      public void setNome() { }   
}

Acessando métodos e variáveis estáticas

Já que não é necessário ter um objeto para invocar um método ou uma variável estática, então a maneira utilizada para acessá-los é através do uso do operador ponto (.), onde se utiliza o nome da classe seguido do operador ponto e o nome do membro estático.
Entretanto, um membro estático também pode ser chamado através de um objeto. Mas mesmo acessando uma variável estática através de um objeto as regras são as mesmas.

public class Carro {   
      static String nome;
     
      public static String getNome() {
            return "Carro1";
      }
     
      public static void main(String[] args) {
            /* acessando a variável estática nome e o
             * método estático getNome através de
             * instanciação; as regras continuam
             * mesmo acessando dessa maneira */
            Carro carro = new Carro();
            carro.nome = "Carro";
            carro.getNome();
            /* Sintaxe correta para acessar métodos e
             * variáveis estáticas */
            Carro.nome = "Carro";
            Carro.getNome();
      }
}

Métodos estáticos não podem ser sobrescritos, mas podem ser reescritos.
Objetos instanciados como subclasse terão os métodos estáticos chamados apenas do tipo da referência e não do objeto. Por exemplo: se a classe A possui o método estático doA(), e esse método é redefinido na sua subclasse B como doA(), se A for instanciado como B (A a = new B();), o objeto só poderá chamar os membros estáticos de A, ao contrário do que ocorre com membros de instância, que serão chamados do tipo da referencia (B).


public class Prova {   
      public static void aplicar() {
            System.out.println("Prova");
      }    
}

public class Java extends Prova {
      /* redefinição (e não override) do
       * método aplicar de Prova */
      public static void aplicar() {
            System.out.println("Prova Java");
      }
     
      public static void main(String[] args) {
            Prova[] provas = { new Prova(),
                                      new Java(),
                                      new Prova() };
            for(int x = 0; x < provas.length; x++)
                  provas[x].aplicar();
            /* os métodos e variáveis estáticas
             * chamadas são sempre da referência
             * (Animal) e nunca do objeto */
      }    
}

Saída da execução:  Prova
    Prova
    Prova


Fonte: SCJP Sun Certifi ed Programmer for Java 6 Study Guide

0 comentários:

Postar um comentário