O que é uma variável de instância?
Uma variável de instância é um dado na programação orientada a objetos que possui seu próprio valor exclusivo para cada objeto em que reside. As variáveis de instância também podem ser chamadas de membros da instância, campos não estáticos e membros de dados. Eles são uma parte importante da maioria dos objetos, mantendo partes específicas de dados que o objeto usa para o cálculo.
Por exemplo, se houver dois objetos, A e B, em que o objeto A possui uma variável de instância chamada "blá" e o objeto B também possui uma variável de instância chamada "blá", as duas variáveis "blá" são entidades distintas. Cada variável está associada ao objeto que a encapsula. O nome completo da variável "blá" associado ao objeto A é "A.blah", enquanto o nome completo da variável "blá" associado ao objeto B é "B.blah". Cada uma dessas variáveis pode ter seu próprio valor. Se os objetos A e B forem do mesmo tipo, e outro objeto desse tipo, C, for criado, e o objeto C também terá uma variável de instância "blah", que pode ter seu próprio valor exclusivo.
Variáveis de instância geralmente são confundidas com variáveis estáticas, mas as duas são significativamente diferentes. Ao contrário das variáveis de instância, das quais todos os objetos de um tipo específico têm suas próprias, as variáveis estáticas têm apenas um valor e esse valor é o mesmo para todos os objetos do tipo apropriado. Variáveis estáticas são freqüentemente chamadas de variáveis de classe, que não são iguais às variáveis de instância.
Dependendo das propriedades de visibilidade atribuídas a eles, as variáveis de instância podem ser visíveis apenas dentro de um objeto específico, para um objeto e suas subclasses ou para o objeto em que ele reside, bem como quaisquer outros objetos. Esse tipo final de visibilidade, chamado visibilidade pública, geralmente é considerado uma prática ruim para variáveis de instância, porque é fácil violar os princípios de encapsulamento na programação orientada a objetos. Apesar desse tabu, há momentos em que variáveis de instância pública são úteis. Por exemplo, muitas classes padrão em Java possuem variáveis de instância pública, o que às vezes permite fácil modificação de propriedades.
A visibilidade de uma variável de instância também entra em jogo com herança. Se uma classe herda de outra, isso não dá imediatamente a ambas as classes acesso às variáveis de instância uma da outra. As variáveis de instância privada na superclasse e subclasse permanecem restritas apenas a essas classes, portanto, uma variável privada na subclasse não pode ser vista pela superclasse e vice-versa. As únicas variáveis de instância que a superclasse e a subclasse podem ver são variáveis protegidas na superclasse.