quinta-feira, 3 de setembro de 2009

Variáveis de Referência,Stack,Variaveis Membro ,Diferença Variaveis Membro e Local, Diferença entre Primitivos e de Referência,Escopo de Variavel

Sabendo-se que todo processo tem ao menos uma thread, toda thread tem uma Stack e toda Stack necessita de um método que ira no fim dela, conclusivamente necessita-se de main() para a execução de um processo via LINHA DE COMANDO -
Só temos 1 método capaz de fazer de um programa um processo via linha de comando, main.
Quando executa-se o processo, uma instância da JVM, faz a chamada ao main() automaticamente oque cria o Frame do main(),e todo frame tem 3 áreas básicas de memória:
- Local Variable
- Operand Stack
- Uma referência a Runtime Constant Pool(indice 0 da Local Variable)

public class MinhaClasse{


public static void main(String array[]){


}
}

Nesse caso , o main() será automaticamente chamado por uma instância da JVM e irá no fim da Stack Referênte a thread do processo Criado ou seja:

Clique na imagem para ampliar

E como eu disse, tem-se os espaços de memória dentro do Frame e aqui também acrescentarei oque temos Basico do Basico na Instancia da JVM, isso é igual ao desenho de cima porem mais especializado:


Clique na imagem para ampliar

Lembre-se todos esses desenhos são conceituais, tendo isso em mente, vamos abreviar o desenho em: Sabendo que a Local variable é do main(), vamos abreviar para isso:



Variáveis de Referência:


Oque são variáveis de Referência?
São variáveis que contem o endereço do objeto em memória. Como se fosse uma carta(Uma carta não contem endereço?).

Como eu Declaro uma Variavel de Referência?
É igual a oque se fazia em tipos Primitivos porem, a única diferença é que o tipo da Variável é uma Classe e não um tipo Primitivo.

Como eu inicializo uma Variável de Referência?
Deve-se Instanciar um Objeto da Classe e atribuir a Variável.


Declarando uma Variável de Referência:

NomeDaClasse identificador;

*NomeDaClasse -> É a classe ou tipo de Objeto que será referênciado pela Variável
*identificador -> É o nome que você atribui a Variável

Instanciando um Objeto:

new NomeDaClasse();

*new -> É uma keyword em java, que instancia um objeto de uma classe
*NomeDaClasse -> O nome da classe a qual você quer uma instancia



Inicializando:

identificador = new NomeDaClasse();

Você inicializa uma Variavel de Referência somente após a Declaração dela com o Operador (= igual).


Podemos Declarar Instanciar e Inicializar em UMA ou DUAS linhas:

NomeDaClasse identificador = new NomeDaClasse();

ou

NomeDaClasse identificador;
identificador = new NomeDaClasse();


Variaveis de Referência e Armazenamento:
As Variáveis de Referência contem endereços de memória ao objetos, e todo endereço normalmente esta em Hexadecimal ou seja 0x antes do numero(0x888).

Vamos aos exemplos:

public class MinhaClasse{


public static void main(String array[]){
MinhaClasse identificador = new MinhaClasse();

//1- Isso é um comentário, Estou Declarando uma variavel de referência
//1- MinhaClasse identificador
//2- Instanciando um Objeto
//2- new MinhaClasse()
//3- Inicializando a Variavel de Referência(igual =)
//3- o identificador Recebe o endereço de memória do Objeto MinhaClasse

}
}


Desenhando:


Clique na imagem para ampliar, Não se importe com o indice 0 da Local variable, Nunca se armazena nada la ele é uma referência a outra área de memória
. Lembra- se que todo objeto mora em HEAP?


Oque são Variáveis Membro?

São aquelas Declaradas dentro do escopo da Classe, Agora sim podemos exemplificar de uma maneira fácil:


public class MinhaClasse{

public byte variavelMembro = 10;

public static void main(String array[]){
MinhaClasse identificador = new MinhaClasse();

//1- Isso é um comentário, Estou Declarando uma variavel de referência
//1- MinhaClasse identificador
//2- Instanciando um Objeto

//2- new MinhaClasse()

//3- Inicializando a Variavel de Referência(igual =)
//3- o identificador Recebe o endereço de memória do Objeto MinhaClasse

}
}

Oque ocorreu agora?




Clique na imagem para ampliar, A variável de Instancia tem o valor de 10 em byte, isso significa 8 bits,binários de byte + sinal ou seja, 0000 1010




Como acessar membros de classe?

Lembre-se Membro da classe = Variáveis membro ou métodos membro
,
Use o identificador da Variavel de referência do objeto e logo após o ponto e o identificador do membro da classe!


O Operador ponto - Permite o acesso a membros do objeto não privados. Isso é chamado de Notação de ponto.

identificador.identificadorMembro;

identificador.identificadorMembro();

Vamos aos exemplos:


public class MinhaClasse{
public byte variavelMembro = 10;

public static void main(String array[]){

MinhaClasse identificador = new MinhaClasse();
identificador.variavelMembro = 20; //Acessando a variavel membro

}

}

Desenhando:



Clique na imagem para ampliar,Perceba que o valor em Binário, os bits que estavam na variavelMembro agora mudarão, antes era: 0000 1010 ou seja o número 10 em decimal
Agora é: 0001 1000 ou seja o número 20 em deci
mal.


Exemplificando acesso a membro com mais de uma Instancia:
public class
MinhaClasse{

public byte variavelMembro = 10;

public static void main(String array[]){

MinhaClasse identificador1 = new MinhaClasse(); //Uma Instancia
MinhaClasse indetificador2 = new MinhaClasse(); // Outra instancia

identificador2.variavelMembro = 20;


}
}



Qual o valor da variavelMembro do identificador2?
Não sabe? Então vamos desenhar!!!
Clique na imagem para ampliar, O valor certo seria em binário porem vou colocar em Decimal para Exemplificar melhor.Esse ja é o desenho final de como ficará.




Um exemplo de Método:

public class MinhaClasse{
public byte variavelMembro = 10;

public void go(){

}

public static void main(String array[]){
MinhaClasse identificador1 = new MinhaClasse();//Uma instancia
Minha indetificador2 = new MinhaClasse();// Outra instancia

identificador2.go();

}
}


O método que será Executado é de quem?
O do identificador2, basicamente tem-se isso:


Clique na imagem para ampliar



Atribuição de Referências:
É a atribuição de um endereço de memória de uma Variavel de Referência a outra:

Exemplo:

public class MinhaClasse{

public static void main(String array[]){
MinhaClasse identificador1 = new MinhaClasse();//Uma instancia
Minha indetificador2 = new MinhaClasse(); // Outra instancia

}
}


Clique na imagem para ampliar

Exemplo Modificado:

public class MinhaClasse{

public static void main(String array[]){
MinhaClasse identificador1 = new MinhaClasse();//Uma instancia
Minha indetificador2 = new MinhaClasse();// Outra instancia

identificador2 = identificador1;

}
}

Oque acontece com identificador2?
Ele terá o mesmo endereço de memória que o identificador1;

Desenhando:

Clique na imagem para ampliar, veja que agora identificador2 tem o endereço do mesmo objeto que identificador1

Oque acontece com o objeto que tem endereço 0xA2?
Como nenhuma variável de Referência contem o endereço dele, O objeto esta pronto para o coletor de lixo, Uma vez sem referência ele ja era.



Qual a diferença de uma Variavel de Referência como membro da Classe e uma Variável de Referência como variavel local?


Variavel local e de Referência:
Toda variável local é declarada dentro de um bloco ou de um método, Portanto:

public class MinhaClasse{

public static void main(String array[]){
MinhaClasse identificador1 = new MinhaClasse();//Uma instancia

}
}

identificador1 é uma variável do tipo Referência e é local ao método main, vejamos oque quer dizer:


Clique na imagem para ampliar



Variavel Membro e de Referência:
Toda variável Declarada dentro de uma classe e fora de um método ou bloco e que seja do tipo Referência.

public class MinhaClasse{
public MinhaClasse variavelMembro;

public static void main(String array[]){
MinhaClasse identificador1 = new MinhaClasse();//Uma instancia
identificador1.variavelMembro = new MinhaClasse();

}
}


Desenhando:


Clique na imagem para ampliar, Lembre-se todo Objeto mora em HEAP



Qual a diferença entre tipos Primitivos e tipos Referência?

Tipos Primitivos armazenam os bits referêntes ao valor, tipos Referência armazenam o endereço de memória do Objeto:

Tipo Primitivo:


public class MinhaClasse{

public static void main(String array[]){
byte tipoPrimitivo = 10;

}
}


Desenhando:


10 em Decimal equivale em Binário em tipo byte(ou seja 8 bits)
0000 1010 lembrando que se fosse por exemplo em short seria:
0000 0000 0000 1010

Tipo Referência:


public class MinhaClasse{


public static void main(String array[]){
MinhaClasse identificador = new MinhaClasse();

}
}

Desenhando:


Normalmente endereço de memória é usado em Hexadecimal ou seja 0x antes do número, no caso temos (0xA1)



Qual a diferença de Instanciar e instanciar e Armazenar o valor?

Quando você obtem uma Frame(ou seja um método em execução, no nosso caso o main) você obtem 3 espaços de memória que ja forão comentados em tutoriais anteriores(Local Variable,Operand Stack, Uma referência a Constant Pool), Basicamente trabalhamos na Operand Stack e utilizamos a Local Variable como uma área de acesso prolongado, podemos fazer uma comparação entre:

RAM -> operand Stack
HD -> local Variable

Sem a Local Variable você não tem acesso ao objeto depois de declara-lo , vamos ver ambas as partes:

Instanciar e Armazenar:

public class MinhaClasse{
public int x = 0;


public static void main(String array[]){
MinhaClasse identificador = new MinhaClasse();
identificador.x = 20; //abaixo da Declaração da variável local, Instan...

}
}

Em Bytecode:

8: aload_1
9: bipush 20
11: putfield #2; //Field x:I

Isso significa em java: identificador.x = 20;

Desenhando temos:

Clique na imagem para ampliar

A invocaçãode putfield leva oque estiver em baixo dele na Operand Stack, e causará isso:


Clique na imagem para ampliar,Usei em Decimal o valor para Representação, porem o valor correto de tipos Primitivos é em binário.


Somente Instanciar:

public class MinhaClasse{


public static void main(String array[]){
new MinhaClasse();


//2- Instanciando um Objeto
//2- new MinhaClasse()

}
}


Trabalhando na Operand Stack, não temos como fazer isso pois não temos nada na Local Variable:

Clique na imagem para ampliar,Então logo vem o Coletor de Lixo e coleta ele.(Objeto solto é Objeto morto)



Escopo de uma variavel:

Variáveis declaradas dentro de um método,constutor de decisão, laço ou outro tipo de bloco de código não pode ser na classe em si.O escopo de uma variavel se refere aonde a variavel pode ser usada dentro de um programa. A declaração da variavel valida o escopo dela. Exemplo:

- Variaveis Locais declaradas dentro de um método, construtor de decisão, loop ou outro tipo de bloco de codigo diferente da classe, tem O ESCOPO ou seja pode ser usada apenas onde foi DECLARADA.


É hora da Revisão:

- Por Default, Variaveis de Referência que são membros de Classe(Variáveis Atributo) tem o valor Default de null
- Toda variável de Referência armazena o endereço de memória do Objeto
- Todo endereço de memória normalmente é representado com hexadecimal, ou seja o 0x antes do valor(0x002)
- Lembre-se Membro da classe = Variáveis membro ou métodos membro
- Um objeto uma vez sem referência ele é do Coletor de lixo(Garbage Collected)
- A diferença entre:
Variável Atributo de referência = Ambos moram em Heap
Variável de referência local é que = a variável em Local Variable, a referência em heap
- O Operador ponto - Permite o acesso a membros do objeto não privados. Isso é chamado de Notação de ponto.
- O escopo de uma variavel se refere aonde ela pode ser usada no programa.




Nenhum comentário:

Postar um comentário