Saída desconcertante em Java com métodos de herança e substituição
Eu me deparei com esse pedaço de código.
Tentei adivinhar qual será o resultado de executá-lo antes de realmente fazê-lo. Fiquei realmente confuso quando os vi e precisava de algumas explicações.
Este é o código:
public class A {
String bar = "A.bar";
A() { foo(); }
public void foo() {
System.out.println("A.foo(): bar = " + bar);
}
}
public class B extends A {
String bar = "B.bar";
B() { foo(); }
public void foo() {
System.out.println("B.foo(): bar = " + bar);
}
}
public class C {
public static void main(String[] args) {
A a = new B();
System.out.println("a.bar = " + a.bar);
a.foo();
}
}
A saída é:
B.foo(): bar = null
B.foo(): bar = B.bar
a.bar = A.bar
B.foo(): bar = B.bar
Por que é que?
Como ébar = null
?Porque éa.bar = A.bar
até aparecer? Eu não instancieiA
em absoluto.E seA
aparece, por quedepois de B
?