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
Alunodeve ternome,notae um contadorstatic int total. - O construtor deve inicializar os atributos e incrementar
total. media(Aluno[] alunos)deve serstatic, somar as notas e dividir pelo tamanho do array.- O
maindeve criar 4 alunos, imprimir a média comprintf("%.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
nomeenotasão atributos de instância: cada aluno tem os seus valores.private static int total = 0;é o contador compartilhado por toda a classe.- O construtor usa
thispara diferenciar atributos de parâmetros e incrementatotala cadanew Aluno(...). media(Aluno[] alunos)éstaticporque não precisa de um aluno específico — ela recebe o array como parâmetro.- Dentro do
for-each,a.notaacessa o atributo de cada instância; a média ésoma / alunos.length. - No
main, criamos o array de alunos; cadanewjá incrementatotalantes de calcularmos a média. System.out.printf("%.2f%n", ...)imprime com duas casas decimais e quebra de linha portátil (%n).- Chamamos
Aluno.media(turma)eAluno.getTotal()usando o nome da classe, reforçando que são membrosstatic.
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
notadiretamente dentro demedia: gera erro de compilação, poisnotaé de instância. Usealunos[i].notaoua.nota. - Dividir por zero quando o array está vazio: por isso checamos
alunos.length == 0e retornamos0.0. - Usar
printlncom%.2f: a formatação não é aplicada; é precisoprintf. - Declarar
mediasemstatice chamá-lo comoAluno.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