Question:
Given a reference to an object B that is a subclass of A and overrides method foo(), is there any way I can invoke the base implementation of foo() directly?
Answer:
This is a rather common question among C++ programmers who are making the change to Java. C++ provides a special syntax for allowing subclasses to invoke overridden methods declared anywhere above them in the class hierarchy. Java does not provide a similar mechanism, with the exception of constructors (which are not regular methods), that can explicitly invoke the constructor of the parent class using the special super()
invocation syntax. However, Java does allow lexically hidden member variables to be accessed through upcasting. The same technique cannot be used as a workaround to invoke overridden methods belonging to a parent class because all Java methods are virtual. If you upcast an object and call an overridden method, the result will be for the method defined as far down as possible in the class tree to be called. The following example program demonstrates how to use upcasting to access a member variable and why the same technique will fail for invoking methods.
class A { public int value; public String foo() { return "A: foo"; }}class B extends A { // This lexically hides the member variable in A public int value; // This overrides the method in class A public String foo() { return "B: foo"; }}public final class Override { public static final void main(String[] args) { B b = new B(); A a = b; a.value = 2; b.value = 3; // Lexically hidden member variables can be accessed through upcasting System.out.println("A value: " + a.value); System.out.println("B value: " + b.value); System.out.println("A value through upcasting: " + ((A)b).value); // All three of these will print "B: foo" because all Java methods // are virtual and once overridden cannot be recovered. System.out.println(" A foo(): " + a.foo()); System.out.println("B foo(): " + b.foo()); System.out.println("A foo through upcasting: " + ((A)b).foo()); }}