Java existe desde 1995 e continua sendo uma das linguagens mais usadas do mundo. Se você quer trabalhar com Android, sistemas empresariais ou até jogos, Java é um caminho sólido. Mas a maioria dos tutoriais começa com teoria interminável e você acaba desistindo antes de escrever seu primeiro código.
Este guia é diferente. Vou direto ao ponto com exemplos que você pode testar agora mesmo. O foco é fazer você entender a lógica por trás da linguagem e escrever código funcional.
O Primeiro Programa: Entendendo a Estrutura
Todo programa Java precisa de uma classe e um método main. É aqui que tudo começa. Vamos criar um exemplo simples que mostra como funciona a estrutura básica:
public class PrimeiroPrograma {
public static void main(String[] args) {
System.out.println("Olá, mundo Java!");
}
}
Para executar esse código, você precisa salvar o arquivo como PrimeiroPrograma.java e compilar com javac PrimeiroPrograma.java. Depois execute com java PrimeiroPrograma. A saída será "Olá, mundo Java!".
Repare na palavra public — significa que a classe é acessível de qualquer lugar. O static no método main indica que ele pode ser chamado sem criar um objeto da classe. Isso é obrigatório para o ponto de entrada do programa.
Variáveis e Tipos: Os Blocos de Construção
Java é uma linguagem estaticamente tipada. Ou seja, você precisa declarar o tipo de cada variável. Isso pode parecer burocrático, mas evita erros silenciosos que acontecem em outras linguagens.
public class VariaveisJava {
public static void main(String[] args) {
int idade = 25;
double salario = 4500.50;
String nome = "Maria Silva";
boolean ativo = true;
char categoria = 'A';
System.out.println("Nome: " + nome);
System.out.println("Idade: " + idade);
System.out.println("Salário: " + salario);
System.out.println("Ativo: " + ativo);
System.out.println("Categoria: " + categoria);
}
}
Os tipos primitivos mais usados são int para números inteiros, double para decimais, boolean para verdadeiro/falso e char para um único caractere. Para textos maiores, usamos a classe String.
Uma dica importante: nomes de variáveis seguem o padrão camelCase no Java. Comece com letra minúscula e use maiúsculas para separar palavras: salarioAnual, dataNascimento, enderecoCompleto.
Controle de Fluxo com If e Else
Tomar decisões é essencial em qualquer programa. O Java usa a mesma sintaxe de muitas outras linguagens, o que facilita a vida de quem já conhece C ou JavaScript.
public class ControleFluxo {
public static void main(String[] args) {
int nota = 78;
if (nota >= 90) {
System.out.println("Excelente! Passou com mérito.");
} else if (nota >= 60) {
System.out.println("Aprovado!");
} else {
System.out.println("Reprovado. Estude mais!");
}
// Operador ternário para decisões simples
String resultado = (nota >= 60) ? "Passou" : "Não passou";
System.out.println("Resultado: " + resultado);
}
}
O operador ternário é ótimo para atribuições rápidas, mas cuidado para não exagerar. Se a lógica ficar complexa, prefira o if/else tradicional. Seu código vai ser mais legível.
Laços de Repetição: For, While e Do-While
Programas reais processam dados repetidamente. Java oferece três estruturas de repetição principais. Vou mostrar cada uma com um exemplo prático.
public class LacosRepeticao {
public static void main(String[] args) {
// For: quando sabemos quantas vezes repetir
System.out.println("Contando de 1 a 5:");
for (int i = 1; i <= 5; i++) {
System.out.print(i + " ");
}
System.out.println();
// While: quando não sabemos quantas vezes
int tentativa = 0;
int chute = 0;
java.util.Random random = new java.util.Random();
int segredo = random.nextInt(10) + 1;
while (chute != segredo) {
tentativa++;
chute = random.nextInt(10) + 1;
System.out.println("Tentativa " + tentativa + ": " + chute);
}
System.out.println("Acertou em " + tentativa + " tentativas!");
// Do-while: executa pelo menos uma vez
int contador = 10;
do {
System.out.println("Contador: " + contador);
contador -= 3;
} while (contador > 3);
}
}
O for é ideal quando você sabe exatamente quantas iterações serão necessárias. O while é perfeito para condições que dependem de fatores externos, como esperar entrada do usuário. Já o do-while garante execução pelo menos uma vez.
Arrays e Coleções: Trabalhando com Dados
Dados raramente existem isolados. Java oferece arrays para coleções de tamanho fixo e ArrayList para listas dinâmicas.
import java.util.ArrayList;
import java.util.List;
public class ArraysJava {
public static void main(String[] args) {
// Array tradicional - tamanho fixo
int[] numeros = {10, 20, 30, 40, 50};
System.out.println("Segundo número: " + numeros[1]);
System.out.println("Tamanho do array: " + numeros.length);
// ArrayList - tamanho dinâmico
List<String> nomes = new ArrayList<>();
nomes.add("Ana");
nomes.add("Bruno");
nomes.add("Carla");
nomes.add("Diego");
System.out.println("Lista de nomes:");
for (String nome : nomes) {
System.out.println("- " + nome);
}
// Remove um elemento
nomes.remove("Bruno");
System.out.println("Após remoção: " + nomes.size() + " nomes restantes");
}
}
A diferença principal é a flexibilidade. Arrays têm desempenho melhor para tamanhos fixos, enquanto ArrayList cresce conforme necessário. Para a maioria dos casos, prefira ArrayList.
Trabalhando com Orientação a Objetos
Java é uma linguagem orientada a objetos, e isso não é opcional. Saber criar classes e objetos é fundamental. Vou criar um exemplo simples de uma conta bancária.
public class ContaBancaria {
private String titular;
private double saldo;
public ContaBancaria(String titular, double saldoInicial) {
this.titular = titular;
this.saldo = saldoInicial;
}
public void depositar(double valor) {
if (valor > 0) {
saldo += valor;
System.out.println("Depósito de R$" + valor + " realizado.");
}
}
public boolean sacar(double valor) {
if (valor > 0 && valor <= saldo) {
saldo -= valor;
System.out.println("Saque de R$" + valor + " realizado.");
return true;
}
System.out.println("Saque inválido!");
return false;
}
public void exibirSaldo() {
System.out.println("Titular: " + titular + " | Saldo: R$" + saldo);
}
}
Agora uma classe principal para testar nossa conta:
public class TesteConta {
public static void main(String[] args) {
ContaBancaria conta = new ContaBancaria("João Silva", 1000.00);
conta.exibirSaldo();
conta.depositar(500.00);
conta.sacar(200.00);
conta.sacar(5000.00); // Vai falhar de propósito