java - Dúvida: Qual diferença entre Variável de Instância e Variável Estática (Variável de Classe)?
Perguntas � java � Dúvida: Qual diferença entre Variável de Instância e Variável Estática (Variável de Classe)?
Dúvida: Qual diferença entre Variável de Instância e Variável Estática (Variável de Classe)?
Fiz a formação java Caelum e comprei o livro Java SE 7 Programmer I (Guilherme Silveira e Mário Amaral - Casa do Código) para estudar para a certificação, mas nem tanto pela certificação em si, mas para me aprofundar nos conceitos do java.
Acabei ficando com uma dúvida no capítulo de Escopo de Variáveis: qual a diferença entre Variável de Instância e Variável Estática (Variável de Classe)?
Se na variável estática eu posso utilizá-la sem a necessidade de ter uma referência, qual exemplo prático reflete essa afirmação?
Diga o que você já leu e a quais conclusões chegou, porque é um assunto facilmente pesquisável e, com base no que você disser, poderemos clarear os pontos em que você teve dificuldade de compreensão
— TerraSkilll 24 de mar de 2015
Uma variável de instância é diferente para cada objeto. Uma variável estática é a mesma para todos os objetos daquela Classe.
public int patas = 0;
public static int tetas = 0;
Cachorro c2 = new Cachorro();
c1.patas = 4;
c2.patas = 3;
c1.tetas = 0;
c2.tetas = 8;
System.out.println("c1.patas: " + c1.patas);
System.out.println("c2.patas: " + c2.patas);
System.out.println("c1.tetas: " + c1.tetas);
System.out.println("c2.tetas: " + c2.tetas);
Este código imprimirá em tela o seguinte:
c1.patas: 4
c2.patas: 3
c1.tetas: 8
c2.tetas: 8
Além disto, as variáveis estáticas podem ser acessadas sem a necessidade da criação de um objeto (o uso de um construtor), o que variáveis de objeto não podem. Por exemplo:
System.out.println(Cachorro.tetas); // isso funciona
System.out.println(Cachorro.patas); // isso NÃO funciona
As variáveis estáticas são carregadas quando a JVM carrega a classe e não no uso do Construtor (como nas de objeto)
Imagina uma classe Conta, ela tem a seguinte variáveis: numero, titular, saldo, limite. Essas variáveis é chamadas de atributos de instância.
/*  Atributos */
Agora imagina essas variaveis que são colocadas em um metodo main por exemplo, essas são chamadas de OBJETO.
Conta minhaConta = new Conta(); // Objeto do tipo Conta
Agora Imagina que eu quero saber quantos objetos Conta estão instanciado, eu varia isso :
Note que toda vez que eu tentar pegar o totalDeContas ele sempre será 1, porque quando é criando um objeto é gerador outro valor, porque é outro espaço de memoria que esta sendo alocado, mas eu quero somente um totalDeContas no meu sistema.
Para isso usamos o static, no qual o atributo de instância será transformado para Atributo de Classe