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
mC
declared in or inherited by class C, overrides from C another methodmA
declared in class A, iff all of the following are true:
A is a superclass of C.
C does not inherit
mA
.The signature of
mC
is 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
m1
is a subsignature of the signature of a methodm2
if either:
m2
has the same signature asm1
, orthe signature of
m1
is 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