Let's take a look at this code:
public class ParentClass {
public void foo(Object o) {
System.out.println("Parent");
}
}
public class SubClass extends ParentClass {
public void foo(String s) {
System.out.println("Child");
}
public static void main(String args[]) {
ParentClass p = new SubClass();
p.foo("hello");
}
}
I expected this to print out "Child", but the result is "Parent". Why does java call the super class instead, and what do I do to make it call the method in the subclass?
SubClass#foo() does not override ParentClass#foo() because it doesn't have the same formal parameters. One takes Object and the other takes a String. Therefore polymorphism at runtime is not applied and does not cause the subclass method to execute. From the Java Language Specification:
An instance method
mCdeclared in or inherited by class C, overrides from C another methodmAdeclared in class A, iff all of the following are true:
A is a superclass of C.
C does not inherit
mA.The signature of
mCis a subsignature (§8.4.2) of the signature ofmA....
And this section defines method signatures:
Two methods or constructors, M and N, have the same signature if they have the same name, the same type parameters (if any) (§8.4.4), and, after adapting the formal parameter types of N to the the type parameters of M, the same formal parameter types.
The signature of a method
m1is a subsignature of the signature of a methodm2if either:
m2has the same signature asm1, orthe signature of
m1is the same as the erasure (§4.6) of the signature ofm2.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With