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

Herança de atributos e métodos estáticos

Boa noite!

Levando em consideração as classes Gerente e Funcionario expostas no curso, caso a classe Funcionário tivesse atributos e métodos estáticos, a classe Gerente os herdaria também?

Se herdar, a referência ao atributo estático, seria individual para cada classe?

Ex: A classe Funcionario possui o atributo estático 'static int total', onde esta fosse incrementada no construtor da classe. instanciar uma variável do tipo gerente (Gerente g1 = new Gerente();), e outra do tipo Funcionario (Funcionario f1 = new Funcionario;), ao checar o valor da variável 'total', constaria como 2, ou se eu verificasse g1.total e f1.total constaria o valor 1 em cada uma delas?

Grato desde já!

4 respostas

Oie Artur, tudo bem contigo?

Os métodos e atributos estatísticos não são orientados a objeto, por isso eles não podem ser herdados ou sobrescritos.

Qualquer outra dúvida fico a disposição :)

Bons estudos!

Olá Igor! tudo bem e com você?

Obrigado pelo esclarecimento. Fiz o teste só para confirmar, e identifiquei que ao instanciar os 2 objetos, a variável estática pertencente à classe Funcionario ficou com o valor 2, segue código fonte. Qual seria a explicação?

public class Funcionario {

    private String nome;
    private String cpf;
    private double salario;
    static int total;

    public Funcionario() {
        total++;
    }
    //Getters & Setters
}

public class Gerente extends Funcionario{

}

public class Teste {

    public static void main(String[] args) {
        Funcionario f1 = new Funcionario();
        System.out.println(f1.total);
        Gerente g1 = new Gerente();
        System.out.println(g1.total);
        System.out.println(f1.total);
    }
}

resultado no console: 1 2 2

solução!

Conceitualmente tudo que for "static" pertence a "classe" e não ao "objeto", por isso, o que acontece no seu exemplo a cima é que a classe filha ao ser instanciada sempre chama o construtor da classe pai, fazendo o "total++" e guardando o resultado dessa operação na variável "total" da classe "Funcionario" e não da classe "Gerente", pois "Gerente" não herda o atributo estático "total", pois métodos e atributos estáticos não são orientados a objeto e assim não podem ser herdados.

Outro ponto a se ressaltar, é que na classe "Teste" quando você printa o "g1.total" o que acontece não tem nada haver com orientação a objeto, mas sim que a JVM visualiza toda a hierarquia da classe "Gerente" e identifica o atributo estático "total" na classe "Funcionario", esse processo faz parecer que usa herança de OO, mas na verdade é a JVM dando uma ajudada. O próprio eclipse reclama e deixa sublinhado de amarelo quando usamos atributos estáticos como se fossem heranças. Segues imagem abaixo:

Esse código abaixo compila, mas como podemos ver o eclipse avisa que tem algo estranho.

Eclipse reclamando do código

Quando corrigimos da maneira como o eclipse recomenda, fica da seguinte forma:

Chamando atributo estático da maneira correta

Como podemos observar na imagem a cima, o eclipse ao chamar o atributo estático "total" faz chamando o "Funcionario.total", mostrando que não existe atributo "total" na classe "Gerente", pois tudo o que for "static" pertence a classe, não sendo possível usar os conceitos de orientação a objeto como herança e sobrescrita.

Espero que agora tenha ficado mais claro!

Qualquer outra dúvida fico a disposição :)

Bons estudos!

Ba noite Igor!

Entendi perfeitamente, muito obrigado pela explicação!!