Java的三大特性继承、封装、多态,可以说没有继承就没有多态。
当使用父类引用子类的实例变量时,如果调用一个父类的方法,编译器不会知道到底要执行子类还是父类的方法,它只负责检查。当程序运行时,Java虚拟机分配了一块堆内存,而这个父引用则指向这块内存,执行指向所内存的方法区中的内容,这就是多态。
假设Java支持多重继承,Animal有两个子类Cat和Dog,这两个类各自实现了run()方法,同时还被CatDog所继承,未实现run方法(这生的是个怪胎,不能跑),假设执行以下代码:
Animal animal = new CatDog();
animal.run();
根据java虚拟机执行的规则,它会就近找run方法,CatDog()中无run()方法,则去父类找,那么究竟是执行Cat中的run还是Dog中的run,编译器无法确定,索性就不允许多重继承了(编译器:只要我装作没发现问题,那就没有问题…)
Java中是支持实现多个接口的,因为实现接口后,接口中的方法也一定会被实现,这样就不存在向上找方法的情况了。
什么,你问接口中的方法每个都要单独实现,并未起到继承那样节省代码的作用,为甚么还要搞个接口?当然是因为多态啦!