2
respostas

Desafio: polimorfismo e herança

// Classe Carro
public class Carro {
    private String modelo;
    private double precoAno1;
    private double precoAno2;
    private double precoAno3;

    public void definirModelo(String modelo) {
        this.modelo = modelo;
    }

    public void definirPrecos(double precoAno1, double precoAno2, double precoAno3) {
        this.precoAno1 = precoAno1;
        this.precoAno2 = precoAno2;
        this.precoAno3 = precoAno3;
    }

    public void exibirInfo() {
        System.out.println("Modelo: " + modelo);
        System.out.println("Preço Ano 1: " + precoAno1);
        System.out.println("Preço Ano 2: " + precoAno2);
        System.out.println("Preço Ano 3: " + precoAno3);
        System.out.println("Menor Preço: " + calcularMenorPreco());
        System.out.println("Maior Preço: " + calcularMaiorPreco());
    }

    private double calcularMenorPreco() {
        double menorPreco = precoAno1;

        if (precoAno2 < menorPreco) {
            menorPreco = precoAno2;
        }

        if (precoAno3 < menorPreco) {
            menorPreco = precoAno3;
        }

        return menorPreco;
    }

    private double calcularMaiorPreco() {
        double maiorPreco = precoAno1;

        if (precoAno2 > maiorPreco) {
            maiorPreco = precoAno2;
        }

        if (precoAno3 > maiorPreco) {
            maiorPreco = precoAno3;
        }

        return maiorPreco;
    }
}

// Subclasse ModeloCarro
public class ModeloCarro extends Carro {
    // Pode adicionar propriedades específicas do modelo se necessário
}

// Classe de Teste
public class TesteCarro {
    public static void main(String[] args) {
        ModeloCarro meuCarro = new ModeloCarro();
        meuCarro.definirModelo("Sedan");
        meuCarro.definirPrecos(30000, 32000, 35000);
        meuCarro.exibirInfo();
    }
}
  1. animal
// Classe Animal
public class Animal {
    public void emitirSom() {
        System.out.println("Som do animal");
    }
}

// Subclasse Cachorro
public class Cachorro extends Animal {
    @Override
    public void emitirSom() {
        System.out.println("Au Au");
    }

    public void abanarRabo() {
        System.out.println("Cachorro abanando o rabo");
    }
}

// Subclasse Gato
public class Gato extends Animal {
    @Override
    public void emitirSom() {
        System.out.println("Miau");
    }

    public void arranharMoveis() {
        System.out.println("Gato arranhando móveis");
    }
}

// Classe de Teste
public class TesteAnimais {
    public static void main(String[] args) {
        Cachorro cachorro = new Cachorro();
        cachorro.emitirSom();
        cachorro.abanarRabo();

        Gato gato = new Gato();
        gato.emitirSom();
        gato.arranharMoveis();
    }
}
  1. Conta
//Classe ContaBancaria
public class ContaBancaria {
    protected double saldo;

    public void depositar(double valor) {
        saldo += valor;
        System.out.println("Depósito de " + valor + " realizado. Saldo atual: " + saldo);
    }

    public void sacar(double valor) {
        if (valor <= saldo) {
            saldo -= valor;
            System.out.println("Saque de " + valor + " realizado. Saldo atual: " + saldo);
        } else {
            System.out.println("Saldo insuficiente para saque.");
        }
    }

    public void consultarSaldo() {
        System.out.println("Saldo atual: " + saldo);
    }
}

//Subclasse ContaCorrente
public class ContaCorrente extends ContaBancaria {
    private double tarifaMensal;

    public void cobrarTarifaMensal() {
        saldo -= tarifaMensal;
        System.out.println("Tarifa mensal de " + tarifaMensal + " cobrada. Saldo atual: " + saldo);
    }
}

//Classe Teste
public class TesteContaBancaria {
    public static void main(String[] args) {
        // Criando uma conta bancária com saldo inicial de 1000
        ContaBancaria conta = new ContaBancaria();
        conta.depositar(1000);
        conta.consultarSaldo();

        // Realizando operações na conta corrente
        ContaCorrente contaCorrente = new ContaCorrente();
        contaCorrente.depositar(200);
        contaCorrente.cobrarTarifaMensal();
        contaCorrente.consultarSaldo();
        contaCorrente.sacar(150);
        contaCorrente.consultarSaldo();
    }
}
2 respostas

4)Numeros primos
tive que por aqui porque deu o limite de palavras

public class NumerosPrimos {
    public boolean verificarPrimalidade(int numero) {
        if (numero <= 1) {
            return false;
        }
        for (int i = 2; i * i <= numero; i++) {
            if (numero % i == 0) {
                return false;
            }
        }
        return true;
    }

    public void listarPrimos(int limiteSuperior) {
        System.out.println("Números primos até " + limiteSuperior + ": ");
        for (int i = 2; i <= limiteSuperior; i++) {
            if (verificarPrimalidade(i)) {
                System.out.print(i + " ");
            }
        }
        System.out.println();
    }
}

// Subclasse VerificadorPrimo
public class VerificadorPrimo extends NumerosPrimos {
    public void verificarSeEhPrimo(int numero) {
        if (verificarPrimalidade(numero)) {
            System.out.println(numero + " é primo.");
        } else {
            System.out.println(numero + " não é primo.");
        }
    }
}

// Subclasse GeradorPrimo
public class GeradorPrimo extends NumerosPrimos {
    public int gerarProximoPrimo(int ultimoPrimoConhecido) {
        int proximoNumero = ultimoPrimoConhecido + 1;
        while (!verificarPrimalidade(proximoNumero)) {
            proximoNumero++;
        }
        return proximoNumero;
    }
}

// Classe de Teste
public class TesteNumerosPrimos {
    public static void main(String[] args) {
        VerificadorPrimo verificador = new VerificadorPrimo();
        verificador.verificarSeEhPrimo(17);

        GeradorPrimo gerador = new GeradorPrimo();
        int proximoPrimo = gerador.gerarProximoPrimo(17);
        System.out.println("O próximo primo após 17 é: " + proximoPrimo);

        NumerosPrimos numerosPrimos = new NumerosPrimos();
        numerosPrimos.listarPrimos(30);
    }
}

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!