有两个类,一个Animal类,一个Cat类,其中Cat是Animal的子类,此时我在主函数中这样声明一个对象"Animal animal=new Cat();",此时animal实际上是Cat类
此时,Animal类中没有catMouse()这个方法,Cat类中有这个方法,我在主函数声明了"Animal animal=new Cat();"后,无法调用animal.catchMouse(); 是因为在编译的时候,编译器看的是前面,即animal的编译类型是Animal,而Animal中没有catchMouse();方法,所以编译不通过,显示不存在该方法,
两个类都有eat方法,即Cat对eat方法进行了重写,此时调用animal.eat();,编译能够通过,并且运行的时候,是按照子类父类找方法中的顺序来进行查找,即优先查找的的Cat类,Cat是animal的运行类型
如果要用catchMouse可以用这两种方法
1、Cat cat=(Cat) animal强转,但是强转之后,cat的编译类型才是Cat,animal的编译类型还是Animal,这样的含义是声明一个对象,指向的原本animal指向的对象,所以在使用catch.Mouse时,得要cat.catchMouse这样用。
2、如果不想再声明新对象,也可以((Cat) animal).catMouse();这样子使用,直接在编译前强转编译类型,但实际上animal的编译类型还是没有改变,这样做是允许你通过 animal 引用调用 Cat 类型中的方法。