Seu primeiro programa
por Ellery BlackwoodEntenda 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.
- O nome da classe
publicdeve ser igual ao nome do arquivo, com a mesma caixa:MainemMain.java. - A execução começa em
public static void main(String[] args); cada instrução termina com;. printlnimprime e pula linha;printimprime 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.javacompila 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
// 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
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
// 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.
- A classe se chama
Emprestimoe fica no arquivoEmprestimo.java. - Usa
System.out.printlnpara cada uma das quatro linhas. - A saída é idêntica à esperada, inclusive acentos, espaços e a barra da data.
public class Emprestimo {
public static void main(String[] args) {
// Imprima as quatro linhas da ficha aqui.
}
}
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
public class Emprestimodeclara a classe; como ela é pública, o arquivo precisa se chamarEmprestimo.java, com a mesma caixa.public static void main(String[] args)é o ponto de entrada: é o método que a JVM procura para começar a execução.- A primeira chamada a
System.out.printlnimprime o nome da biblioteca e pula para a linha seguinte. - As três chamadas seguintes imprimem livro, autor e data, uma por linha, na ordem em que aparecem no código.
- Cada instrução termina com
;e todo o corpo do método fica entre as chaves demain.
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 EmprestimoemMain.javagera 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. EscrevaSystemcom 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.
- A linha do cliente é escrita com
printpara o rótulo eprintlnpara 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.
public class Cupom {
public static void main(String[] args) {
System.out.println("=== CUPOM ===");
// Imprima o cliente e os itens, calculando os valores.
}
}
=== 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
System.out.println("=== CUPOM ===")imprime o título e já pula para a próxima linha.System.out.print("Cliente: ")escreve o rótulo sem quebrar a linha, então o cursor fica logo depois do espaço.System.out.println("Marina")continua na mesma linha, completandoCliente: Marina, e só então pula.- Em
"Caderno x2: R$ " + (2 * 15), os parênteses fazem o Java calcular30primeiro; depois o+junta o número ao texto. - A linha da caneta segue a mesma ideia, com
(3 * 4)resultando em12. - 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 resultado42é 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 * 4imprimeTotal: 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 deprintln("Marina")deixa o nome sozinho na linha de baixo. Useprintno rótulo. - Esquecer o espaço no fim do texto:
print("Cliente:")geraCliente:Marina, diferente da saída esperada. O espaço faz parte daString.
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.
- Usa
printfcom%-12spara a disciplina e%5d(ou%5sno cabeçalho) para a nota. - Cada linha formatada termina com
%n. - A média é passada ao
printfcomo a expressão(80 + 75 + 91) / 3. - A última linha mostra o nome da aluna entre aspas duplas, usando
\".
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.
}
}
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
printf("%-12s %5s%n", "Disciplina", "Nota")monta o cabeçalho:%-12sreserva 12 colunas e alinha o texto à esquerda;%5sreserva 5 colunas e alinha à direita.println("------------------")desenha a linha separadora com 18 hifens, a mesma largura da tabela (12 + 1 espaço + 5).- Cada disciplina usa
"%-12s %5d%n": o nome ocupa 12 colunas e a nota, um inteiro (%d), ocupa 5 colunas alinhada à direita. %nencerra cada linha; ao contrário doprintfsem ele, o cursor passa para a linha seguinte.- A média é passada como
(80 + 75 + 91) / 3: o Java calcula246 / 3, que dá82, e só então oprintfformata o número. - A última linha usa
\"para colocar aspas duplas dentro daStringsem 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çaIllegalFormatConversionExceptionao rodar, porque%despera um número e recebeu texto. Passe80sem aspas ou use%s. - Esquecer o sinal de menos:
%12salinha o nome à direita, e a tabela fica com os nomes encostados nas notas. Use%-12spara alinhar à esquerda. - Aspas sem escape:
"Aluna: "Luísa Prado""não compila, porque a segunda aspa fecha aString. 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"