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 decimal.
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.
Assinar:
Postar comentários (Atom)
Nenhum comentário:
Postar um comentário