Overriding vs Hiding: Static Methods, Fields and Private Methods
javaJavabeginnerinterview-prepjava
What really takes part in polymorphism: instance methods do, while static methods, fields and private methods are decided by the variable's type.
public class Hiding {
public static void main(String[] args) {
Base ref = new Derived(); // the variable is a Base, the object is a Derived
System.out.println(ref.instanceMethod()); // Derived overridden: the object's real type decides
System.out.println(ref.field); // Base fields are never polymorphic
System.out.println(Base.staticMethod()); // Base static methods are hidden, not overridden
System.out.println(Derived.staticMethod()); // Derived
System.out.println(ref.callPrivate()); // Base private methods are not inherited, so not overridden
}
}
class Base {
String field = "Base";
String instanceMethod() { return "Base"; }
static String staticMethod() { return "Base"; }
private String secret() { return "Base"; }
String callPrivate() { return secret(); }
}
class Derived extends Base {
String field = "Derived"; // hides the field
@Override String instanceMethod() { return "Derived"; }
static String staticMethod() { return "Derived"; } // hides the static method
private String secret() { return "Derived"; } // a brand new method, not an override
}