Um detalhe de herança em Java que pode te pegar desprevenido
- #Java
- #Orientação a objetos, classes e métodos
Sabe dizer qual será o output desse código:
class Pai {
String pai = "Pai";
public Pai(){
System.out.println("Construtor " + pai);
metodo();
}
void metodo(){
System.out.println("Método " + pai);
}
}
class Filho extends Pai {
String filho = "Filho";
void metodo(){
System.out.println("Método " + filho);
}
}
public class Teste {
public static void main(String[] args) {
new Filho();
}
}
Se você disse:
> "Construtor Pai"
> "Método null"
Parabéns! 🎖️
Esse código parece inofensivo a primeira vista (criação de um Filho que estende Pai)
Mas ao executar -> new Filho();
O que acontece?
1- O construtor da classe Pai é executado primeiro
2- Dentro dele um método sobrescrito é chamado
3- Esse método no construtor Pai, já é do Filho (polimorfismo)
Porém... o estado do Filho ainda não foi inicializado
Seu atributo -> String filho ainda não foi inicializado
Resultado:
-> Campo ainda null
->Estado inconsistente
-> Bug difícil de rastrear
✅ Moral - Evite chamar métodos sobrescritos (override) dentro de construtores
Esse é o tipo de detalhe que diferencia código que funciona de código realmente seguro e previsível.
Você já conhecia esse comportamento?
Já viu algo parecido dar bug em projeto real?



