Variável static

MINHA DÚVIDA

====================================================================================

Me corrijam se eu estiver errado, mas pelo que eu intendi, quando criamos um objeto que possui atributos, o que vai para memória não são os atributos indiciduais e sim o objeto completo com seus atributos e metodos.

Exemplo
um tipo primitivo, ao criarmos uma variável do tipo int estamos separando um local na memoria para atribuir um valor inteiro.

Quando criamos um objeto da seguinte classe

class Pessoa{ String nome; int idade; double peso; }

e ao chamarmos

new Pessoa();

na memória ele está separando um espaço para o objeto pessoa que possui esses três atributos nome, idade e peso,
e não separando espaços individuais para cada atributo.

nesse caso se eu criar

Pessoa p1 = new Pessoa(); Pessoa p2 = new Pessoa();

estou separando dois espaços na memória para armazenar dois objetos do tipo Pessoa, e cada um deles possuem três atributos distintos.

p1.nome e p2.nome são atributos distintos armazenados nos objetos Pessoas que estão na memória.


já se declararmos a variável nome do tipo static, a variável passa a não ser mais de cada objeto e sim da classe, então quer dizer que a partir dessa declaração, na memória haverá um espaço para a variável e dois espaços para os objetos,
então os atributos p1.nome e p2.nome farão referência ao espaço reservado para a variável ?

CONTEÚDO DA APOSTILA

=========================================================================

Pessoa to vendo aqui na apostila da CAELUM e diz o seguinte:

Nosso banco também quer controlar a quantidade de contas existentes no sistema. Como poderíamos fazer
isto? A idéia mais simples:

Conta c =new Conta(); totalDeContas = totalDeContas + 1;

Aqui, voltamos em um problema parecido com o da validação de CPF. Estamos espalhando um código por
toda aplicação, e quem garante que vamos conseguir lembrar de incrementar a variável totalDeContastoda
vez?
Tentamos então, passar para a seguinte proposta:

class Conta { private int totalDeContas; //... Conta() { this.totalDeContas = this.totalDeContas + 1; } }

Quando criarmos duas contas, qual será o valor dototalDeContasde cada uma delas? Vai ser 1. Pois cada
uma tem essa variável.O atributo é de cada objeto.

Seria interessante então, que essa variável fosseúnica, compartilhada por todos os objetos dessa classe.
Dessa maneira, quando mudasse através de um objeto, o outro enxergaria o mesmo valor. Para fazer isso em
java, declaramos a variável como static.

private static int totalDeContas;

Quando declaramos um atributo comostatic, ele passa a não ser mais um atributo de cada objeto, e sim
umatributo da classe, a informação fica guardada pela classe, não é mais individual para cada objeto.

As suas conclusões estão corretas.

O que é importante saber,é que, além de os objetos estarem na memória, a própria classe também estará na memória. E variáveis e métodos estáticos estão neste “espaço”, que é o da classe.

Por favor, ao criar tópicos não destaque no título o óbvio, como o fato de você ter [Dúvida] (o mesmo vale para [Ajuda], [Socorro], [Urgente], etc.).

Se você não tivesse dúvida, nem teria aberto o tópico. :slight_smile:

Só uma pequena correção na sua primeira frase, para que não exista nenhum problema de “intendimento”:

Quando você cria uma classe, o compilador Java irá criar um descritor da classe e este contérá o endereço dos métodos.
Cada objeto aponta para esse descritor, portanto, o código em si é compartilhado (o que é bom, pois poupa informação e como o código é imutável, seria mesmo um desperdício duplicá-lo).

Quanto aos atributos, seu entendimento de estático e não estático está perfeito.

[quote=ViniGodoy]Por favor, ao criar tópicos não destaque no título o óbvio, como o fato de você ter [Dúvida] (o mesmo vale para [Ajuda], [Socorro], [Urgente], etc.).

Se você não tivesse dúvida, nem teria aberto o tópico. :slight_smile:

Só uma pequena correção na sua primeira frase, para que não exista nenhum problema de “intendimento”:

Quando você cria uma classe, o compilador Java irá criar um descritor da classe e este contérá o endereço dos métodos.
Cada objeto aponta para esse descritor, portanto, o código em si é compartilhado (o que é bom, pois poupa informação e como o código é imutável, seria mesmo um desperdício duplicá-lo).

Quanto aos atributos, seu entendimento de estático e não estático está perfeito.[/quote]

Pelo que eu entendi, coisas imutáveis como parte do código dos métodos, se encontrará no descritor da classe. E os atributos se encontrarão nos objetos realmente. Os objetos apontam para esse descritor apenas para reutilizar os métodos, ou alguma parte do código.

[quote=Sleipbr][quote=ViniGodoy]Por favor, ao criar tópicos não destaque no título o óbvio, como o fato de você ter [Dúvida] (o mesmo vale para [Ajuda], [Socorro], [Urgente], etc.).

Se você não tivesse dúvida, nem teria aberto o tópico. :slight_smile:

Só uma pequena correção na sua primeira frase, para que não exista nenhum problema de “intendimento”:

Quando você cria uma classe, o compilador Java irá criar um descritor da classe e este contérá o endereço dos métodos.
Cada objeto aponta para esse descritor, portanto, o código em si é compartilhado (o que é bom, pois poupa informação e como o código é imutável, seria mesmo um desperdício duplicá-lo).

Quanto aos atributos, seu entendimento de estático e não estático está perfeito.[/quote]

Pelo que eu entendi, coisas imutáveis como parte do código dos métodos, se encontrará no descritor da classe. E os atributos se encontrarão nos objetos realmente. Os objetos apontam para esse descritor apenas para reutilizar os métodos, ou alguma parte do código.[/quote]

ok, em alguma futura dúvida não destacarei o óbvio . . .

éh e quanto aos atributos, não me lembrei que quando Criamos um objeto a classe desse objeto deverá também estar na memória, então serão 3 espaços reservados um para a estrutura do objeto CLASSE e dois para os objetos, e os atributos farão referência ao atributo da CLASSE . . .

Obrigado mais uma vez, este forum sempre esclarecendo minhas dúvidas . . .