Java

Alguem poderia me ajudar, aprendi a programar não tem uma semana e não estou conseguindo desenvolver essa atividade.

Em uma universidade tem dois tipos de Funcionários: Diretores ou Professores. Um professor tem nome, matrícula, cpf, salário, ano de admissão. Em professor deve ter um método getImpostoDeRenda, que deverá retornar o imposto de renda do professor (20% do seu salário). Um diretor tem nome, matrícula, cpf, salário e tempo de casa. Em Diretor também tem o método para obter o imposto de renda. (23% do seu salário).

Quando trabalhamos com programação orientada à objetos tentamos representar no nosso código, elementos do mundo real.

Em outras palavras, pegamos elementos de um problema real e traduzimos ele em código.

Quando o enunciado diz que há 2 tipos de funcionários, já imaginamos eles como sendo 2 classes distintas e podemos começar codificando assim:

class Professor {
    String nome;
    String matricula;
    String cpf;
    double salario;
    String anoAdmissao;
    
    double getImpostoDeRenda() {
        return this.salario * 0.2;
    }
}

class Diretor {
    String nome;
    String matricula;
    String cpf;
    double salario;
    String anoAdmissao;
    
    double getImpostoDeRenda() {
        return this.salario * 0.23;
    }
}

Mas veja como essas duas classes são parecidas, repare como o código nas duas é quase identico.

Não é pra menos, afinal Professor e Diretor são meros funcionários. Essa observação nos leva ao próximo passo: Identificar o que esses 2 tipos de funcionários tem em comum e pensar num forma de fazer com eles compartilhem estes pontos em comum de forma que evitemos ao máximo a repetição de código.

Assim, podemos ver que eles são iguais com apenas um detalhe diferente: a implementação do método getImpostoDeRenda() que em um retorna 20% do salário e em outro retorna 23%.

Aplicando as modificações, podemos chegar a isso:

abstract class Funcionario {
    String nome;
    String matricula;
    String cpf;
    double salario;
    String anoAdmissao;
    abstract double getImpostoDeRenda();
}

class Professor extends Funcionario {
    double getImpostoDeRenda() {
        return this.salario * 0.2;
    }
}

class Diretor extends Funcionario {
    double getImpostoDeRenda() {
        return this.salario * 0.23;
    }
}
1 curtida

Bom dia, wldomiciano

Tenho uma dúvida na mesma questão da colega acima, porém a questão tem mais informações que ela não postou. Essa parte de definir a classe de funcionário está tranquilo, mas segue o restante da questão:

Em uma universidade tem dois tipos de Funcionários: Diretores ou Professores. Um professor tem nome, matrícula, cpf, salário, ano de admissão. Em professor deve ter um método getImpostoDeRenda, que deverá retornar o imposto de renda do professor (20% do seu salário). Um diretor tem nome, matrícula, cpf, salário e tempo de casa. Em Diretor também tem o método para obter o imposto de renda. (23% do seu salário).

Pegue tudo que for comum às entidades e coloque em uma classe Funcionário, inclusive o método getImpostoDeRenda, para que ele possa ser sobrescrito pelas entidades filhas.

Não é aceito funcionário repetido nesta universidade. Use sobrescrita do equals para auxiliar nesta empreitada e para apresentação use o toString.

Para criar um funcionário, deve ser passada a matrícula no construtor obrigatoriamente.

Negritei a parte que ela não informou. Enfim, pode dar uma ajuda sobre como prosseguir?

Oi, @Erika1. Tudo bem?

Primeiro, aconselho que você leia o tópico “Como fazer uma boa pergunta?”, para que suas próximas perguntas fiquem mais claras e a gente possa te ajudar melhor, certo?

Em segundo lugar, eu gostaria de apontar sobre isso:

Eu discordo e muito que, em uma semana de aulas (no meio do semestre ainda) o professor te ensinou a programar do nada. Veja, o seu exercício pede noções de orientação a objeto, já inclinando para herança como especificado nesse trecho:

Então, temos um caso aqui onde pode ser que:

  1. O professor é totalmente desqualificado para sair te ensinando OO antes de te ensinar lógica de programação e sintaxe básica do Java (se ele ensinou, deveria passar exercícios nesse contexto. Programação do iniciante é procedural).
  2. Você não andou prestando atenção nas aulas de OO ou começou a faculdade por agora.

De toda forma, eu discordo que pegando o exercício de um fórum você vai aprender. É claro, você consegue enganar o professor assim, mas junto com ele você tá se enganando. Se eu vou te entrevistar e perguntar coisas sobre OO, sem dúvida você não saberá responder. Aproveitando o gancho: O GUJ definitivamente não é o melhor lugar para você buscar apenas resposta de exercício. Aqui, nosso foco é o conhecimento. Não é costume da comunidade resolver exercícios de faculdade.

Por último, eu quero deixar esses links para você poder estudar sobre esse tema. OO não é um conceito fácil, não vale a pena ficar de ctrl+c/ctrl+v.

Maratona de Java
CursoEmVídeo

[]'s

1 curtida

Olá @Coolbrizer. Vamos analisar o pedido do exercício?


No primeiro trecho, ele está pedindo que você crie uma classe Funcionário. Como atributo, deverá ter tudo que tem em comum nas classes Diretores e Professores. O que você está fazendo é passando por um processo de criar uma herança: Você criará a classe pai Funcionário e modificará as classes Diretor e Professor para que sejam filhas de Funcionário.

O que você está dizendo, semanticamente, é:

Diretor e Professor são Funcionários. Se todo Funcionário tiver salário, significa que todo Diretor e todo Professor também terá. Por isso ver tudo que é comum.


No segundo trecho, ele diz que não existem funcionários repetidos nessa universidade. O que você deve fazer é claro: Sobrescrever o método equals. Ainda é solicitado que mude o toString para uma melhor apresentação.


Na última linha, pede para que todo Funcionário, quando criado, receba a matrícula como parâmetro no construtor. Isso se deve porque todo Funcionário (até onde parece) deve ter uma matrícula.

Espero que possa ter esclarecido mais e que você consiga fazer. Qualquer dúvida, erro ou exception, poste o código e o stacktrace que nós te ajudamos, okay?

[]'s

1 curtida

Uma breve explicação

Em Java, toda classe que NÃO extende outra classe, implicitamente, extende a classe Object.

Por exemplo:

abstract class Funcionario {}

class Diretor extends Funcionario {}

A classe diretor explicitamente extende Funcionario, logo, Funcionario é a superclasse direta de Diretor.

Já Funcionario não extende nada, logo, Object é, implicitemente, a superclasse direta de Funcionario.

Obs: Usei a palavra direta, pois indiretamente, todas as classes são subclasses de Object.

O método equals

A classe Object pertence à biblioteca padrão do Java e ela possui muitos métodos que nos auxiliam. Os métodos equals e toString são apenas 2 destes métodos.

O problema é que cada entidade do nosso programa possui um conceito diferente de igualdade e é por isso que precisamos sobreescrever o método equals.

Sobreescrever um método neste caso seria reimplementar na SUBCLASSE (Funcionario) um método existente na SUPERCLASSE (Object).

Agora me diga: O que faz um funcionario ser igual ao outro?

Na minha opinião, se o conjunto de atributos de um funcionario for igual ao de outro funcionario, eles serão iguais.

Assim, poderíamos implementar da seguinte forma:

abstract class Funcionario {
    /* ... */

    @Override
    public boolean equals(Object o) {
        // Retorna true se vc fizer algo como
        // diretorA.equals(diretorA);
        if (o == this) return true;

        // Verifica se o é uma instancia da classe Funcionario, se NÃO, retorna false.
        // Só lembrando que um objeto é uma instancia de uma classe.
        if (!(o instanceof Funcionario)) return false;

        Funcionario other = (Funcionario) o;

        return this.nome.equals(other.nome)
            && this.matricula.equals(other.matricula)
            && this.cpf.equals(other.cpf)
            && this.anoAdmissao.equals(other.anoAdmissao)
            && this.salario == other.salario;
    }
}

Há outras forma de se implementar isso, mas quis fazer da forma mais explicita possível pra vcs pegarem o jeito.

O método toString

O método toString é a representação do objeto em formato de texto. Considere o seguinte exemplo:

public class Main {
    public static void main(String[] args) {
        List<String> array1 = List.of("A", "B", "C");
        List<Integer> array2 = List.of(1, 2, 3);
        System.out.println(array1);
        System.out.println(array2);
    }
}

No console será impresso o seguinte:

[A, B, C]
[1, 2, 3]

Esta parte vcs podem fazer como quiserem. Como acham que um funcionário seria melhor representado? Vcs exibiriam apenas o nome? talvez o nome e a matricula?

Vou dar os exemplos.

abstract class Funcionario {
    /* ... */

    @Override
    public String toString() {
        return this.nome;
    }
}

abstract class Funcionario {
    /* ... */

    @Override
    public String toString() {
        return this.nome + " " + this.matricula;
    }
}

abstract class Funcionario {
    /* ... */

    @Override
    public String toString() {
        return this.nome + " " + this.matricula + " " + this.cpf;
    }
}

Depois vc podem testar com algo assim:

Funcionario a = new Diretor();
a.nome = "João";
a.matricula = "111";
a.cpf = "111.111.111-11";
System.out.println(a);

Considerações finais

Vou deixar a parte dos contrutores pra vcs pesquisarem. Dei atenção à questão da sobreescrita dos métodos acima, pois acredito que são requisitos não tão óbvios pra quem está começando.

Espero que seja o suficiente pra vcs conseguirem progredir.

2 curtidas

Valeu demais @FearX e @wldomiciano. Vocês são feras

2 curtidas