有两个类,一个Animal类,一个Cat类,其中Cat是Animal的子类,此时我在主函数中这样声明一个对象"Animal animal=new Cat();",此时animal实际上是Cat类,其中子类必须放到父类的后面,即不可以“Cat cat =new Animal();”后续还可以animal=new Dog();来改变animal的对象;

在方法的参数写父类进去,在调用的的时候可以使用子类,如feed(Animal animal,Food food),此时Animal和Food的子类都可以对应的填入

此时,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 类型中的方法。

如果是Animal和Cat有同样的属性name,这样声明对象,Animal animal=new Cat();,animal.name是Animal的name,这种情况只看编译类型

instanceof是用来判断该对象是否是某类或者某类的子类,例如 if (animal instanceof Cat)判断是否