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 static
palavra-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 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
(a mesma coisa que
) |
|
|
e qualquer aula |
|
Exemplos:
Código | Observação |
---|---|
|
|
|
|
|
|
|
|
|
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 |
---|---|---|
|
|
|
|
|
|
|
|
A variável é private . Não é visível fora da classe. |
|
|
A variável é private . Não é visível fora da classe. |
|
|
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 static
palavra-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 |
---|
|
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 |
---|
|
Como a memória é organizada:
Digamos que temos uma Person
classe 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 Person
classe, a memória ficará assim:
Depois de criar o primeiro objeto
Se criarmos um Person
objeto, então a imagem se torna esta:
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 Person
objetos. Agora a memória ficará assim:
Observe que cada objeto tem suas próprias variáveis de idade e nome.
3. Removendo e adicionando o static
modificador
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 static
modificador? Por exemplo, a static int sum
variá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:
A variável estática desapareceu do objeto estático e agora cada objeto comum tem sua própria sum
variável.
Do comum ao estático
Podemos fazer o oposto: adicionar o static
modificador à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 name
está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:

GO TO FULL VERSION