认识
在继承或实现情况下的一种现象,表现为:对象多态,行为多态。
对象多态
狼和乌龟都是动物的子类
例如狼是动物的子类。我们可以写 Animal a1=new Wolf();
行为多态
然后a1.run().编译看左边,运行看右边,也就是说,会先看Animal里面有没有run,如果没有,那么直接报错。然后运行的时候会找子类Wolf的方法来调用。也就是说必定存在子类的方法重写·。所以多态下不能调子类独有的方法。
如果想要调用子类独有的方法,那么可以采用强制类型转换,强制转换类型为子类的。
注意
而对于成员变量来说,编译看左边,运行也看左边。如Animal和Wolf都有成员变量name,当我访问a1.name,实际上会出现Animal的name。
好处
理解来说,成员变量不需要多态,而在多态形式下,右边对象是解耦合的,更便于扩展和维护。各个部分可以随时拼装(其中一个不好用,可以只换掉这个,而不改变其他)。
定义方法时,使用父类类型的形参,可以接收一切子类对象,扩展性更强,更便利。
类型转换
Animal a1=new Wolf();存在自动类型转换。子类自动转为父类
强制类型转换:父类转变为子类
此处注意小心:如Animal a1=new Tortoise();
Wolf w=(Wolf)a1,那么由于编译看左边,所以强制类型转换不报错,但是运行看右边,发现狼指向了乌龟,所以报错。
强转时可以问问变量的真实类型,比如写if(a1 instanceof Wolf),比如当形式参数是Animal的时候我们无法确定这个到底是狼还是乌龟,但我们又想要调用子类的独有功能,那么我们就需要加上这句判断。