Sua dose diária de programação

Conceito, 3 exemplos e 3 exercícios: uma pequena conquista de cada vez.

✦   Lição

Seu primeiro programa

Um programa Java tradicional mora dentro de uma classe, e a execução começa pelo método public static void main(String[] args). Quando a classe é public, o arquivo precisa ter o mesmo nome dela: public class Main fica em Main.java.

Java Fundamentos Iniciante 3 exemplos + 3 exercícios
42 lições publicadas 10 linguagens novas lições todo dia útil
Java / Fundamentos

Seu primeiro programa

por Ellery Blackwood
Iniciante

Entenda o conceito

Um programa Java tradicional mora dentro de uma classe, e a execução começa pelo método public static void main(String[] args). Quando a classe é public, o arquivo precisa ter o mesmo nome dela: public class Main fica em Main.java.

Para mostrar texto no terminal, use System.out.println, que imprime e pula linha, ou System.out.print, que imprime e deixa o cursor na mesma linha. Textos (String) ficam entre aspas duplas, e o operador + junta textos e números.

Desde o Java 11 dá para rodar um arquivo único direto com java Main.java, sem chamar o javac antes. E desde o Java 25 existe o arquivo de código compacto: um void main() sem classe declarada, com IO.println para imprimir, ideal para os primeiros passos.

↳ Pontos-chave
  • O nome da classe public deve ser igual ao nome do arquivo, com a mesma caixa: Main em Main.java.
  • A execução começa em public static void main(String[] args); cada instrução termina com ;.
  • println imprime e pula linha; print imprime e continua na mesma linha.
  • Em "Total: " + (2 * 15), os parênteses fazem a conta antes de juntar o número ao texto.
  • java Main.java compila e roda um arquivo único; no Java 25+, void main() dispensa a classe.

Do conceito à prática

3 exemplos para ver a ideia funcionando.

01Olá, mundo na loja

Main.java
// Todo programa Java começa por uma classe.
// O nome da classe pública deve ser igual ao nome do arquivo: Main.java.
public class Main {

    // O método main é o ponto de entrada: a JVM começa a execução por aqui.
    public static void main(String[] args) {
        // println imprime o texto e pula para a próxima linha.
        System.out.println("Olá, mundo!");
        System.out.println("Bem-vindo à loja Daily.");

        // Cada instrução termina com ponto e vírgula.
        System.out.println("Hoje temos 3 produtos em promoção.");

        // Uma linha vazia também é saída válida.
        System.out.println();

        System.out.println("Volte sempre!");
    }
}

O exemplo mostra o esqueleto mínimo de um programa Java: a classe Main, salva em Main.java, e o método main, que é por onde a JVM começa. Cada System.out.println imprime uma linha, e println() sem argumento imprime uma linha vazia.

Para rodar, basta java Main.java no terminal. Em projetos maiores, o caminho clássico é compilar com javac Main.java (gera Main.class) e depois executar com java Main.

02Receita com print, concatenação e escapes

Receita.java
public class Receita {

    public static void main(String[] args) {
        // print NÃO pula linha: o próximo texto continua na mesma linha.
        System.out.print("Receita: ");
        System.out.println("Bolo de cenoura");

        // O operador + junta (concatena) textos e números.
        System.out.println("Porções: " + 8);
        System.out.println("Tempo de forno: " + 40 + " minutos");

        // Parênteses fazem a conta antes da concatenação.
        System.out.println("Ovos para duas receitas: " + (3 * 2));

        // \n quebra a linha e \t insere uma tabulação dentro do texto.
        System.out.println("\nIngredientes:");
        System.out.println("\t- 3 cenouras");
        System.out.println("\t- 3 ovos");
        System.out.println("\t- 2 xícaras de farinha");

        // \" coloca aspas dentro de uma String.
        System.out.println("Dica: sirva com \"calda de chocolate\".");
    }
}

Aqui aparecem as ferramentas básicas para montar a saída: print para continuar na mesma linha, + para juntar textos e números e parênteses para fazer a conta antes da concatenação.

As sequências de escape resolvem caracteres especiais dentro das aspas: \n quebra a linha, \t insere uma tabulação e \" coloca aspas no meio do texto sem encerrar a String.

03Placar em arquivo compacto com printf

Placar.java
// Desde o Java 25 existe o "arquivo de código compacto":
// sem declarar a classe e com um main sem public, static nem args.
// Ótimo para scripts e estudo; projetos maiores seguem com classes.

void main() {
    // IO.println faz parte do java.lang: não precisa de import.
    IO.println("=== Placar da rodada ===");

    // printf formata a saída: %s recebe texto, %d recebe inteiro
    // e %n quebra a linha do jeito do sistema operacional.
    System.out.printf("%-8s %5d pontos%n", "Ana", 120);
    System.out.printf("%-8s %5d pontos%n", "Bruno", 95);
    System.out.printf("%-8s %5d pontos%n", "Carla", 210);

    // A conta entre parênteses é feita antes de virar texto.
    IO.println("Total da rodada: " + (120 + 95 + 210));

    // Text block (aspas triplas): várias linhas sem \n nem +.
    String regras = """
            Regras:
              - vitória vale 3 pontos
              - empate vale 1 ponto""";
    IO.println(regras);
}

Este arquivo usa o formato compacto do Java 25+: não há class, e o void main() dispensa public, static e args. O IO.println vem do pacote java.lang, por isso funciona sem import. Rode com java Placar.java normalmente.

O printf alinha o placar em colunas: %-8s reserva 8 colunas para o nome (à esquerda) e %5d reserva 5 para os pontos (à direita). O text block entre """ guarda várias linhas sem precisar de \n ou +.


Agora é com você

Tente resolver no rascunho antes de abrir a resposta. Os códigos não são executados nesta página.

01Ficha de empréstimo da bibliotecaFácil

Escreva um programa que imprima a ficha de empréstimo de um livro, com uma informação por linha, exatamente como na saída esperada.

↳ Requisitos
  • A classe se chama Emprestimo e fica no arquivo Emprestimo.java.
  • Usa System.out.println para cada uma das quatro linhas.
  • A saída é idêntica à esperada, inclusive acentos, espaços e a barra da data.
código inicial
public class Emprestimo {

    public static void main(String[] args) {
        // Imprima as quatro linhas da ficha aqui.
    }
}
saída esperada
Biblioteca Municipal
Livro: Dom Casmurro
Autor: Machado de Assis
Devolver até: 27/10
Ver dica

Uma chamada a println gera exatamente uma linha; conte quantas linhas a ficha tem.

Ver resposta
public class Emprestimo {

    public static void main(String[] args) {
        // Cada println imprime uma linha e pula para a seguinte.
        System.out.println("Biblioteca Municipal");
        System.out.println("Livro: Dom Casmurro");
        System.out.println("Autor: Machado de Assis");
        System.out.println("Devolver até: 27/10");
    }
}

Passo a passo

  1. public class Emprestimo declara a classe; como ela é pública, o arquivo precisa se chamar Emprestimo.java, com a mesma caixa.
  2. public static void main(String[] args) é o ponto de entrada: é o método que a JVM procura para começar a execução.
  3. A primeira chamada a System.out.println imprime o nome da biblioteca e pula para a linha seguinte.
  4. As três chamadas seguintes imprimem livro, autor e data, uma por linha, na ordem em que aparecem no código.
  5. Cada instrução termina com ; e todo o corpo do método fica entre as chaves de main.

Por que funciona

O Java executa as instruções de main de cima para baixo, uma de cada vez. Como println sempre acrescenta a quebra de linha no fim, quatro chamadas produzem exatamente quatro linhas, e a ordem do código é a ordem da saída.

Esse é o esqueleto de qualquer programa Java tradicional: uma classe com o mesmo nome do arquivo e um método main com a assinatura exata. Tudo que vier nas próximas lições vai morar dentro dessa estrutura.

Erros comuns

  • Nome do arquivo diferente da classe: salvar public class Emprestimo em Main.java gera o erro de compilação "class Emprestimo is public, should be declared in a file named Emprestimo.java". Renomeie o arquivo ou a classe.
  • Esquecer o ponto e vírgula: System.out.println("Livro: Dom Casmurro") sem ; dá "';' expected". Coloque o ; no fim de cada instrução.
  • Letra minúscula em System: system.out.println(...) não compila ("package system does not exist"), porque o Java diferencia maiúsculas de minúsculas. Escreva System com S maiúsculo.
  • Aspas simples no texto: 'Dom Casmurro' não é uma String em Java; aspas simples servem só para um caractere (char). Use aspas duplas.

Outra forma de resolver

No Java 25 ou mais novo, dá para usar um arquivo de código compacto, sem declarar a classe:

void main() {
    IO.println("Biblioteca Municipal");
    IO.println("Livro: Dom Casmurro");
    IO.println("Autor: Machado de Assis");
    IO.println("Devolver até: 27/10");
}

Essa forma é boa para scripts e estudo; em projetos com vários arquivos, a classe explícita continua sendo o padrão.

Saída esperada

Biblioteca Municipal
Livro: Dom Casmurro
Autor: Machado de Assis
Devolver até: 27/10

02Cupom de compra da lojaMédio

Imprima o cupom de uma compra com dois produtos: 2 cadernos de R$ 15 e 3 canetas de R$ 4. Os subtotais e o total devem ser calculados pelo programa, não digitados prontos.

↳ Requisitos
  • A linha do cliente é escrita com print para o rótulo e println para o nome.
  • Subtotais e total são expressões entre parênteses, como (2 * 15), concatenadas ao texto.
  • Nenhum dos valores 30, 12 ou 42 aparece digitado no código.
  • A saída é idêntica à esperada.
código inicial
public class Cupom {

    public static void main(String[] args) {
        System.out.println("=== CUPOM ===");
        // Imprima o cliente e os itens, calculando os valores.
    }
}
saída esperada
=== CUPOM ===
Cliente: Marina
Caderno x2: R$ 30
Caneta x3: R$ 12
Total: R$ 42
Ver dica

Teste "R$ " + 2 * 15 + 3 * 4 e veja o que aparece: a ordem em que o + é avaliado importa.

Ver resposta
public class Cupom {

    public static void main(String[] args) {
        System.out.println("=== CUPOM ===");

        // print mantém o cursor na mesma linha; println completa e pula.
        System.out.print("Cliente: ");
        System.out.println("Marina");

        // Parênteses garantem que a conta é feita antes da concatenação.
        System.out.println("Caderno x2: R$ " + (2 * 15));
        System.out.println("Caneta x3: R$ " + (3 * 4));
        System.out.println("Total: R$ " + (2 * 15 + 3 * 4));
    }
}

Passo a passo

  1. System.out.println("=== CUPOM ===") imprime o título e já pula para a próxima linha.
  2. System.out.print("Cliente: ") escreve o rótulo sem quebrar a linha, então o cursor fica logo depois do espaço.
  3. System.out.println("Marina") continua na mesma linha, completando Cliente: Marina, e só então pula.
  4. Em "Caderno x2: R$ " + (2 * 15), os parênteses fazem o Java calcular 30 primeiro; depois o + junta o número ao texto.
  5. A linha da caneta segue a mesma ideia, com (3 * 4) resultando em 12.
  6. O total usa (2 * 15 + 3 * 4): dentro dos parênteses vale a precedência da matemática, multiplicação antes da soma, e o resultado 42 é concatenado ao texto.

Por que funciona

O operador + tem dois papéis em Java: soma números e concatena textos. Ele é avaliado da esquerda para a direita, e assim que um dos lados é uma String o resultado vira String. Por isso a conta precisa estar entre parênteses: eles obrigam o Java a resolver a parte numérica antes de entrar na concatenação.

Já a dupla print + println mostra que a quebra de linha é uma escolha sua: print deixa a linha aberta para o próximo texto, e println a encerra.

Erros comuns

  • Conta sem parênteses: "Total: R$ " + 2 * 15 + 3 * 4 imprime Total: R$ 3012. A multiplicação acontece antes, mas as somas viram concatenação: "... 30" + 12. Coloque a conta inteira entre parênteses.
  • Usar println no rótulo: System.out.println("Cliente: ") seguido de println("Marina") deixa o nome sozinho na linha de baixo. Use print no rótulo.
  • Esquecer o espaço no fim do texto: print("Cliente:") gera Cliente:Marina, diferente da saída esperada. O espaço faz parte da String.

Outra forma de resolver

Dá para montar a linha do cliente numa chamada só, concatenando os dois textos:

System.out.println("Cliente: " + "Marina");

Isso fica mais curto quando os dois pedaços estão prontos ao mesmo tempo; print é preferível quando o texto é escrito em etapas, por exemplo dentro de um laço.

Saída esperada

=== CUPOM ===
Cliente: Marina
Caderno x2: R$ 30
Caneta x3: R$ 12
Total: R$ 42

03Boletim alinhado com printfDesafio

Monte o boletim de uma aluna em formato de tabela, com as colunas alinhadas por printf. A média das três notas (80, 75 e 91) deve ser calculada no próprio printf.

↳ Requisitos
  • Usa printf com %-12s para a disciplina e %5d (ou %5s no cabeçalho) para a nota.
  • Cada linha formatada termina com %n.
  • A média é passada ao printf como a expressão (80 + 75 + 91) / 3.
  • A última linha mostra o nome da aluna entre aspas duplas, usando \".
código inicial
public class Boletim {

    public static void main(String[] args) {
        System.out.printf("%-12s %5s%n", "Disciplina", "Nota");
        System.out.println("------------------");
        // Imprima as disciplinas, o separador, a média e o nome da aluna.
    }
}
saída esperada
Disciplina    Nota
------------------
Matemática      80
Português       75
Ciências        91
------------------
Média           82
Aluna: "Luísa Prado"
Ver dica

Repita o mesmo molde de formato em todas as linhas da tabela; só os valores mudam.

Ver resposta
public class Boletim {

    public static void main(String[] args) {
        // Cabeçalho alinhado: %-12s ocupa 12 colunas, texto à esquerda.
        System.out.printf("%-12s %5s%n", "Disciplina", "Nota");
        System.out.println("------------------");

        // %5d ocupa 5 colunas, número à direita.
        System.out.printf("%-12s %5d%n", "Matemática", 80);
        System.out.printf("%-12s %5d%n", "Português", 75);
        System.out.printf("%-12s %5d%n", "Ciências", 91);
        System.out.println("------------------");

        // A expressão é calculada antes de ser formatada.
        System.out.printf("%-12s %5d%n", "Média", (80 + 75 + 91) / 3);
        System.out.println("Aluna: \"Luísa Prado\"");
    }
}

Passo a passo

  1. printf("%-12s %5s%n", "Disciplina", "Nota") monta o cabeçalho: %-12s reserva 12 colunas e alinha o texto à esquerda; %5s reserva 5 colunas e alinha à direita.
  2. println("------------------") desenha a linha separadora com 18 hifens, a mesma largura da tabela (12 + 1 espaço + 5).
  3. Cada disciplina usa "%-12s %5d%n": o nome ocupa 12 colunas e a nota, um inteiro (%d), ocupa 5 colunas alinhada à direita.
  4. %n encerra cada linha; ao contrário do printf sem ele, o cursor passa para a linha seguinte.
  5. A média é passada como (80 + 75 + 91) / 3: o Java calcula 246 / 3, que dá 82, e só então o printf formata o número.
  6. A última linha usa \" para colocar aspas duplas dentro da String sem encerrá-la.

Por que funciona

O printf separa o formato dos valores: o primeiro argumento é um molde com marcadores (%s, %d, %n), e os argumentos seguintes preenchem esses marcadores na ordem. Como todas as linhas usam as mesmas larguras, as colunas ficam alinhadas sem que você conte espaços à mão.

Os acentos de "Matemática" e "Ciências" contam como um caractere cada, então a largura de 12 colunas continua correta. O cálculo da média é feito antes da formatação, pois os argumentos de um método são avaliados antes de o método rodar.

Erros comuns

  • Esquecer o %n: printf("%-12s %5d", "Matemática", 80) não pula linha, e todas as disciplinas saem grudadas numa linha só. Termine o formato com %n.
  • Tipo errado no marcador: printf("%5d%n", "80") compila, mas lança IllegalFormatConversionException ao rodar, porque %d espera um número e recebeu texto. Passe 80 sem aspas ou use %s.
  • Esquecer o sinal de menos: %12s alinha o nome à direita, e a tabela fica com os nomes encostados nas notas. Use %-12s para alinhar à esquerda.
  • Aspas sem escape: "Aluna: "Luísa Prado"" não compila, porque a segunda aspa fecha a String. Escreva \" em cada aspa interna.

Outra forma de resolver

O método formatted da String (Java 15+) aplica o mesmo molde e devolve o texto, que você imprime com println:

System.out.println("%-12s %5d".formatted("Matemática", 80));

Ele é útil quando você quer guardar a linha formatada numa variável antes de imprimir ou juntar várias linhas; para imprimir direto, o printf é mais curto.

Saída esperada

Disciplina    Nota
------------------
Matemática      80
Português       75
Ciências        91
------------------
Média           82
Aluna: "Luísa Prado"

Últimas lições

Ver o arquivo completo →