Olá, Otavio. Como vai?
Parabéns pela dedicação e por resolver todos os exercícios propostos no desafio! Seu código demonstra um excelente entendimento sobre como estruturar classes, utilizar o encapsulamento, aplicar a herança (extends) e reescrever comportamentos com o polimorfismo (@Override).
Para agregar ainda mais valor aos seus estudos, separei alguns pontos de destaque e pequenas sugestões de boas práticas que vão deixar seu código ainda mais maduro e profissional.
1. Desafio Carro
Seu código está muito bem estruturado e a lógica para encontrar o maior e o menor preço funcionou perfeitamente.
- Dica de Ouro: Em Java, temos a biblioteca
Math que simplifica bastante buscas por valores máximos e mínimos, deixando o código mais limpo e legível. Veja como os métodos privados poderiam ficar:
private double calcularMenorPreco() {
return Math.min(precoAno1, Math.min(precoAno2, precoAno3));
}
private double calcularMaiorPreco() {
return Math.max(precoAno1, Math.max(precoAno2, precoAno3));
}
2. Desafio Animais
Aqui você aplicou o conceito de polimorfismo de forma impecável ao usar a anotação @Override nas subclasses Cachorro e Gato.
- Dica de Ouro: O verdadeiro poder do polimorfismo acontece quando referenciamos as subclasses pela classe genérica (
Animal). Na sua classe de teste, você poderia criar uma lista ou referenciar os objetos assim:
Animal meuAnimal = new Cachorro();
meuAnimal.emitirSom(); // Imprime: Au Au (Polimorfismo em ação!)
3. Desafio Conta Bancária
Muito bom o uso do modificador de acesso protected para o saldo, permitindo que a subclasse ContaCorrente consiga alterá-lo diretamente.
- Sugestão de Melhoria: Na classe
ContaCorrente, faltou definir ou passar a tarifaMensal. Atualmente ela inicia com o valor padrão 0.0. Você pode resolver isso criando um método setter para ela ou adicionando um construtor:
public class ContaCorrente extends ContaBancaria {
private double tarifaMensal;
public void definirTarifa(double tarifaMensal) {
this.tarifaMensal = tarifaMensal;
}
// ... restante do código
}
4. Desafio Números Primos
Sua lógica matemática para verificar a primalidade usando i * i <= numero ficou excelente e muito eficiente em termos de processamento!
- Observação: Na subclasse
GeradorPrimo, o método gerarProximoPrimo funciona perfeitamente. Lembre-se apenas de que, conceitualmente, a herança deve representar uma relação de "é um". Como GeradorPrimo herda de NumerosPrimos, estamos dizendo que o "Gerador é um Número Primo", o que conceitualmente pode soar estranho no design de software, embora funcione perfeitamente no código. Para fins de exercício de herança, sua solução atendeu muito bem o escopo!
Seus códigos estão excelentes e você avançou muito bem nos conceitos mais complexos de Orientação a Objetos. Continue praticando!
Espero que possa ter lhe ajudado!