Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Bug] [Relato] Erro ao criar uma classe herdada "Gerente"

Antes de tudo, eu já resolvi essa questão. Eu queria mais contar um relato de alguém que passou por um problema específico e fiquei mais de 1 hora para resolvê-lo.

E um detalhe importante, estava usando o VS Code ao invés do Eclipse (porque achei muito melhor o VS Code, ele faz tudo que o Eclipse faz, só que melhor).

Primeiramente, quando chegou na parte de fazer uma classe herdada, do Funcionário para gerente, eu segui o código que o professor passou:

public class Gerente extends Funcionario

Mas ao fazer isso, aparecia para mim o erro:

Implicit super constructor Funcionario() is undefined for default constructor. Must define an explicit constructor

Fui pesquisar a fonte do erro, e todos apontavam um problema no acesso da bibilioteca do Java no Eclipse, mas como tava no VS Code, não sabia como adaptar isso. Tem até um caso disso em um fórum da Alura.

Depois de um tempo, descobri como colocar a biblioteca do Java no VS Code, mas mesmo assim não deu certo. Tava sem esperanças do que fazer, até que eu vejo que o VS Code me dá uma sugestão de correção (por isso eu amo esse programa) e eu descobri o do porquê do erro.

Eu tinha ALTERADO O CONSTRUTOR da classe Funcionário:

public class Funcionario {
    private String Nome;
    private String CPF;
    private double Salario;

    public Funcionario (String nome,String cpf){
        this.Nome = nome;
        this.CPF = cpf;
    }

E a solução era mais simples do que eu imaginava (que era a solução que o VS Code me deu):

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

Era só fazer o mesmo construtor!!!!!!

Quis deixar esse relato porque as vezes pequenas mudanças que fazemos no projeto pode alterar tudo e pode deixar a gente perdido. E também o quanto eu to bravo por ter perdido tanto tempo em um erro tão simples, que eu não consegui reparar antes.

Código completo do Funcionario.java

public class Funcionario {
    private String Nome;
    private String CPF;
    private double Salario;

    public Funcionario (String nome,String cpf){
        this.Nome = nome;
        this.CPF = cpf;
    }

    public double getBonificacao(){
        return this.Salario *0.1;
    }
    public String getNome() {
        return Nome;
    }
    public String getCPF() {
        return CPF;
    }
    public double getSalario() {
        return Salario;
    }
    public void setSalario(double salario) {
        Salario = salario;
    }
}

Código do Gerente.java (ainda não terminei essa aula, por isso está incompleto e com comentário para ocultar o código):

public class Gerente extends Funcionario{
    public Gerente(String nome, String cpf) {
        super(nome, cpf);
    }
    private int Senha;
    public boolean autentica(int senha){
        if (this.Senha == senha) {
            return true;
        } else {
            return false;
        }
    }

/*    public double getBonificacao(){
        return this.Salario;

    }*/ 
}
2 respostas

E como curiosidade, para adicionar a blibioteca no Java, eu fui no setting.json e adicionei a biblioteca do Java 8:

{
    "java.project.sourcePaths": ["src"],
    "java.project.outputPath": "bin",
    "java.project.referencedLibraries": [
        "lib/**/*.jar",
        "c:\\Program Files\\Java\\jdk1.8.0_351\\jre\\lib\\ext\\access-bridge-64.jar",
        "c:\\Program Files\\Java\\jdk1.8.0_351\\jre\\lib\\ext\\cldrdata.jar",
        "c:\\Program Files\\Java\\jdk1.8.0_351\\jre\\lib\\ext\\dnsns.jar",
        "c:\\Program Files\\Java\\jdk1.8.0_351\\jre\\lib\\ext\\jaccess.jar",
        "c:\\Program Files\\Java\\jdk1.8.0_351\\jre\\lib\\ext\\jfxrt.jar",
        "c:\\Program Files\\Java\\jdk1.8.0_351\\jre\\lib\\ext\\localedata.jar",
        "c:\\Program Files\\Java\\jdk1.8.0_351\\jre\\lib\\ext\\nashorn.jar",
        "c:\\Program Files\\Java\\jdk1.8.0_351\\jre\\lib\\ext\\sunec.jar",
        "c:\\Program Files\\Java\\jdk1.8.0_351\\jre\\lib\\ext\\sunjce_provider.jar",
        "c:\\Program Files\\Java\\jdk1.8.0_351\\jre\\lib\\ext\\sunmscapi.jar",
        "c:\\Program Files\\Java\\jdk1.8.0_351\\jre\\lib\\ext\\sunpkcs11.jar",
        "c:\\Program Files\\Java\\jdk1.8.0_351\\jre\\lib\\ext\\zipfs.jar",
        "c:\\Program Files\\Java\\jdk1.8.0_351\\jre\\lib\\deploy.jar",
        "c:\\Program Files\\Java\\jdk1.8.0_351\\jre\\lib\\javaws.jar",
        "c:\\Program Files\\Java\\jdk1.8.0_351\\jre\\lib\\jce.jar",
        "c:\\Program Files\\Java\\jdk1.8.0_351\\jre\\lib\\jfr.jar",
        "c:\\Program Files\\Java\\jdk1.8.0_351\\jre\\lib\\jfxswt.jar",
        "c:\\Program Files\\Java\\jdk1.8.0_351\\jre\\lib\\jsse.jar",
        "c:\\Program Files\\Java\\jdk1.8.0_351\\jre\\lib\\management-agent.jar",
        "c:\\Program Files\\Java\\jdk1.8.0_351\\jre\\lib\\plugin.jar",
        "c:\\Program Files\\Java\\jdk1.8.0_351\\jre\\lib\\resources.jar",
        "c:\\Program Files\\Java\\jdk1.8.0_351\\jre\\lib\\rt.jar"
    ]
}
solução!

Olá Murilo, tudo bem com você?

Obrigado por compartilhar esse ocorrido conosco aqui no fórum, vai ser de grande valia para todas pessoas que se depararem com esse problema!

Quando estabelecemos uma relação de herança entre duas classes (Gerente herda de Funcionário), se torna obrigatório que a classe filha implemente os construtores existentes na classe mãe, pois por padrão o Java não passa construtores com herança.

Em Java, a herança passa comportamentos (métodos) e características (atributos), mas não os construtores.

Sendo assim, toda vez que estabelecemos relação de herança, é obrigatória a implementação dos construtores conforme eles são definidos na classe mãe, e nós fazemos isso com o auxilio da palavra chave super(), que é justamente uma referência para a classe mãe, e por se tratar de um método o Java já entende ser o construtor da classe mãe.

É importante lembrar, também, que essa necessidade só existe quando nós sobrescrevemos o construtor padrão, ou seja, criamos o nosso próprio construtor na classe mãe. Caso o construtor padrão seja o único existente, o construtor padrão da classe filha já será idêntico.

Em caso de dúvidas, fico à disposição!

Um grande abraço e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!