Capítulo 01: Ecossistema Java 21 LTS, JVM, Tipagem Primitiva e Estrutura Sequencial
Especialização em Sistemas com Java 21 LTS • Módulo de Fundamentos
🗺️ Mapa Conceitual do Tópico
flowchart TD
A["Código Fonte (.java)"] -->|Compilador javac| B["Bytecode Portável (.class)"]
B -->|Class Loader| C["Java Virtual Machine (JVM)"]
C -->|JIT Compiler + GC| D["Código Nativo de Máquina / SO Windows"]
subgraph TIPOS["Tipagem Primitiva & Exata"]
E["Inteiros: byte, short, int, long"]
F["Ponto Flutuante: float, double"]
G["Monetário: java.math.BigDecimal"]
end
subgraph IO["Entrada e Saída Formatada"]
H["Scanner sc = new Scanner(System.in)"]
I["System.out.printf('%.2f', valor)"]
end
C --> TIPOS
C --> IO
style A fill:#e1f5fe,stroke:#03a9f4,stroke-width:2px
style B fill:#fff3e0,stroke:#ff9800,stroke-width:2px
style C fill:#ede7f6,stroke:#7e57c2,stroke-width:2px
style D fill:#e8f5e9,stroke:#4caf50,stroke-width:2px
🏛️ 1. A Plataforma Java e a Java Virtual Machine (JVM)
Java é uma linguagem de alto nível, fortemente tipada e orientada a objetos. O código-fonte (.java) é compilado pelo javac em Bytecode intermediário (.class), que é executado pela Java Virtual Machine (JVM) sob o lema Write Once, Run Anywhere.
Componentes da Plataforma:
- JDK (Java Development Kit): Kit de desenvolvimento contendo o compilador
javac, depuradores e ferramentas de diagnóstico. - JVM (Java Virtual Machine): Motor de execução responsável pela compilação dinâmica (Just-In-Time Compiler - JIT), segurança e gestão de memória pelo Garbage Collector (GC).
- Java 21 LTS: Versão estável com Suporte de Longo Prazo (Long-Term Support), trazendo Virtual Threads, Pattern Matching e otimizações de runtime.
🔢 2. Tabela Detalhada dos 8 Tipos Primitivos (Primitive Types)
Os tipos primitivos armazenam valores escalares diretamente na Stack da JVM, sem a sobrecarga de cabeçalhos de objetos.
| Tipo Primitivo | Categoria | Tamanho | Faixa de Valores (Range) | Valor Padrão | Literal / Sufixo | Classe Wrapper | Exemplo de Uso |
|---|---|---|---|---|---|---|---|
byte |
Inteiro | 8 bits (1 byte) | -128 a +127 | 0 |
(sem sufixo) | java.lang.Byte |
byte nivel = 12; |
short |
Inteiro | 16 bits (2 bytes) | -32.768 a +32.767 | 0 |
(sem sufixo) | java.lang.Short |
short porta = 8080; |
int |
Inteiro (padrão) | 32 bits (4 bytes) | -2.147.483.648 a +2.147.483.647 | 0 |
(sem sufixo) | java.lang.Integer |
int estoque = 1500; |
long |
Inteiro Longo | 64 bits (8 bytes) | -9.223.372.036.854.775.808 a +9.223.372.036.854.775.807 | 0L |
L ou l |
java.lang.Long |
long id = 10500980L; |
float |
Ponto Flutuante | 32 bits (4 bytes) | ±1.4 × 10⁻⁴⁵ a ±3.4 × 10³⁸ (6 a 7 dígitos de precisão) | 0.0f |
F ou f |
java.lang.Float |
float taxa = 0.055f; |
double |
Ponto Flutuante (padrão) | 64 bits (8 bytes) | ±4.9 × 10⁻³²⁴ a ±1.8 × 10³⁰⁸ (15 a 17 dígitos de precisão) | 0.0d |
D ou d |
java.lang.Double |
double peso = 82.45; |
char |
Caractere Unicode | 16 bits (2 bytes) | ‘\u0000’ (0) a ‘\uffff’ (65.535) (UTF-16) | '\u0000' |
Aspas simples ' ' |
java.lang.Character |
char status = 'A'; |
boolean |
Lógico / Booleano | 1 byte na JVM | true ou false |
false |
true / false |
java.lang.Boolean |
boolean aprovado = true; |
📦 3. Tabela de Classes Empacotadoras (Wrapper Classes)
As classes Wrapper encapsulam tipos primitivos como objetos no Heap, permitindo seu uso em estruturas genéricas da Java Collections Framework (List<Integer>, Map<String, Double>) e suportando o valor null.
| Primitivo | Wrapper Class | Suporta null? |
Método de Parsing de String | Método de Conversão de Objeto | Uso Recomendado |
|---|---|---|---|---|---|
byte |
Byte |
Sim | Byte.parseByte("10") |
Byte.valueOf("10") |
Leitura de buffers e fluxos binários. |
short |
Short |
Sim | Short.parseShort("100") |
Short.valueOf("100") |
Otimização de matrizes numéricas volumosas. |
int |
Integer |
Sim | Integer.parseInt("500") |
Integer.valueOf("500") |
IDs, chaves de dicionário, índices de listas. |
long |
Long |
Sim | Long.parseLong("999999") |
Long.valueOf("999999") |
Chaves primárias em bancos de dados relacionais. |
float |
Float |
Sim | Float.parseFloat("12.5") |
Float.valueOf("12.5") |
Processamento gráfico e áudio digital. |
double |
Double |
Sim | Double.parseDouble("99.9") |
Double.valueOf("99.9") |
Cálculos científicos e estatísticos. |
char |
Character |
Sim | str.charAt(0) |
Character.valueOf('A') |
Validação e manipulação alfanumérica. |
boolean |
Boolean |
Sim | Boolean.parseBoolean("true") |
Boolean.valueOf("true") |
Flags opcionais e colunas de banco que aceitam NULL. |
🔀 4. Tabela de Conversão e Regras de Casting
flowchart LR
byte["byte (8b)"] --> short["short (16b)"]
short --> int["int (32b)"]
char["char (16b)"] --> int
int --> long["long (64b)"]
long --> float["float (32b)"]
float --> double["double (64b)"]
style byte fill:#e1f5fe,stroke:#03a9f4,stroke-width:2px
style int fill:#ede7f6,stroke:#7e57c2,stroke-width:2px
style double fill:#e8f5e9,stroke:#4caf50,stroke-width:2px
| Tipo de Conversão | Direção | Necessita Cast Explícito? | Risco de Perda de Dados? | Exemplo de Código |
|---|---|---|---|---|
| Widening (Alargamento) | Menor → Maior (int para double) |
Não (Automático) | Não | int a = 10; double b = a; |
| Narrowing (Estreitamento) | Maior → Menor (double para int) |
Sim ((tipo)) |
Sim (Trunca decimais ou gera overflow) | double d = 9.99; int i = (int) d; // i = 9 |
| Promoção Numérica | Operações com tipos menores que int |
Automático (Promove para int) |
Não | byte x = 1, y = 2; int z = x + y; |
💼 5. Precisão Numérica: double vs BigDecimal em Faturamento
⚠️ Atenção Financeira (Padrão IEEE 754): Tipos de ponto flutuante binário (
double/float) não conseguem representar frações decimais exatas como 0,1 ou 0,07, introduzindo resíduos de arredondamento. Em aplicações fiscais, bancárias e corporativas, utilize semprejava.math.BigDecimalcomRoundingMode.HALF_EVEN.
| Critério | double (IEEE 754) |
java.math.BigDecimal |
|---|---|---|
| Representação | Binária de 64 bits | Objeto arbitrário com base decimal e escala |
| Precisão | 15 a 17 dígitos significativos (Aproximada) | Exata (Definida pelo programador) |
| Velocidade | Processamento direto na FPU / CPU (Ultrarrápido) | Processamento por software (Mais lento) |
| Operadores | Aritméticos nativos (+, -, *, /) |
Métodos da classe (add(), subtract(), multiply(), divide()) |
| Recomendação | Gráficos 3D, física, jogos, machine learning | Sistemas contábeis, ERPs, folhas de pagamento, e-commerce |
📥 6. Entrada e Saída Formatada no Windows
- Leitura com
Scanner:Scanner sc = new Scanner(System.in); System.out.print("Informe o salário: "); double salario = sc.nextDouble(); - Saída Formatada com
printf:System.out.printf("Total Faturado: R$ %10.2f%n", total);(O marcador
%ngarante a quebra de linha correta no Windows sem problemas de portabilidade).
💻 7. Código de Demonstração Corporativo (Java 21 LTS)
// Exemplo01EcossistemaSequencial.java - Processamento Sequencial com BigDecimal
package com.empresa.fundamentos;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Locale;
public class Exemplo01EcossistemaSequencial {
public static final BigDecimal ALIQUOTA_INSS = new BigDecimal("0.11"); // 11%
public static final BigDecimal VALOR_TRANSPORTE = new BigDecimal("180.00");
public static void main(String[] args) {
Locale.setDefault(Locale.US);
String colaborador = "Camila Duarte";
BigDecimal salarioBruto = new BigDecimal("5400.00");
int diasTrabalhados = 30;
// Cálculo com precisão contábil e arredondamento bancário (HALF_EVEN)
BigDecimal fatorDias = new BigDecimal(diasTrabalhados).divide(new BigDecimal("30"), 4, RoundingMode.HALF_EVEN);
BigDecimal proventoBase = salarioBruto.multiply(fatorDias).setScale(2, RoundingMode.HALF_EVEN);
BigDecimal descontoInss = proventoBase.multiply(ALIQUOTA_INSS).setScale(2, RoundingMode.HALF_EVEN);
BigDecimal salarioLiquido = proventoBase.subtract(descontoInss).subtract(VALOR_TRANSPORTE);
System.out.println("=================================================");
System.out.println(" DEMONSTRATIVO DE PAGAMENTO (JAVA 21 LTS) ");
System.out.println("=================================================");
System.out.printf("Colaborador : %s%n", colaborador);
System.out.printf("Salário Base (30d) : R$%10.2f%n", proventoBase); System.out.printf("(-) Desconto INSS : R$ %10.2f (11%%)%n", descontoInss);
System.out.printf("(-) Transporte : R$%10.2f%n", VALOR_TRANSPORTE); System.out.println("-------------------------------------------------"); System.out.printf("LÍQUIDO A RECEBER : R$ %10.2f%n", salarioLiquido);
System.out.println("=================================================");
}
}
🔗 Recursos Pedagógicos do Capítulo 01
| Recurso Didático | Finalidade | Link de Acesso |
|---|---|---|
| 📊 Slides de Aula | Apresentação visual interativa com Dark Mode e suporte a teclado | Ver Slides |
| 🧠 Quiz Formativo | Teste interativo de fixação com feedback imediato por alternativa | Fazer Quiz |
| 💻 Exemplos de Código | Demonstrações funcionais compiláveis com saída no console | Ver Exemplos |
| 🧩 Exercícios em 4 Níveis | Lista progressiva de fixação com gabarito em bloco colapsável | Resolver Exercícios |
| ⬅️ Voltar ao Sumário | 📚 Sumário de Tópicos | 🔀 Próximo Capítulo: Estrutura Condicional ➡️ |