Médio Java

Sobrescrita com @Override

Enunciado

Crie uma classe Funcionario com atributos nome e salario, e um método calcularBonus() que retorna 10% do salário. Depois, crie a classe Gerente que estende Funcionario e sobrescreve calcularBonus() para retornar 20% do salário. No main, crie um Funcionario e um Gerente, e imprima o bônus de cada um.

Requisitos

  • A classe Funcionario deve ter construtor que recebe nome e salário.
  • O método calcularBonus() em Funcionario retorna salario * 0.1.
  • A classe Gerente sobrescreve calcularBonus() com @Override e retorna salario * 0.2.
  • O programa deve imprimir os bônus corretamente.

Código inicial

class Funcionario {
    // seu código aqui
}

class Gerente extends Funcionario {
    // seu código aqui
}

public class Main {
    public static void main(String[] args) {
        // crie os objetos e imprima os bônus
    }
}

Saída esperada

Bônus do funcionário: 500.0
Bônus do gerente: 2000.0
Ver dica

Use @Override antes do método calcularBonus() em Gerente para garantir que está sobrescrevendo corretamente.

Mostrar solução
class Funcionario {
    protected String nome;
    protected double salario;

    public Funcionario(String nome, double salario) {
        this.nome = nome;
        this.salario = salario;
    }

    public double calcularBonus() {
        return salario * 0.1; // 10% de bônus
    }
}

class Gerente extends Funcionario {
    public Gerente(String nome, double salario) {
        super(nome, salario);
    }

    @Override
    public double calcularBonus() {
        return salario * 0.2; // 20% de bônus
    }
}

public class Main {
    public static void main(String[] args) {
        Funcionario f = new Funcionario("Ana", 5000);
        Gerente g = new Gerente("Carlos", 10000);

        System.out.println("Bônus do funcionário: " + f.calcularBonus());
        System.out.println("Bônus do gerente: " + g.calcularBonus());
    }
}

Passo a passo

  1. A classe Funcionario tem os atributos nome e salario (protected para permitir acesso na subclasse).
  2. O método calcularBonus() retorna 10% do salário.
  3. A classe Gerente estende Funcionario e chama super(nome, salario) no construtor.
  4. O método calcularBonus() é sobrescrito com @Override, retornando 20% do salário.
  5. No main, criamos um Funcionario e um Gerente com salários diferentes.
  6. Imprimimos os bônus; o método chamado é o da classe real do objeto (polimorfismo).

Por que funciona

A sobrescrita permite que uma subclasse forneça uma implementação específica para um método herdado. Com @Override, o compilador verifica se a assinatura corresponde a um método da superclasse, evitando erros de digitação. O polimorfismo garante que a versão correta seja executada em tempo de execução.

Erros comuns

  • Esquecer @Override: se a assinatura estiver errada, o método não sobrescreve e o comportamento antigo é mantido.
  • Alterar a assinatura (ex.: calcularBonus(int x)): isso cria uma sobrecarga, não sobrescrita.
  • Usar private no método da superclasse: não pode ser sobrescrito.

Outra forma de resolver

Poderia-se usar classes abstratas ou interfaces, mas para este exemplo simples, herança com sobrescrita é suficiente.

Saída esperada

Bônus do funcionário: 500.0
Bônus do gerente: 2000.0