Estou tentando entender o comportamento de substituição de método, chamadas de construtor e sombreamento de variável na herança Java. Tenho o seguinte código
class Base {
int id = 1000; //Line n1
Base() {
Base(); //Line n2
}
void Base() { //Line n3
System.out.println(++id); //Line n4
}
}
class Derived extends Base {
int id = 2000; //Line n5
Derived() {} //Line n6
void Base() { //Line n7
System.out.println(--id); //Line n8
}
}
public class Test {
public static void main(String[] args) {
Base base = new Derived(); //Line n9
}
}
Quando executo esse código, ele retorna -1 .
Entendo que Derived estende Base , e ambas as classes têm uma variável id e um método Base() . A ordem é a seguinte
- chamar construtor de Derived
- chamar construtor de Base
- chamar o método Base(), devido à substituição do método, o método na classe filha é executado.
Portanto, na minha opinião, o resultado será 1001.
Isso ocorre devido à maneira como os construtores Java funcionam.
A primeira instrução de um construtor será sempre
this.super()
, mesmo que não esteja escrita no seu código.Enquanto
this.super()
é chamado, as variáveis ​​não são afetadas e têm seu valor padrão (que é 0 para ints).Então, você está removendo 1 do id (que é igual a 0).
Você pode testar com este código:
A saÃda será:
Entretanto, se o seu principal era:
então, sua saÃda seria a seguinte:
Isto porque, nesse caso:
this.super()
(o construtor do objeto Object)this.super()
foi chamado)id
+ 1.O comportamento descrito aqui pode mudar em versões futuras do Java, além do Java 23. O trabalho está em andamento para tornar os construtores mais flexÃveis. Veja JEP 482: Flexible Constructor Bodies (Second Preview) .