Login | Register   
LinkedIn
Google+
Twitter
RSS Feed
Download our iPhone app
TODAY'S HEADLINES  |   ARTICLE ARCHIVE  |   FORUMS  |   TIP BANK
Browse DevX
Sign up for e-mail newsletters from DevX


Tip of the Day
Language: Java Language
Expertise: Beginner
Nov 20, 1998

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("\nA foo(): " + a.foo());
    System.out.println("B foo(): " + b.foo());
    System.out.println("A foo through upcasting: " + ((A)b).foo());

  }
}
DevX Pro
 
Comment and Contribute

 

 

 

 

 


(Maximum characters: 1200). You have 1200 characters left.

 

 

Sitemap
Thanks for your registration, follow us on our social networks to keep up-to-date