Java 多态

来源:互联网 发布:管理windows凭据 编辑:程序博客网 时间:2024/06/14 22:07

多态:父类的引用可以指向子类型的对象。


例如:animal是父类Animal类引用,它指向了子类Bird的对象

Animal aniaml = new Bird();

多态中方法调用的规律:当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,就会报编译错误;如果父类中有该方法,则再去调用子类中该同名的方法。


如果想调用子类中有而父类中没有的方法,需要进行强制类型转换。因为当父类的引用指向子类的对象,用父类引用调用方法时,找不到父类中不存在的方法,这时需要进行向下类型转换,将父类引用转换为子类引用。


下面通过一个demo来展示:

class Animal {public void run() {System.out.println("Animal is runing!");}}class Dog extends Animal {@Overridepublic void run() {System.out.println("Dog is runing!");}}class Bird extends Animal {@Overridepublic void run() {System.out.println("Bird is runing!");}public void fly(){System.out.println("Bird is flying!");}}/****************测试类*********************/public class PolyTest1 {public static void main(String[] args) {/*向上类型转换(子类对象赋给父类对象),不需要强转,很符合现实环境,鸟是动物很正常!*/Bird Bird = new Bird();Animal animal = Bird;/*输出"Bird is runing!"【首先判断出父类中有run()方法,然后再调用子类中同名的方法得到的输出结果】*/animal.run();/*向下转换(父类对象赋给子类对象),需要强转,这个也符合现实环境,动物不一定是鸟,所以要强转为鸟的类型*/Animal animal1 = new Bird();Bird c = (Bird) animal1;/*输出"Bird is runing!"*/c.run();/*输出"Bird is flying!"*/c.fly();Animal a = new Bird();/*编译错误,用父类的引用调用父类不存在的方法而发生错误【Bird中虽然有fly()方法,但是Animal中没有,a是Animal的引用,所以找不到该方法】*///a.fly();Animal a2 = new Bird();/*向下转换也是有条件的:父类星的引用必须指向子类的对象【Animal的引用a2指向的是Bird类的对象,现在要转换为Dog,可能吗?】*///Bird c2 = (Dog) a2;}}


0 0