Tipos Primitivos e Não Primitivos
int, double, String e a diferença entre eles
Java separa os tipos em dois grupos. Tipos primitivos são armazenados diretamente na memória stack e incluem: int, long, double, float, boolean, char, byte e short. Eles não são objetos — são valores puros e têm tamanho fixo em bytes.
Tipos não primitivos (ou de referência) são objetos armazenados na heap, e a variável guarda apenas o endereço de memória onde o objeto está. Os principais são: String, Integer, Double, Boolean (wrappers dos primitivos), arrays e qualquer classe definida pelo usuário.
A distinção importa na prática: primitivos são copiados por valor (int b = a copia o número), enquanto objetos são copiados por referência (Object b = a faz ambas as variáveis apontarem para o mesmo objeto na heap). O Java faz autoboxing automaticamente, convertendo entre primitivos e wrappers conforme necessário.
// ── Tipos Primitivos ─────────────────────────────
int idade = 25; // 32 bits, -2bi a 2bi
long populacao = 8_000_000_000L; // 64 bits (L obrigatório)
double preco = 99.90; // ponto flutuante 64 bits
float taxa = 0.05f; // ponto flutuante 32 bits (f obrigatório)
boolean ativo = true; // true ou false
char inicial = 'J'; // caractere único (aspas simples)
byte nivel = 127; // -128 a 127
// ── Tipos Não Primitivos ─────────────────────────
String nome = "Maria"; // classe, não primitivo
Integer numero = 42; // wrapper de int
int[] notas = {8, 9, 7, 10}; // array é um objeto
// ── Autoboxing / Unboxing ────────────────────────
int x = 10;
Integer y = x; // autoboxing: int → Integer (automático)
int z = y; // unboxing: Integer → int (automático)
// ── Diferença crucial: primitivo vs referência ───
int a = 5;
int b = a; // copia o VALOR
b = 99;
System.out.println(a); // 5 — inalterado!Use tipos primitivos por padrão para performance. Use os wrappers (Integer, Double…) quando precisar de null ou ao usar Collections, pois List<int> não existe — deve ser List<Integer>.