Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

O que acontece com os atributos de uma classe ao utilizar outra referência

Olá,

Na aula anterior, o instrutor utilizou a seguinte linha de código:

Funcionario g1 = new Gerente();

E notei que os métodos da classe gerente não podem ser utilizados.

Como as classes filhas herdam tudo de suas classes mães, e podem possuir mais atributos e métodos do que suas super class, estaria correto em dizer que ao fazer o código acima, o Java irá ignorar os atributos e métodos que não existem na super class?

Este tipo de inicialização costuma ser utilizada no mundo Java?

1 resposta
solução!

Em seu exemplo, g1 é uma instância de Gerente, o Java em si não irá ignorar qualquer método ou atributo. Funcionario é uma abstração de Gerente (que no caso tem atributos e comportamentos específicos).

Como Gerente É um Funcionario, a linguagem irá nos permitir fazer Funcionario g1 = new Gerente();, quando fazemos isso, falamos para o compilador que g1 pode ser uma instância de Gerente já que Gerente é um funcionário. Porém, a informação que o compilador tem com relação à g1 são todos os atributos e comportamentos da classe Funcionario. Não é que o java esteja ignorando as especificidades de Gerente, apenas não tem as informações referentes à essa classe em tempo de compilação, pois g1 é do tipo Funcionario.

Um caso de uso simples, é quando temos uma série de instancias de classes específicas, que compartilham um atributo ou método de uma classe base. Nesse exemplo, vamos assumir 4 classes: Funcionario, Operador, Supervisor, Gerente, onde:

Operador extends Funcionario
Supervisor extends Funcionario
Gerente extends Funcionario

A classe Funcionario tem uma função chamada getSalario.

Assumindo que todo Funcionario tem um salário, podemos ter uma função que soma os salarios de uma lista de funcionários:

  public double soma(List<Funcionario> funcionarios) {
    double totalSalarios = 0;
    for(Funcionario funcionario : funcionarios) {
      totalSalarios += funcionario.getSalario();
    }
    return totalSalarios;
  }

Abaixo um exemplo de função para saber qual é o somatório do salário de todos os funcionários.

List<Funcionario> funcionarios = new ArrayList<>();
funcionarios.add(new Operador());
funcionarios.add(new Supervisor());
funcionarios.add(new Gerente());

double salarioTodosFuncionarios = soma(funcionarios);
System.out.println(salarioTodosFuncionarios);