class B { // Base (Parent) class void f() { System.out.println ("f() in B"); g(); } void g() { System.out.println ("g() in B"); } void h() { g(); } } class D extends B { // Derived (Child) class void f() { System.out.println ("f() in D"); g(); } void g() { System.out.println ("g() in D"); } } public class Test { public static void main (String[] arg) { B b = new B(); // Pure Base b.f(); b.g(); D d = new D(); // Pure Derived d.f(); d.g(); B bd = new D(); // ?? bd.f(); bd.g(); bd.h(); // Surprised ?? } }