0% acharam este documento útil (0 voto)
4 visualizações37 páginas

Sintaxe Básica de Java: Guia Completo

Este guia aborda a sintaxe básica de Java, presumindo conhecimento prévio em programação. Ele cobre terminologias fundamentais, palavras-chave reservadas, convenções de nomenclatura, tipos de dados primitivos e arrays, além de armadilhas comuns que programadores enfrentam. O objetivo é proporcionar uma compreensão profunda da linguagem Java e suas práticas recomendadas.

Enviado por

renatolucas.dev
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
4 visualizações37 páginas

Sintaxe Básica de Java: Guia Completo

Este guia aborda a sintaxe básica de Java, presumindo conhecimento prévio em programação. Ele cobre terminologias fundamentais, palavras-chave reservadas, convenções de nomenclatura, tipos de dados primitivos e arrays, além de armadilhas comuns que programadores enfrentam. O objetivo é proporcionar uma compreensão profunda da linguagem Java e suas práticas recomendadas.

Enviado por

renatolucas.dev
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd

Java Basic Syntax - Guia Completo para

Aprendizado Profundo
Introdução e Contexto de Aprendizagem
Você já compreende os fundamentos de programação por sua formação em Ciência da Computação.
Este material assume esse conhecimento prévio e vai direto aos aspectos específicos de Java, com
ênfase na profundidade necessária para dominar completamente a sintaxe básica.

O [Link] destaca que "Understanding the basics is the key to a solid foundation". Neste
sentido, exploraremos não apenas como fazer algo em Java, mas também por quê a linguagem foi
projetada dessa forma, como ela evoluiu, e quais são as armadilhas que até programadores
experientes enfrentam.

1. Terminologias Fundamentais
1.1 Identificadores (Identifiers)

Definição: Um identificador é um nome que você atribui a variáveis, métodos, classes, pacotes e
outras estruturas do seu programa.

Regras para Identificadores em Java:

1. Começam com letra, underscore ( _ ) ou sinal de dólar ( $ )

✅ myVariable , _privateVar , $dollarVar

❌ 9variable , -invalid

2. Contêm apenas letras, dígitos, underscores e sinais de dólar

✅ userName123 , user_name

❌ user-name , user name

3. São case-sensitive — Total , total e TOTAL são três identificadores diferentes

4. Não podem ser palavras-chave reservadas


5. Significância prática: Não podem conter hífens ou períodos

Exemplo Prático:

public class IdentifierDemo {


public static void main(String[] args) {
// ✅ Válidos
int myAge = 25;
String _internalName = "Alice";
double $price = 99.99;
boolean isValidUser = true;

// ❌ Inválidos (geram compilação erro)


// int 123invalid = 5; // Começa com número
// String user-name = "Bob"; // Contém hífen
// int class = 10; // Keyword reservada

[Link]("Age: " + myAge);


}
}

1.2 Palavras-Chave Reservadas (Reserved Keywords)

Java possui exatamente 50 palavras-chave e 3 literais que não podem ser usados como
identificadores.

Categorias de Palavras-Chave:

Categoria Palavras-Chave Versão Introduzida

Tipos de Dados byte , short , int , long , float , double , Java 1.0
char , boolean , void

Controle de if , else , switch , case , default , while , Java 1.0


Fluxo do , for , break , continue , return

OOP class , interface , extends , implements , Java 1.0


this , super , new
Categoria Palavras-Chave Versão Introduzida

Modificadores public , private , protected , static , final , Java 1.0+


abstract , synchronized , volatile ,
transient , native , strictfp

Tratamento de try , catch , finally , throw , throws Java 1.0


Exceções

Pacotes e package , import Java 1.0


Imports

Modernos var (Java 10), sealed (Java 17), records Java 10+
(Java 17)

Não Utilizados goto , const Java 1.0 (reservados,


não implementados)

Três Literais Especiais:

true — valor booleano verdadeiro

false — valor booleano falso

null — representa ausência de valor (referência nula)

⚠️ Armadilha Comum: Confundir null com 0 ou false

String name = null; // ✅ Representa "sem valor"


int count = 0; // ✅ Número zero
boolean isActive = false; // ✅ Booleano falso

// ❌ Isso gera compilação erro:


// int result = null;
// String text = false;

1.3 Comentários

Java suporta três tipos de comentários:


// Comentário de linha única (single-line comment)

/*
Comentário de múltiplas linhas (multi-line comment)
Pode ocupar várias linhas
*/

/**
* Comentário de documentação (JavaDoc)
* @param args argumentos da linha de comando
* @return descrição do retorno
*/
public static void main(String[] args) {
// ...
}

2. Convenções de Nomes (Naming Conventions)


A comunidade Java segue convenções rígidas de nomenclatura. Seguir essas convenções é essencial
para produzir código legível e manutenível.

Elemento Convenção Exemplos

Classes PascalCase (primeira letra maiúscula) StudentManager , DatabaseConnection

Interfaces PascalCase Comparable , Serializable

Métodos camelCase (primeira palavra calculateTotal() , getUserName()


minúscula)

Variáveis camelCase (primeira palavra studentName , isActive , maxRetries


minúscula)

Constantes UPPER_SNAKE_CASE (todas MAX_ATTEMPTS , PI_VALUE


maiúsculas)

Pacotes minúsculas com pontos [Link] ,


[Link]
Por que isso importa? Essas convenções fazem parte da identidade visual do código Java. Um
desenvolvedor experiente reconhece instantaneamente o tipo de um elemento pela sua nomenclatura.

Exemplo Profissional vs Amador:

// ❌ Amador - Ignora convenções


public class userdbconnection {
private String UN = "admin";
private int MX = 100;

public void getdata() {


// ...
}
}

// ✅ Profissional - Segue convenções


public class UserDatabaseConnection {
private String username = "admin";
private static final int MAX_CONNECTIONS = 100;

public void fetchData() {


// ...
}
}

3. Tipos de Dados Primitivos


Java possui 8 tipos de dados primitivos divididos em 4 categorias. Ao contrário de linguagens como
Python, Java requer declaração explícita de tipo.
3.1 Tipos Integrais (Whole Numbers)

Tipo Tamanho Range Valor Quando Usar


Padrão

byte 1 byte (8 -128 a 127 0 Arrays grandes


bits) (economia de
memória)

short 2 bytes (16 -32.768 a 32.767 0 Dados que cabem


bits) em 2 bytes

int 4 bytes (32 -[Link] a [Link] 0 Padrão para


bits) inteiros

long 8 bytes (64 -[Link].854.775.808 a 0L Números muito


bits) [Link].854.775.807 grandes (ex:
timestamps)

Exemplo Prático:

public class IntegralTypesDemo {


public static void main(String[] args) {
byte age = 25; // OK: 25 < 127
// byte invalid = 200; // ❌ Erro: 200 > 127

short yearOfBirth = 1999; // OK

int population = 7800000000; // ❌ Erro: Muito grande para int


int populationCorrect = 7_800_000; // ✅ OK: Usando underscores para
legibilidade (Java 7+)

long worldPopulation = 7_800_000_000L; // ✅ OK: Sufixo 'L' obrigatório


para long

[Link]("Age: " + age);


[Link]("Population: " + populationCorrect);
}
}
3.2 Tipos Ponto-Flutuante (Decimal Numbers)

Tipo Tamanho Precisão Valor Quando Usar


Padrão

float 4 bytes (32 ~7 dígitos 0.0f Economia de memória, não requer alta
bits) precisão

double 8 bytes (64 ~15 0.0d Padrão para decimais, cálculos


bits) dígitos científicos

Exemplo Prático:

public class FloatingPointDemo {


public static void main(String[] args) {
float price = 19.99f; // Sufixo 'f' obrigatório
double pi = 3.14159265359; // Sem sufixo, double é padrão
double scientificNotation = 1.5e-3; // 0.0015

// ⚠️ Armadilha: Imprecisão em cálculos


double result = 0.1 + 0.2;
[Link](result); // Imprime: 0.30000000000000004

// Solução para situações de alta precisão: BigDecimal


// import [Link];
// BigDecimal preciseResult = new BigDecimal("0.1").add(new
BigDecimal("0.2"));
}
}

3.3 Tipo Caractere (Character)

Tipo Tamanho Range Valor Padrão

char 2 bytes (16 bits) Unicode de 0 a 65.535 (\u0000 a \uffff) '\u0000'

public class CharacterDemo {


public static void main(String[] args) {
char letter = 'A';
char digit = '5';
char unicode = '\u0048'; // 'H' (Unicode)
char newline = '\n'; // Escape sequence

// Operações com char


char next = (char)(letter + 1); // 'B'

[Link]("Letter: " + letter);


[Link]("Next: " + next);
[Link]("Unicode: " + unicode);
}
}

3.4 Tipo Booleano (Logical)

Tipo Tamanho Valores Valor Padrão

boolean 1 bit true ou false false

public class BooleanDemo {


public static void main(String[] args) {
boolean isJavaFun = true;
boolean isHard = false;

// ❌ Erro comum: Confundir com inteiros


// if (isJavaFun) {
// isJavaFun = 1; // ❌ Erro: 1 não é boolean
// }

// ✅ Correto
if (isJavaFun) {
[Link]("Java é incrível!");
}
}
}
3.5 Tabela Comparativa: Velho vs Moderno

Java 8 (Antigo) - Declaração Explícita de Tipos:

int count = 10;


double price = 19.99;
String name = "Alice";
List<String> names = new ArrayList<>();

Java 10+ (Moderno) - Palavra-Chave var :

var count = 10; // Compilador infere: int


var price = 19.99; // Compilador infere: double
var name = "Alice"; // Compilador infere: String
var names = new ArrayList<String>(); // Compilador infere: List<String>

Quando usar var ?

✅ Quando o tipo é óbvio no lado direito da atribuição


✅ Para código mais conciso
❌ Não use quando o tipo for implícito (dificulta leitura)
❌ Não use em campos de classe (requer tipo explícito)

4. Variáveis e Inicialização
4.1 Declaração e Inicialização

public class VariablesDemo {


// Variáveis de classe (class variables) - inicializadas com valores padrão
private static int classCounter = 0; // Static
private String instanceName = "Default"; // Instance

public void methodVariables() {


// Variáveis locais - devem ser inicializadas antes do uso
int localCounter; // ❌ Não inicializada
// [Link](localCounter); // Erro de compilação

int initialized = 0; // ✅ Inicializada


[Link](initialized);
}
}

Regra de Ouro: Toda variável local deve ser inicializada antes de seu primeiro uso. Variáveis de
classe recebem valores padrão automaticamente.

4.2 Valores Padrão por Tipo

public class DefaultValuesDemo {


// Valores padrão em campos de classe
private byte byteValue; // 0
private short shortValue; // 0
private int intValue; // 0
private long longValue; // 0L
private float floatValue; // 0.0f
private double doubleValue; // 0.0d
private char charValue; // '\u0000'
private boolean booleanValue; // false
private String stringValue; // null
private Object objectValue; // null

public void printDefaults() {


[Link]("int: " + intValue); // 0
[Link]("String: " + stringValue); // null
[Link]("boolean: " + booleanValue); // false
}
}

5. Arrays
Arrays são coleções de tamanho fixo de elementos do mesmo tipo.
5.1 Declaração e Inicialização

Três formas de criar um array:

public class ArrayDemo {


public static void main(String[] args) {
// Forma 1: Declaração + Alocação
int[] numbers; // Declaração (sem alocação)
numbers = new int[5]; // Alocação (5 zeros)

// Forma 2: Declaração + Inicialização em uma linha


int[] scores = new int[3]; // [0, 0, 0]

// Forma 3: Inicialização com valores (inline)


int[] ages = {25, 30, 28, 35}; // Tamanho inferido: 4

// Forma 4: Com 'new' (verbose, não recomendado)


int[] moreScores = new int[]{10, 20, 30};

// Arrays de referência (objetos)


String[] names = new String[3]; // [null, null, null]
names[0] = "Alice";
names[1] = "Bob";

// Acessando elementos
[Link](ages[0]); // 25
[Link](names[0]); // Alice

// Propriedade length
[Link]([Link]); // 4
}
}

5.2 Arrays Multidimensionais

public class MultiDimensionalArrayDemo {


public static void main(String[] args) {
// Matriz 3x3
int[][] matrix = new int[3][3];

// Inicialização
int[][] matrix2D = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};

// Acessando
[Link](matrix2D[0][0]); // 1
[Link](matrix2D[1][1]); // 5

// Arrays irregulares (colunas diferentes)


int[][] irregular = {
{1, 2},
{3, 4, 5},
{6}
};
}
}

5.3 ⚠️ Armadilhas Comuns com Arrays

Problema 1: Índices começam em 0

int[] data = {10, 20, 30};


// [Link](data[3]); // ❌ ArrayIndexOutOfBoundsException
[Link](data[2]); // ✅ 30 (último elemento)

Problema 2: Não inicializar antes de usar

int[] uninitialized;
// [Link](uninitialized[0]); // ❌ Erro de compilação

Problema 3: Tamanho é imutável


int[] fixed = new int[5];
// [Link] = 10; // ❌ Erro: length é read-only
// Solução: Usar ArrayList se tamanho dinâmico é necessário

Problema 4: Arrays de objetos apontam para null

String[] names = new String[3];


[Link](names[0]); // null
// [Link](names[0].length()); // ❌ NullPointerException
names[0] = "Alice"; // ✅ Agora é seguro
[Link](names[0].length()); // ✅ 5

6. Expressões, Statements e Blocos


6.1 Expressões (Expressions)

Uma expressão é uma sequência de variáveis, operadores e chamadas de métodos que avalia um
valor.

public class ExpressionDemo {


public static void main(String[] args) {
// Expressões simples
int x = 5;
int y = 2;

int result = x + y; // Expressão: x + y


boolean comparison = (x > y); // Expressão booleana
String concatenation = "Total: " + result; // Expressão com String

// Expressões com side effects


int z = ++x; // Expresssão + atualização
[Link](z); // 6
}
}
6.2 Statements

Um statement é uma unidade de execução completa. Geralmente termina com ponto-e-vírgula.

int age = 25; // Declaration statement


age = 26; // Expression statement
if (age > 18) { // Control flow statement
[Link]("Adulto");
}

6.3 Blocos

Um bloco é um grupo de statements entre chaves {} .

public class BlockDemo {


public static void main(String[] args) {
{ // Bloco aninhado
int localVar = 10;
[Link](localVar);
}
// [Link](localVar); // ❌ Erro: fora do escopo
}
}

7. Operadores
7.1 Operadores Aritméticos

Operador Símbolo Descrição Exemplo

Adição + Soma 5 + 3 = 8

Subtração - Subtrai 5 - 3 = 2

Multiplicação * Multiplica 5 * 3 = 15

Divisão / Divide (inteira se ambos são 5 / 2 = 2 (int), 5.0 / 2 = 2.5


int) (double)
Operador Símbolo Descrição Exemplo

Módulo % Resto 5 % 2 = 1

public class ArithmeticDemo {


public static void main(String[] args) {
int a = 10, b = 3;

[Link]("Soma: " + (a + b)); // 13


[Link]("Subtração: " + (a - b)); // 7
[Link]("Multiplicação: " + (a * b)); // 30
[Link]("Divisão: " + (a / b)); // 3 (inteira!)
[Link]("Divisão Decimal: " + (a / (double) b)); // 3.333...
[Link]("Módulo: " + (a % b)); // 1
}
}

7.2 Operadores de Atribuição

public class AssignmentDemo {


public static void main(String[] args) {
int x = 10;

x += 5; // x = x + 5 = 15
x -= 3; // x = x - 3 = 12
x *= 2; // x = x * 2 = 24
x /= 4; // x = x / 4 = 6
x %= 5; // x = x % 5 = 1

// Atribuição múltipla
int a = b = c = 5; // c = 5, b = 5, a = 5
}
}
7.3 Operadores Relacionais

Operador Descrição Resultado

== Igual a Booleano

!= Diferente de Booleano

> Maior que Booleano

< Menor que Booleano

>= Maior ou igual Booleano

<= Menor ou igual Booleano

public class RelationalDemo {


public static void main(String[] args) {
int x = 5;

[Link](x == 5); // true


[Link](x != 5); // false
[Link](x > 3); // true
[Link](x >= 5); // true
}
}

7.4 Operadores Lógicos

Operador Símbolo Descrição Exemplo

AND (E lógico) && Ambas verdadeiras true && true = true

OR (OU lógico) \|\| Pelo menos uma verdadeira true \|\| false = true

NOT (NÃO lógico) ! Inverte booleano !true = false

public class LogicalDemo {


public static void main(String[] args) {
boolean a = true, b = false;

[Link](a && b); // false (AND)


[Link](a || b); // true (OR)
[Link](!a); // false (NOT)

// Short-circuit evaluation
if (false && expensiveOperation()) {
// expensiveOperation() nunca é chamado!
}
}

static boolean expensiveOperation() {


[Link]("Executado");
return true;
}
}

7.5 Operadores Unários

public class UnaryDemo {


public static void main(String[] args) {
int x = 5;

// Incremento e Decremento
[Link](x++); // 5 (pós-incremento)
[Link](x); // 6

[Link](++x); // 7 (pré-incremento)
[Link](x); // 7

[Link](x--); // 7 (pós-decremento)
[Link](x); // 6

// Diferença prática
int[] arr = {10, 20, 30};
int result1 = arr[x++]; // arr[6], depois x = 7
int result2 = arr[++x]; // x = 8, depois arr[8] ❌ IndexOutOfBounds
}
}
7.6 Operador Ternário (Condicional)

public class TernaryDemo {


public static void main(String[] args) {
int age = 20;
String status = (age >= 18) ? "Adulto" : "Menor";
[Link](status); // Adulto

// Nested (use com cuidado)


int score = 85;
String grade = (score >= 90) ? "A" : (score >= 80) ? "B" : "C";
[Link](grade); // B
}
}

8. Controle de Fluxo
8.1 Declaração If-Else

public class IfElseDemo {


public static void main(String[] args) {
int age = 20;

// If simples
if (age >= 18) {
[Link]("Você é adulto");
}

// If-Else
if (age < 13) {
[Link]("Criança");
} else if (age < 18) {
[Link]("Adolescente");
} else {
[Link]("Adulto");
}
}
}

8.2 Declaração Switch

Java 8 e anterior:

public class SwitchOld {


public static void main(String[] args) {
String day = "MONDAY";
int dayNumber;

switch (day) {
case "MONDAY":
dayNumber = 1;
break; // ⚠️ Obrigatório!
case "TUESDAY":
dayNumber = 2;
break;
default:
dayNumber = 0;
}

[Link](dayNumber);
}
}

Java 17+ (Modern - Switch Expressions):

public class SwitchModern {


public static void main(String[] args) {
String day = "MONDAY";

// Switch como expressão (sem necessidade de break)


int dayNumber = switch (day) {
case "MONDAY" -> 1;
case "TUESDAY" -> 2;
case "WEDNESDAY" -> 3;
case "THURSDAY" -> 4;
case "FRIDAY" -> 5;
case "SATURDAY", "SUNDAY" -> 0; // Múltiplos casos
};

[Link](dayNumber); // 1

// Switch com blocos de código


String type = switch (dayNumber) {
case 1, 2, 3, 4, 5 -> "Weekday";
case 0 -> "Weekend";
default -> "Invalid";
};

[Link](type); // Weekday
}
}

Vantagens do Switch Moderno:

✅ Sem necessidade de break

✅ Pode ser usado como expressão (retorna valor)


✅ Suporta múltiplos casos na mesma linha
✅ Mais seguro (compiler avisa se não há cobertura completa)

8.3 Loops

For Loop:

public class ForLoopDemo {


public static void main(String[] args) {
// For tradicional
for (int i = 0; i < 5; i++) {
[Link]("i: " + i);
}
// For-each (enhanced for loop)
String[] fruits = {"Maçã", "Banana", "Laranja"};
for (String fruit : fruits) {
[Link](fruit);
}

// Loop com arrays bidimensionais


int[][] matrix = {{1, 2}, {3, 4}};
for (int[] row : matrix) {
for (int val : row) {
[Link](val + " ");
}
[Link]();
}
}
}

While Loop:

public class WhileLoopDemo {


public static void main(String[] args) {
int count = 0;
while (count < 3) {
[Link]("Count: " + count);
count++;
}

// Do-while (executa pelo menos uma vez)


int num = 0;
do {
[Link]("Num: " + num);
num++;
} while (num < 3);
}
}

Break e Continue:
public class BreakContinueDemo {
public static void main(String[] args) {
// Break - sai do loop
for (int i = 0; i < 10; i++) {
if (i == 5) {
break; // Para quando i == 5
}
[Link](i); // 0, 1, 2, 3, 4
}

// Continue - pula iteração


for (int i = 0; i < 5; i++) {
if (i == 2) {
continue; // Pula i == 2
}
[Link](i); // 0, 1, 3, 4
}
}
}

9. Input e Output (I/O)


9.1 Output: [Link]()

public class OutputDemo {


public static void main(String[] args) {
// println - imprime + quebra linha
[Link]("Olá, Java!");

// print - imprime sem quebra linha


[Link]("Nome: ");
[Link]("Alice");
[Link](); // Quebra linha

// String concatenation
String name = "Bob";
int age = 30;
[Link]("Nome: " + name + ", Idade: " + age);

// String formatting (Java 5+)


[Link]("Nome: %s, Idade: %d\n", name, age);

// Text Blocks (Java 15+) - para strings multilinha


String json = """
{
"nome": "Alice",
"idade": 25
}
""";
[Link](json);
}
}

9.2 Input: Scanner

Quando usar: Interface moderna, fácil de usar, quebra entrada em tokens.

import [Link];

public class ScannerDemo {


public static void main(String[] args) {
Scanner scanner = new Scanner([Link]);

// Ler String
[Link]("Digite seu nome: ");
String name = [Link](); // Lê linha inteira

// Ler inteiro
[Link]("Digite sua idade: ");
int age = [Link]();

// Ler decimal
[Link]("Digite sua altura: ");
double height = [Link]();
// Ler booleano
[Link]("É ativo? ");
boolean isActive = [Link]();

// Métodos úteis
if ([Link]()) {
int number = [Link]();
}

// Fechar scanner (importante!)


[Link]();

[Link]("\n--- Dados Capturados ---");


[Link]("Nome: " + name);
[Link]("Idade: " + age);
[Link]("Altura: " + height);
[Link]("Ativo: " + isActive);
}
}

9.3 Input: BufferedReader

Quando usar: Quando performance é crítica (lê strings mais rápido), ou para leitura de arquivos.

import [Link].*;

public class BufferedReaderDemo {


public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(
new InputStreamReader([Link])
);

// Ler linha (String)


[Link]("Digite seu nome: ");
String name = [Link]();

// Para ler números, é preciso converter


[Link]("Digite sua idade: ");
int age = [Link]([Link]());

// Fechar leitor
[Link]();

[Link]("Nome: " + name);


[Link]("Idade: " + age);
}
}

9.4 Comparação: Scanner vs BufferedReader

Aspecto Scanner BufferedReader

Performance Mais lento (parsing) Mais rápido

Facilidade de Uso Muito fácil Requer conversão manual

Métodos Disponíveis nextInt(), nextDouble(), nextLine() readLine() apenas

Quando Usar Input interativo simples Leitura em lote, arquivos

Manejo de Exceções Não obrigatório Obrigatório (IOException)

Recomendação: Use Scanner para aplicações simples e BufferedReader quando performance


importa.

10. Comparação: Java Antigo vs Moderno


10.1 Inicialização de Dados

Java 8 (Antigo):

public class Person {


private final String name;
private final int age;

public Person(String name, int age) {


[Link] = name;
[Link] = age;
}

public String getName() { return name; }


public int getAge() { return age; }

@Override
public String toString() {
return "Person{" + "name='" + name + '\'' +
", age=" + age + '}';
}
}

Java 17 (Moderno) - Records:

public record Person(String name, int age) {}


// Automaticamente gera: constructor, getters, toString(), equals(), hashCode()

10.2 Type Inference

Java 8:

List<String> names = new ArrayList<String>();


StringBuilder sb = new StringBuilder();

Java 10+:

var names = new ArrayList<String>();


var sb = new StringBuilder();

10.3 String Concatenation

Java 8:
String json = "{" +
"\"name\": \"Alice\"," +
"\"age\": 25" +
"}";

Java 15+:

String json = """


{
"name": "Alice",
"age": 25
}
""";

10.4 Pattern Matching para instanceof

Java 8:

Object obj = "Hello";


if (obj instanceof String) {
String str = (String) obj; // Cast necessário
[Link]([Link]());
}

Java 16+:

Object obj = "Hello";


if (obj instanceof String str) { // Pattern matching
[Link]([Link]());
}
11. Boas Práticas (Best Practices)
1. Sempre feche recursos (Scanner, BufferedReader, etc.)

try (Scanner scanner = new Scanner([Link])) {


// Use scanner aqui
} // Fecha automaticamente

2. Siga convenções de nomenclatura — isso melhora legibilidade

3. Inicialize todas as variáveis locais antes de usá-las

4. Use final para constantes

private static final int MAX_ATTEMPTS = 3;

5. Evite números mágicos — use constantes significativas

// ❌ Ruim
if (age > 18) { ... }

// ✅ Bom
if (age > LEGAL_AGE) { ... }

6. Use var sensatamente — apenas quando o tipo for óbvio

7. Prefira for-each quando iterando coleções

// ❌ Antigo
for (int i = 0; i < [Link](); i++) { ... }

// ✅ Moderno
for (Item item : list) { ... }
12. Armadilhas Comuns (Pitfalls) - Resumido

Armadilha Problema Solução

Missing semicolon int x = 5 Sempre terminar statements com


;

Confundir == com equals() "a" == "b" compara Usar .equals() para Strings
referência

NullPointerException Acessar atributo de null Verificar antes: if (obj != null)

ArrayIndexOutOfBounds arr[[Link]] Lembrar que índices vão de 0 a


length-1

Imprecisão em Float 0.1 + 0.2 != 0.3 Usar BigDecimal para precisão

Não fechar Scanner Resource leak Usar try-with-resources ou


.close()

Atribuição em lugar de if (x = 5) Usar == : if (x == 5)


comparação

Esquecer break no switch Fall-through indesejado Sempre adicionar break (ou usar
switch moderno)

13. Checklist de Domínio


Você pode considerar que domina completamente "Basic Syntax" quando consegue fazer tudo isso
sem consultar documentação:

Explicar a diferença entre identificadores e keywords

Listar os 50 keywords e 3 literals de Java

Nomear elementos (classes, métodos, variáveis) seguindo convenções

Declarar e usar os 8 tipos de dados primitivos corretamente

Calcular o range de cada tipo integral e saber quando usá-lo

Diferenciar float de double e saber riscos de imprecisão

Criar arrays uni e multidimensionais e evitar IndexOutOfBoundsException

Trabalhar com valores padrão de cada tipo


Usar operadores aritméticos, relacionais e lógicos corretamente

Implementar if-else e loops sem erros

Usar switch (antigo) e switch expressions (moderno) conforme versão

Ler e escrever entrada/saída com Scanner e BufferedReader

Entender diferenças entre versões de Java (8 vs 17+)

Reconhecer e evitar as armadilhas mais comuns

Aplicar boas práticas em todo código que escreve

14. Exercícios de Fixação


Exercício 1: Validação de Identificadores

Classifique cada um como válido ou inválido. Se inválido, explique por quê.

a) int myVariable = 10;


b) int 123variable = 5;
c) String _private_name = "test";
d) boolean isActive$ = true;
e) int class = 100;
f) double user-price = 19.99;
g) char $symbol = '@';

Solução:

a) ✅ Válido

b) ❌ Começa com número

c) ✅ Válido (underscore permitido)

d) ✅ Válido ($ permitido)

e) ❌ class é keyword

f) ❌ Hífen não permitido

g) ✅ Válido
Exercício 2: Tipos de Dados

Qual é o tipo mais apropriado para armazenar:

a) A idade de uma pessoa


b) O saldo de uma conta bancária
c) Uma letra do alfabeto
d) Se um usuário está ativo ou não
e) Coordenadas de latitude/longitude
f) A população mundial

Solução:

a) int ou byte (byte se economizar é crítico)

b) double ou melhor BigDecimal

c) char

d) boolean

e) double

f) long

Exercício 3: Arrays e Loops

Escreva código que:

1. Cria um array de 5 inteiros

2. Preenche com valores 10, 20, 30, 40, 50

3. Imprime cada valor em uma linha separada

4. Calcula e imprime a soma


public class ArrayExercise {
public static void main(String[] args) {
int[] numbers = {10, 20, 30, 40, 50};

int sum = 0;
for (int num : numbers) {
[Link](num);
sum += num;
}

[Link]("Soma: " + sum); // 150


}
}

Exercício 4: Scanner e Input

Escreva um programa que:

1. Pede ao usuário para digitar seu nome

2. Pede a idade

3. Pede a altura

4. Imprime um resumo formatado

import [Link];

public class UserInputExercise {


public static void main(String[] args) {
Scanner scanner = new Scanner([Link]);

[Link]("Nome: ");
String name = [Link]();

[Link]("Idade: ");
int age = [Link]();

[Link]("Altura (metros): ");


double height = [Link]();
[Link]();

[Link]("\n--- Dados ---");


[Link]("Nome: %s\nIdade: %d\nAltura: %.2f m\n", name, age, height);
}
}

Exercício 5: Operadores e Lógica

Escreva código que determina a categoria de um IMC:

IMC < 18.5: Abaixo do peso

18.5 ≤ IMC < 25: Peso normal

25 ≤ IMC < 30: Sobrepeso

IMC ≥ 30: Obeso

Cálculo: IMC = peso (kg) / (altura (m))²

import [Link];

public class BMICalculator {


public static void main(String[] args) {
Scanner scanner = new Scanner([Link]);

[Link]("Peso (kg): ");


double weight = [Link]();

[Link]("Altura (m): ");


double height = [Link]();

[Link]();

double bmi = weight / (height * height);

String category = (bmi < 18.5) ? "Abaixo do peso" :


(bmi < 25) ? "Peso normal" :
(bmi < 30) ? "Sobrepeso" :
"Obeso";

[Link]("IMC: %.2f - %s\n", bmi, category);


}
}

Exercício 6: Switch Expressions (Java 17+)

Reescreva o exercício anterior usando switch expressions:

import [Link];

public class BMICalculatorModern {


public static void main(String[] args) {
Scanner scanner = new Scanner([Link]);

[Link]("Peso (kg): ");


double weight = [Link]();

[Link]("Altura (m): ");


double height = [Link]();

[Link]();

double bmi = weight / (height * height);

String category = switch ((int) bmi) {


case 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18 ->
"Abaixo do peso";
case 19, 20, 21, 22, 23, 24 -> "Peso normal";
case 25, 26, 27, 28, 29 -> "Sobrepeso";
default -> "Obeso";
};

[Link]("IMC: %.2f - %s\n", bmi, category);


}
}

15. Pequenos Projetos para Praticar


Projeto 1: Calculadora Simples

Crie uma calculadora que:

Lê dois números

Lê uma operação (+, -, *, /)

Realiza a operação

Imprime o resultado

Projeto 2: Gerenciador de Notas

Crie um programa que:

Pede a quantidade de notas

Lê as notas em um array

Calcula média, máxima e mínima

Imprime relatório

Projeto 3: Jogo da Adivinhação

Crie um jogo que:

Gera um número aleatório 1-100

O usuário tenta adivinhar

Feedback "maior" ou "menor"

Conta tentativas

Parabeniza ao acertar
Projeto 4: Conversor de Temperaturas

Crie um programa que:

Converte Celsius para Fahrenheit

Converte Fahrenheit para Celsius

Usa menu (switch) para escolher operação

Valida entrada

Projeto 5: Gerenciador de Tabuada

Crie um programa que:

Pede um número de 1 a 10

Imprime sua tabuada (1-10)

Pergunta se deseja outra

Usa loop para múltiplas tabuadas

Conclusão
Dominar Java Basic Syntax não é apenas memorizar sintaxe — é entender por quê a linguagem
funciona dessa forma e como evitar armadilhas comuns.

Você agora tem:

✅ Compreensão profunda de cada elemento


✅ Comparações práticas entre versões (8 vs 17+)
✅ Conhecimento de boas práticas profissionais
✅ Consciência de armadilhas e como evitá-las
✅ Exercícios para consolidar aprendizado
✅ Pequenos projetos para praticar

O próximo passo é aplicar esses conceitos em projetos reais e explorar estruturas de controle mais
avançadas (métodos, classes, OOP).
Sucesso em sua jornada Java! 🚀

Você também pode gostar