I was just wondering why does Java compiler decide whether you can call a method based on the "reference" type and not on actual "object" type? To explain I would like to quote an example: class A { void methA() { System.out.println("Method of Class A."); } } class B extends A { void methB() { System.out.println("Method of Class B."); } public static void main(String arg[]) { A ob =new B(); ob.methB(); // Compile Time Error } } This will produce a Compile Time Error that method methB() not found in class A, although Object Reference "ob" contains an object of class B which consists of method methB(). Reason for this is that Java Compiler checks for the method in Class A (the reference type) not in Class B (the actual object type). So, I want to know whats the reason behind this.