HOWTO · Java

O que significa estático em Java

Este artigo apresenta a palavra-chave estática em Java.

Nesta página

Na linguagem Java, static é uma palavra-chave que pode ser usada em vários lugares. A palavra-chave static é usada junto com uma variável de membro, funções de membro, blocos e classes aninhadas. A aplicação de palavras-chave estáticas é onde não queremos criar uma nova instância todas as vezes. Em vez disso, o usamos em locais onde a única cópia é compartilhada dentro da classe. Variáveis ​​estáticas são armazenadas na memória heap, que é um tipo de memória permanente.

Uso da palavra-chave static junto com variáveis ​​de membro em Java

O bloco de código explica como a variável estática é diferente das variáveis ​​não estáticas.

public class StaticVariableUsage {
  public static void main(String[] args) {
    InnerClass in = new InnerClass();
    InnerClass in1 = new InnerClass();

    InnerClass2 in2 = new InnerClass2();
    InnerClass2 in3 = new InnerClass2();
  }

  static class InnerClass {
    static int var4 = 0;
    InnerClass() {
      var4++;
      System.out.println("static variable : " + var4);
    }
  }

  static class InnerClass2 {
    int var5 = 0;
    InnerClass2() {
      var5++;
      System.out.println("non-static variable : " + var5);
    }
  }
}

No bloco de código acima, há uma classe pública chamada de classe StaticVariableUsage. Possui um método estático e duas classes internas. A classe interna chamada InnerClass tem uma variável inteira estática var4 e é iniciada com zero. A classe tem um construtor que incrementa a variável inteira estática e imprime seu valor.

Outra classe interna tem o nome InnerClass2 e contém uma variável não estática var5. Esta classe também possui um construtor que incrementa a variável não estática e imprime seu valor.

Passando para o método main, aqui, InnerClass e InnerClass2 são instanciados duas vezes. A análise pode ser derivada quando a chamada do construtor acontece e um objeto é instanciado com uma nova palavra-chave.

Como diz a saída, a variável estática é iniciada e preservada. O valor é incrementado pela primeira vez e imprime o valor como 1. Da próxima vez, quando criarmos outra instância, o construtor será chamado novamente. Mas a variável estática não é reinicializada com zero novamente. Em vez disso, o valor armazenado anteriormente é incrementado, tornando o valor da variável estática dois.

Da mesma forma, quando uma instância de InnerClass2 é criada, cada vez que uma variável não estática é inicializada com o valor 0. Portanto, ele imprime o valor como 1 na saída em ambas as vezes.

static variable : 1
static variable : 2
non-static variable : 1
non-static variable : 1

Uso da palavra-chave static junto com funções de membro em Java

Temos uma classe externa chamada classe StaticFunctionUsage que contém a outra classe interna na classe abaixo. InnerClass tem uma função estática. E outra classe interna chamada InnerClass1 tem um método não estático.

Agora, passando para o método main, é visto que a função estática é diretamente acessível com o nome da classe. Não precisamos instanciar o objeto InnerClass. Da mesma forma, quando tentamos acessar a função não estática function1 com o nome da classe, um erro em tempo de compilação é populado. Se quisermos acessar a função, a instância da classe precisa ser criada, que criamos com o nome de variável in. O uso da variável é para chamar function1 e é uma instrução válida.

public class StaticFunctionUsage {
  public static void main(String[] args) {
    InnerClass.function();
    // InnerClass1.function1();
    InnerClass1 in = new InnerClass1();
    in.function1();
  }

  static class InnerClass {
    static void function() {
      System.out.println("In the static function");
    }
  }

  static class InnerClass1 {
    void function1() {
      System.out.println("In the non-static function");
    }
  }
}

A saída do bloco de código acima é a seguinte.

In the static function
In the non-static function

Uso da palavra-chave static em um bloco em Java

O uso de blocos estáticos é para inicializar variáveis ​​estáticas. A execução do programa começa com o método main. Se um bloco estático estiver presente em uma classe, ele será executado antes da execução do método main.

Abaixo está o código explicando o bloco estático.

public class StaticBlock {
  static {
    System.out.println("In the static block");
  }

  public static void main(String[] args) {
    System.out.println("In the main method");
  }
}

A saída do código é a seguinte. Como podemos ver, a instrução no bloco estático é executada primeiro.

In the static block
In the main method