class A { public void test(){ System.out.println("hello"); } public void foo(){ System.out.println("fooo"); } } class B extends A { @Override public void test(){ System.out.println("world"); } public void bar(){ System.out.println("baar"); } } public class PolymorphismDemo { public static void main(String[] args) { A a = new A(); a.test(); // allowed: will print hello a.foo(); // allowed: will print fooo //a.bar(); // not allowed: compile time error B b = new B(); b.test(); // allowed: will print world b.foo(); // allowed: will print fooo b.bar(); // allowed: will print baar A c = new B(); c.test(); // allowed: will print world c.foo(); // allowed: will print fooo //c.bar(); // not allowed: compile time error //B d = new A(); // not allowed: compile time error A e = new B(); A f = (A)e; f.test(); // allowed: will print world f.foo(); // allowed: will print fooo //f.bar(); // not allowed: compile time error B g = new B(); A h = (A)g; h.test(); // allowed: will print world h.foo(); // allowed: will print fooo //h.bar(); // not allowed: compile time error } }