devxlogo

Polymorphism

Polymorphism

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());  }}
See also  How to Avoid Money Transfer Scams  
devxblackblue

About Our Editorial Process

At DevX, we’re dedicated to tech entrepreneurship. Our team closely follows industry shifts, new products, AI breakthroughs, technology trends, and funding announcements. Articles undergo thorough editing to ensure accuracy and clarity, reflecting DevX’s style and supporting entrepreneurs in the tech sphere.

See our full editorial policy.

About Our Journalist