02 / 11 Curso de Java do zero | fundamentos e linguagem · Aula escrita · atualizado em 13 out 2026

Como transformar uma regra em um programa Java?

“Aluno com média a partir de sete está aprovado.” A frase parece simples, mas ainda deixa perguntas: quais notas são válidas? O que acontece se não houver notas? A média de 7 e 8 deve ser 7 ou 7,5? Programar começa ao tornar essas decisões explícitas.

Fernanda Kipper
Fernanda Kipper
Próxima aula →

“Aluno com média a partir de sete está aprovado.” A frase parece simples, mas ainda deixa perguntas: quais notas são válidas? O que acontece se não houver notas? A média de 7 e 8 deve ser 7 ou 7,5? Programar começa ao tornar essas decisões explícitas.

Vamos construir um programa que calcula uma média válida e informa o resultado. Você precisa conseguir compilar uma classe com main. Todos os exemplos usam Java 21. Ao final, você vai explicar uma condição, acompanhar um laço e separar uma regra em método.

Uma variável guarda um valor com um tipo

Em int quantidade = 3, quantidade é o nome, int é o tipo e 3 é o valor inicial. O tipo define quais valores e operações fazem sentido. boolean representa verdadeiro ou falso; int guarda inteiros; double representa números de ponto flutuante; char representa uma unidade de código UTF-16.

String é uma classe usada para texto. Ela é um tipo de referência, diferente dos tipos primitivos. Uma variável de referência permite acessar um objeto; pode também conter null, indicando ausência de referência. Não confunda isso com texto vazio, "", que é uma string existente com comprimento zero.

Java verifica tipos durante a compilação. Isso não significa que identifica todos os erros: int total = 7 / 2 é válido e resulta em 3. Os dois operandos são inteiros, então a divisão descarta a parte fracionária. double total = 7 / 2 continua produzindo 3,0: a conversão ocorre depois da divisão. Para obter 3,5, use 7 / 2.0 ou converta um operando antes.

Condição é uma pergunta com duas respostas

media >= 7 produz um booleano. O if escolhe o caminho conforme esse valor:

if (media >= 7) {
    System.out.println("Aprovado");
} else {
    System.out.println("Precisa revisar");
}

Aqui estamos olhando apenas um trecho: media precisa existir antes dele. Com 7, o primeiro bloco executa. Com 6,9, executa o segundo. Testar o valor exatamente no limite evita trocar >= por > sem perceber.

Podemos combinar perguntas com &&, “e”, e ||, “ou”. nota >= 0 && nota <= 10 exige as duas condições. nota < 0 || nota > 10 rejeita qualquer extremo inválido. Esses operadores fazem curto-circuito: podem dispensar o segundo teste se o primeiro já determina o resultado.

switch ajuda quando a decisão depende de opções discretas, como estados de uma matrícula. if costuma ser mais direto para intervalos numéricos. A ferramenta vem depois da pergunta que você precisa responder.

Array guarda uma sequência com tamanho definido

int[] notas = {7, 8, 9}; cria um array com três elementos. Seus índices são 0, 1 e 2. notas.length vale 3. O índice final é comprimento menos um, porque começamos a contagem em zero.

O array permite alterar elementos, mas seu comprimento não muda. Acrescentar uma quarta posição exige outro array ou uma estrutura que gerencie crescimento, como ArrayList, estudada depois. Não é preciso aprender coleções para somar três notas.

Um laço repete instruções. No for abaixo, i começa em zero, o corpo executa enquanto i < notas.length, e i++ aumenta o índice após cada execução:

int soma = 0;
for (int i = 0; i < notas.length; i++) {
    soma = soma + notas[i];
}

Depois das três passagens, soma assume 7, 15 e 24. Quando i chega a 3, a condição fica falsa e o corpo não executa. Usar <= tentaria acessar índice 3, inexistente.

O while testa uma condição antes de repetir, mas deixa a atualização sob sua responsabilidade. Se a condição nunca mudar, o laço pode continuar indefinidamente. Antes de executar qualquer laço, responda: o que faz essa repetição terminar?

Método dá um nome a uma operação

Um método recebe parâmetros, executa instruções e pode devolver um resultado. Vamos nomear a operação como media. Aqui está o programa completo, para salvar em Boletim.java:

public class Boletim {
    static double media(int[] notas) {
        if (notas == null || notas.length == 0) {
            throw new IllegalArgumentException("Informe notas");
        }
        long soma = 0;
        for (int nota : notas) {
            if (nota < 0 || nota > 10) {
                throw new IllegalArgumentException("Nota fora de 0 a 10");
            }
            soma += nota;
        }
        return (double) soma / notas.length;
    }

    public static void main(String[] args) {
        int[] notas = {7, 8, 9};
        double resultado = media(notas);
        System.out.println("Média: " + resultado);
        if (resultado >= 7) {
            System.out.println("Aprovado");
        } else {
            System.out.println("Precisa revisar");
        }
    }
}

Execute javac --release 21 Boletim.java e java Boletim. A saída é Média: 8.0, seguida de Aprovado.

O for com int nota : notas percorre cada elemento sem expor o índice. soma += nota abrevia a adição com atribuição. Usamos long para dar mais espaço à soma, e convertemos para double antes da divisão.

throw interrompe o caminho normal e sinaliza uma entrada inválida por uma exceção. Vamos estudar tratamento de exceções em detalhe; aqui basta perceber que não produzimos uma média inventada para entrada vazia. O método encerra normalmente com return, devolvendo um número para quem o chamou.

A condição inicial também mostra curto-circuito: se notas é null, a expressão já é verdadeira e Java não tenta acessar notas.length.

O que muda dentro de um método?

Variáveis locais só existem dentro de seu escopo: a região em que foram declaradas. O parâmetro notas de media recebe uma cópia do valor passado pelo chamador. Em um array, esse valor é uma referência ao objeto.

Por isso, alterar notas[0] dentro do método mudaria o mesmo array que main acessa. Já atribuir notas = new int[]{10} apenas mudaria a referência local do parâmetro. Java passa argumentos por valor, inclusive valores que são referências.

Para comparar conteúdo de strings, use equals. == entre referências pergunta se apontam para o mesmo objeto. "aprovado".equals(status) compara texto e também aceita que status seja null, retornando falso. Não use o fato de duas strings literais às vezes compartilharem um objeto como regra para comparar conteúdo.

Sua vez: casos que revelam a regra

Preveja a saída de {7, 8}, {6, 7} e {10}. Depois explique o que deve acontecer com {} e {7, 11}. Só então execute.

As médias válidas são 7,5, 6,5 e 10,0: aprovação, revisão e aprovação. Os dois últimos casos geram exceções; a ausência de notas não significa média zero, e 11 viola o domínio. Se você obteve 7 para o primeiro caso, revise o momento da conversão numérica.

Agora extraia a decisão de aprovação para um método que recebe a média e devolve booleano. A expressão suficiente é return media >= 7;. Não é necessário imprimir dentro desse método: separar decisão de apresentação permite reutilizar e testar a regra.

Na próxima sessão, reescreva a soma com um while e explique sua condição de parada. Você estará recuperando a mesma ideia em outra forma, antes de avançar para objetos que preservam regras ao longo de várias operações.

Referência usada: guia de tipos, condições, laços e métodos.

Material complementar da Fernanda

Pratique com /aprender

Copie o comando e cole no chat para iniciar uma prática guiada:

/aprender Crie um desafio curto em Java 21 sobre condições, laços e métodos para calcular uma média. Primeiro peça que eu preveja o resultado de um trecho; depois adapte a próxima pergunta ao meu raciocínio. Não mostre a solução antes da tentativa.
A SEGUIR · AULA 03

Java para iniciantes: fundamentos e programação orientada a objetos

109 min de vídeo · Revisão curta de tipos, decisões e objetos em Java para acompanhar a aula de fundamentos.

Ir para a aula 03 →