1. pitfall: fields example
// polymorphism/FieldAccess.java
// (c)2017 MindView LLC: see Copyright.txt
// We make no guarantees that this code is fit for any purpose.
// Visit http://OnJava8.com for more book information.
// Direct field access is determined at compile time
class Super {
public int field = 0; // [1]
public int getField() {
return field;
}
}
class Sub extends Super {
public int field = 1;
@Override
public int getField() {
return field;
}
public int getSuperField() {
return super.field;
}
}
public class FieldAccess {
public static void main(String[] args) {
Super sup = new Sub(); // Upcast
System.out.println("sup.field = " + sup.field + ", sup.getField() = " + sup.getField());
Sub sub = new Sub();
System.out.println(
"sub.field = "
+ sub.field
+ ", sub.getField() = "
+ sub.getField()
+ ", sub.getSuperField() = "
+ sub.getSuperField());
}
}
/* Output:
sup.field = 0, sup.getField() = 1
sub.field = 1, sub.getField() = 1, sub.getSuperField()
= 0
*/
In this example, different storage is allocated for Super.field and Sub.field . Thus, Sub actually contains two fields called field : its own and the one it gets from Super . However, the Super version is not the default that is produced when you refer to field in Sub. To get the Super field you must explicitly say super.field.
Although this seems like it could be a confusing issue, in practice it virtually never comes up.
when replace [1] to private int field = 0; the compiler message is:
OnJava8-Examples/polymorphism/FieldAccess.java:24: error: field has private access in Super
return super.field;
^
OnJava8-Examples/polymorphism/FieldAccess.java:31: error: field has private access in Super
System.out.println("sup.field = " + sup.field + ", sup.getField() = " + sup.getField());
^
2 errors
2. pitfall: static methods example
// polymorphism/StaticPolymorphism.java
// (c)2017 MindView LLC: see Copyright.txt
// We make no guarantees that this code is fit for any purpose.
// Visit http://OnJava8.com for more book information.
// Static methods are not polymorphic
class StaticSuper {
public static String staticGet() {
return "Base staticGet()";
}
public String dynamicGet() {
return "Base dynamicGet()";
}
}
class StaticSub extends StaticSuper {
public static String staticGet() {
return "Derived staticGet()";
}
@Override
public String dynamicGet() {
return "Derived dynamicGet()";
}
}
public class StaticPolymorphism {
public static void main(String[] args) {
StaticSuper sup = new StaticSub(); // Upcast
System.out.println(StaticSuper.staticGet());
System.out.println(sup.dynamicGet());// Derived dynamicGet()
}
}
/* Output:
Base staticGet()
Derived dynamicGet()
*/
static methods are associated with the class, and not the individual objects.
references:
1. On Java 8 - Bruce Eckel
2. https://github.com/wangbingfeng/OnJava8-Examples/blob/master/polymorphism/FieldAccess.java
3. https://github.com/wangbingfeng/OnJava8-Examples/blob/master/polymorphism/StaticPolymorphism.java