Java为什么不支持多继承?这个问题其实真的挺简单。
我们可以先举一个多重继承错误的例子,我们定义一个动物(类)既是狗(父类1)也是猫(父类2),两个父类都有“叫”这个方法。那么当我们调用“叫”这个方法时,它就不知道是狗叫还是猫叫了,这就是多重继承的冲突。
package com.glj.demo1; public class Cat { public void say(){ System.out.println("this is Cat say!"); } } ------------------------------ package com.glj.demo1; public class Dog { public void say(){ System.out.println("this is dog say!"); } } ---------------------------------------------------- package com.glj.demo1; public class CatAndDog extends Dog,Cat{ public static void main(String[] args) { this.say();//这里是猫叫呢还是狗叫呢? } }
所以,如果你需要弄一个既要有猫叫又要有狗叫的什么鬼动物来的话,那么只需要创造一个描述这类行为的接口,然后在自己的类里面实现这个行为的接口,最终就能实现所谓的行为来了....
因此,Java支持接口的多继承,不支持类的多继承,Java不支持类的多继承的一个原因是避免实现方法的版本冲突
所以需要实现多继承,那么就是下面的
多接口+组合=多继承
下面我们实现一个多继承的例子,即一个接口people类,里面有一个say方法和一个work的行为方法,再有一个Chinese接口类和American接口类去继承了people的接口,然后二者结婚生下了一个中美的混血儿..ChandAm类...
package com.glj.demo; public interface People { public abstract void say(); public abstract void work(); } --------------------------------------- package com.glj.demo; public interface American extends People{ @Override public void say(); @Override public void work(); } --------------------------------------- package com.glj.demo; public interface Chinese extends People{ @Override public void say(); @Override public void work(); } --------------------------------------- package com.glj.demo; public class ChandAm implements Chinese,American{ @Override public void say() { // TODO Auto-generated method stub System.out.println("我是中美的混血儿"); } @Override public void work() { // TODO Auto-generated method stub System.out.println("我会打太极"); } } ----------------------------------------------- package com.glj.demo; public class Test { public static void main(String[] args) { ChandAm cna = new ChandAm(); cna.say();//我是中美的混血儿 cna.work();//我会打太极 } }
所以,从上面的例子不难发现,Java其实是支持多继承的,具体为:
- Java中的接口支持多继承(接口与接口之间为继承关系),因为接口不提供具体实现方式,只是一种规范,所以支持。
- Java的类是支持多接口的实现。
- Java的类是不支持多继承的,原因是Java是强类型语言,多继承会导致调用的不确定性,所以Java的类不支持。