Olá, Pedro! Como vai?
Sua solução para o exercício de números primos em Java está muito bem estruturada e merece atenção especial por alguns pontos que se destacam logo de início.
A forma como você organizou as classes com herança é um dos pontos mais positivos do seu código. Ao definir a class GerarPrimo estendendo NumerosPrimos, você reaproveitou o método verificarPrimalidade sem precisar reescrever nenhuma lógica. O mesmo vale para a class VerificarPrimo, que herda o comportamento base e adiciona apenas a responsabilidade de exibir a mensagem com System.out.println. Esse reaproveitamento é exatamente o espírito da Orientação a Objetos em Java.
O método void listarPrimos com o parâmetro limiteSuperior também está correto e bem nomeado, o que facilita bastante a leitura do código por qualquer pessoa que o encontre depois.
Outro ponto positivo está dentro do laço for no método verificarPrimalidade, em que você usou a condição i multiplicado por i sendo menor ou igual a numero. Essa abordagem reduz o número de iterações necessárias e torna a verificação de primalidade mais eficiente do que percorrer todos os valores até numero.
Uma dica interessante para tornar a intenção do código ainda mais clara é utilizar o método Math.sqrt() no lugar da multiplicação. Veja este exemplo:
int limite = (int) Math.sqrt(numero);
for (int i = 2; i <= limite; i++) {
if (numero % i == 0) {
return false;
}
}
Neste trecho, Math.sqrt(numero) calcula a raiz quadrada do valor recebido e armazena o resultado na variável limite, deixando explícito para qualquer leitor do código por que o laço encerra naquele ponto. O comportamento é o mesmo, mas a legibilidade melhora bastante.
No método main da class TestePrimos, você instanciou corretamente os objetos com new, chamou verificarPrimo para o objeto numero1, usou gerarProximoPrimo para encontrar o proximoNumero após 17 e ainda listou todos os primos até o limiteSuperior de 30 com listarPrimos. O uso de System.out.println está bem aplicado em todos os pontos do fluxo, deixando a saída clara e organizada.
No geral, sua solução demonstra uma compreensão sólida dos conceitos de herança, reaproveitamento de métodos e verificação de primalidade em Java. Você está no caminho certo e com uma base muito boa para evoluir ainda mais.
Você chegou a testar o código com outros valores além de 17 e 30 para validar o comportamento em casos diferentes, como números negativos ou o valor zero?
Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!