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);