Toda variável representa na verdade uma posição na memória do seu computado e toda variável que você declara tem um tipo, um nome, um tamanho fixo( em Java, o tamanho de uma variável é fixo, assim, o numero de bytes que uma variavel ocupa na memória independe do valor que aqueles bytes irão representar para nós seres humanos) e um valor.
O Java possui basicamente dois tipos de variáveis: variáveis de tipo primitivo e variáveis de referencia. As variáveis de tipo primitivo são caracterizadas por guardar valores básicos como um inteiro (int), um flutuante (float)… Já uma variável de referência, como o próprio nome já diz, faz referência a um objeto. É importante salientar que uma referência de objeto não é um objeto, portando, a variável de referencia não guarda um objeto, e sim uma referencia de objeto. A referência de Objeto nada mais é que uma espécie de “número identificador (id)” que liga uma variável a seu respectivo objeto.
Diferente da maioria das linguagens de script como javascript e PHP, onde o tipo da variável muda dinamicamente ao longo da execução de um algoritmo, o Java é uma linguagem fortemente tipada, isso quer dizer que uma variável do tipo int não se transforma no tipo float a menos que a conversão seja feita explicitamente pelo programador. A regra basica para conversão de tipos primitivo é que o tipo “menor” poderá ser convertido em um tipo “maior” sem perda de dados, mas na conversão de um tipo maior para um tipo menor poderá ocorrer perda de dados. Quando nos referimos a tipo maior e tipo menor estamos nos referindo ao tamanho em bytes que uma variavel daquele tipo ocupa na memória. A perda de dados ocorre toda vez que você converte uma variavel de um tipo com mais bytes para um tipo com menos bytes. Por exemplo, se eu seto uma variável para ser float e depois converto em um int, o valor que estava guardado na minha variável será truncado, se o valor da variavel original da variavel fosse 1.25, quando ela fosse transformada em um int, todos os valores que estivessem depois do ponto seriam perdidos pois uma variavel int não suporta os bytes referentes a essas casas decimais.
Veja a seguir a lista com as variáveis primitivas do Java com seus respectivos tamanhos:
Variáveis Numéricas Inteiras
- byte - Tamanho de 8 bits com sinal. Valores de – 128 a + 127.
- short - Tamanho de 16 bits com sinal. Valores de – 32.768 a + 32.767.
- int - Tamanho de 32 bits com sinal. Valores de – 2.147.483.648 a + 2.147.483.647.
- long - Tamanho de 64 bits com sinal. Valores de – 9.223.372.036.854.775.808 a + 9.223.372.036.854.775.807.
Variáveis de Ponto Flutuante
- float - Tamanho de 32 bits com sinal. Valores de – 1.40239846E-45 a + 3.40282347E + 38 (com nove dígitos significativos de precisão).
- double - Tamanho de 64 bits com sinal. Valores de – 4.94065645841246544E-324 a + 1.79769313486231570E + 308 (com 18 dígitos significativos de precisão).
Variável de Caractere
- char - Caractere Unicode com tamanho 16 bits sem sinal. Valores possíveis 0 a 65535.
Variável Booleana
- boolean - Valor indicando true ou false. Tamanho de 8 bit.
A sintaxe de declaração de uma variável de tipo primitivo em java é bastante simples, veja o exemplo a seguir:
int valor = 1;
Na expressão acima uma variável do tipo inteiro (int) é criada e logo depois o valor 1 é atribuído a ela. Lembrando que o ponto e virgula no java é obrigatório, e indica o fim de uma expressão.
No exemplo acima nós definimos um valor inicial para nossa variável logo na sua declaração, mas você pode desejar não atribuir um valor inicial a variavel. Nesse caso, o java atribui o valor padrão de cada tipo de variável, se por exemplo você declarar uma variável do tipo int sem atribuir valor a mesma, o java irá atribuir o valor 0 à variável, se a variável for uma variável instância, o java atribui null à nova variável, se for a variavel de tipo primitivo boolean, o valor padrão será false, e assim por diante. A sintaxe para definir uma variável sem atribuição de valor é a seguinte:
int valor;
Como foi mencionado anteriormente o java possui variáveis de tipo primitivo e variáveis de instância. As variáveis de instância não recebem valores simples como números inteiros ou números de ponto flutuante, mas recebem um valor de referência que representa a posição de um objeto na memória. Uma referência é uma espécie de link que permite que o programador possa acessar os metodos do objeto. Assim, um objeto na memória que não esteja referenciado por alguma variável não pode ser acessado pelo programador. Veja abaixo o exemplo a seguir da criação de um objeto básico em Java:
Object objetoDeTeste = new Object();
A palavra Object é o tipo da variável. O nome da variável é objetoDeTeste. A expressão new Object() cria um novo objeto na memória do computador, até aqui não existe nenhuma variável referenciando nosso novo objeto. Quando finalmente inserimos a expressão de atribuição “=”, a a variável objetoDeTeste passa a referenciar nosso objeto criado. Uma observação importante: O Java irá eliminar da memória do computador todo objeto que não tiver pelomenos uma variavel o referenciando. Outra observação é que o processo de eliminação de um objeto não é instantâneo, ele é executado pelo “coletor de lixo” (garbage colector).
O java possui oito tipos primitivos: boolean, char, byte, short, int, long, float e double; e “infinitos” tipos de referência! Quando dizemos que o Java possui “Infinitos” tipos de referência é porque novos tipos podem ser criados a qualquer momento. Toda vez que você cria uma nova classe ou interface você estará criando novo tipo que poderá ser o tipo que uma variável de referência irá referenciar.