Desafio Java

Turma com média e contador estático

Enunciado

Crie uma classe Aluno com atributos nome e nota, um construtor e um método static double media(Aluno[] alunos) que retorne a média das notas do array. Adicione também um contador static de alunos criados. No main, crie um array com 4 alunos, imprima a média formatada com duas casas decimais e o total de alunos criados.

Requisitos

  • A classe Aluno deve ter nome, nota e um contador static int total.
  • O construtor deve inicializar os atributos e incrementar total.
  • media(Aluno[] alunos) deve ser static, somar as notas e dividir pelo tamanho do array.
  • O main deve criar 4 alunos, imprimir a média com printf("%.2f") e o total de alunos.

Código inicial

public class Aluno {
    // atributos de instancia

    // contador static

    // construtor

    // metodo static media(Aluno[] alunos)

    public static void main(String[] args) {
        // crie 4 alunos, calcule a media e imprima
    }
}

Saída esperada

Media da turma: 7,75
Total de alunos: 4
Ver dica

Dentro de um método static, você só pode acessar atributos static diretamente; para ler nota de cada aluno, percorra o array e use alunos[i].nota.

Mostrar solução
public class Aluno {
    private String nome; // atributo de instancia
    private double nota; // atributo de instancia

    // Contador compartilhado por todas as instancias.
    private static int total = 0;

    public Aluno(String nome, double nota) {
        this.nome = nome;
        this.nota = nota;
        total++; // registra a criacao de mais um aluno
    }

    // Metodo static: recebe o array e calcula a media sem depender de um objeto.
    public static double media(Aluno[] alunos) {
        if (alunos.length == 0) {
            return 0.0;
        }
        double soma = 0.0;
        for (Aluno a : alunos) {
            soma += a.nota; // acessa o atributo de cada instancia
        }
        return soma / alunos.length;
    }

    public static int getTotal() {
        return total;
    }

    public static void main(String[] args) {
        Aluno[] turma = {
            new Aluno("Ana", 8.5),
            new Aluno("Bruno", 6.0),
            new Aluno("Carla", 9.0),
            new Aluno("Diego", 7.5)
        };

        // %.2f formata com duas casas decimais.
        System.out.printf("Media da turma: %.2f%n", Aluno.media(turma));
        System.out.println("Total de alunos: " + Aluno.getTotal());
    }
}

Passo a passo

  1. nome e nota são atributos de instância: cada aluno tem os seus valores.
  2. private static int total = 0; é o contador compartilhado por toda a classe.
  3. O construtor usa this para diferenciar atributos de parâmetros e incrementa total a cada new Aluno(...).
  4. media(Aluno[] alunos) é static porque não precisa de um aluno específico — ela recebe o array como parâmetro.
  5. Dentro do for-each, a.nota acessa o atributo de cada instância; a média é soma / alunos.length.
  6. No main, criamos o array de alunos; cada new já incrementa total antes de calcularmos a média.
  7. System.out.printf("%.2f%n", ...) imprime com duas casas decimais e quebra de linha portátil (%n).
  8. Chamamos Aluno.media(turma) e Aluno.getTotal() usando o nome da classe, reforçando que são membros static.

Por que funciona

O método static media não acessa atributos de instância diretamente; ele recebe um array e lê nota de cada objeto, o que é permitido. O contador static é atualizado no construtor, então o total reflete exatamente quantos objetos foram criados. Separar o que é da classe (contador, cálculo da média) do que é do objeto (nome, nota) mantém o modelo claro.

Erros comuns

  • Tentar usar nota diretamente dentro de media: gera erro de compilação, pois nota é de instância. Use alunos[i].nota ou a.nota.
  • Dividir por zero quando o array está vazio: por isso checamos alunos.length == 0 e retornamos 0.0.
  • Usar println com %.2f: a formatação não é aplicada; é preciso printf.
  • Declarar media sem static e chamá-lo como Aluno.media(...): erro de compilação; métodos de instância exigem um objeto.

Outra forma de resolver

Percorrer com índice em vez de for-each:

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

É útil quando você precisa do índice para outras operações, como encontrar o aluno de maior nota.

Saída esperada

Media da turma: 7,75
Total de alunos: 4