c.catchmouse() 在编译时就是不通过的。因为编译时只是检查一些语法错误。在Animal中没有这个方法,所以就报错了。
Animal c = new Cat();这句话其实就是将引用c指向 创建的一个Cat对象的内存地址。所以当c在调用Cat里面的方法时,在Cat中有这个方法就直接调用了。如果没有,就去找父类中的方法(这个就是继承了)。
如果你看到了反射,那么可以看下下面这个代码:- public static void main(String[] args) throws Exception{
- Animal c = new Cat();
- // c.catchmouse();//错误
- Class clazz = Cat.class;//得到Cat字节码对象
- Method m = clazz.getDeclaredMethod("catchmouse", null);//得到catchmouse方法、
- m.invoke(c, null);//调用c的catchmouse()
- }
复制代码 上面代码,其实就是通过反射调用了c中的catchmouse(),就是你想用 c.catchmouse() 去实现的效果。 |