1. Variáveis ​​estáticas

Quando uma classe é carregada na memória, um objeto estático é criado imediatamente. Este objeto armazena variáveis ​​de classe estáticas (campos de classe estática). O objeto estático existe mesmo que nenhum objeto comum (não estático) da classe tenha sido criado.

Quando declaramos variáveis ​​em uma classe, indicamos se elas serão criadas apenas uma vez, ou se devem existir instâncias distintas dessas variáveis ​​em cada objeto. Por padrão, uma nova cópia de cada variável é criada para cada objeto.

Uma variável estática é vinculada ao objeto estático da classe e sempre há uma única instância dela.

Para criar uma variável estática em uma classe, você precisa escrever a staticpalavra-chave antes de seu nome. O formato geral para declarar uma variável estática é:

static Type name = value;

Se uma variável estática não receber um valor inicial, ela será inicializada com um valor padrão:

Tipo Valor padrão
byte
0
short
0
int
0
long
0
float
0.0
double
0.0
char
'\u0000'
(a mesma coisa que
0
)
boolean
false
Object
e qualquer aula
null

Exemplos:

Código Observação
public static int WIDTH = 100;
public static String message = "Hello";
private static Scanner console;
private static int count = 0;
private static boolean flag;

Dentro de uma classe, você pode se referir a suas variáveis ​​estáticas simplesmente usando seus nomes. Mas para acessá-los de outra classe, você precisa escrever o nome da classe antes do nome da variável estática.

ClassName.variable

Exemplo:

Variável Aula Acessando uma variável fora de sua classe
public static int WIDTH = 100;
Solution
Solution.WIDTH
public static String message = "Hello";
Main
Main.message
private static Scanner console;
JavaGame
A variável é private. Não é visível fora da classe.
private static int count = 0;
Counter
A variável é private. Não é visível fora da classe.
private static boolean flag;
Arithmetic
A variável é private. Não é visível fora da classe.


2. Diferença entre variáveis ​​estáticas e não estáticas

As variáveis ​​não estáticas (comuns) de uma classe são declaradas da mesma forma que as estáticas, apenas sem a staticpalavra-chave.

Qual é a diferença entre variáveis ​​comuns e variáveis ​​estáticas?

As variáveis ​​comuns de uma classe são vinculadas aos objetos da classe (instâncias da classe), enquanto as variáveis ​​estáticas são vinculadas ao objeto estático da classe.

Se houver várias instâncias de uma classe, cada uma delas terá sua própria cópia das variáveis ​​não estáticas (comuns). As variáveis ​​estáticas de uma classe são sempre armazenadas em seu objeto estático e existe apenas uma única instância delas.

Você pode acessar as variáveis ​​comuns (campos) de uma classe somente se tiver uma referência a um objeto da classe. E dentro dos métodos da classe, é claro.

Exemplo:

Acessando um campo de uma classe usando uma referência de objeto
public class DataInfo
{
   public int value = 100;
}

public class Solution
{
   public static void main(String[] args)
   {
      DataInfo info = new DataInfo();
      System.out.println(info.value);
   }
}

Você pode acessar variáveis ​​estáticas de qualquer lugar (depois de contabilizar os modificadores de visibilidade): de métodos comuns, de métodos estáticos da mesma classe, de métodos de outras classes, etc.

Exemplo:

Acessando um campo estático de uma classe sem usar uma referência de objeto
public class DataInfo
{
   public static int value = 100;
}

public class Solution
{
   public static void main(String[] args)
   {
      System.out.println(DataInfo.value);
   }
}

Como a memória é organizada:

Digamos que temos uma Personclasse com 4 campos: dois são estáticos e dois não.

public class Person
{
   public static int count = 0;
   public static int sum = 0;
   public int age = 0;
   public String name;
}

Imediatamente após carregar a classe

Quando a máquina Java terminar de carregar a Personclasse, a memória ficará assim:

Depois de criar o primeiro objeto

Se criarmos um Personobjeto, então a imagem se torna esta:

Diferença entre variáveis ​​estáticas e não estáticas 2

Observe que, embora ambos os objetos tenham duas variáveis, elas são variáveis ​​diferentes: os objetos comuns têm variáveis ​​comuns e o objeto estático tem variáveis ​​estáticas.

Precisamos de mais objetos

Vamos criar mais dois Personobjetos. Agora a memória ficará assim:

Diferença entre variáveis ​​estáticas e não estáticas 3

Observe que cada objeto tem suas próprias variáveis ​​de idade e nome.



3. Removendo e adicionando o staticmodificador

De estático a comum

O que acontece se pegarmos uma variável estática e a transformarmos em uma variável comum removendo seu staticmodificador? Por exemplo, a static int sumvariável.

O código modificado ficará assim:

public class Person
{
   public static int count = 0;
   public int sum = 0;
   public int age = 0;
   public String name;
}

Agora a memória fica assim:

Diferença entre variáveis ​​estáticas e não estáticas

A variável estática desapareceu do objeto estático e agora cada objeto comum tem sua própria sumvariável.

Do comum ao estático

Podemos fazer o oposto: adicionar o staticmodificador às variáveis ​​comuns de uma classe. Eles desaparecerão de todos os objetos comuns e aparecerão no objeto estático. Suponha que decidamos tornar as variáveis age​​e nameestáticas. Então o código ficará assim:

public class Person
{
   public static int count = 0;
   public int sum = 0;
   public static int age = 0;
   public static String name;
}

E agora a memória ficará assim:

Removendo e adicionando o modificador estático