Java为什么不支持多继承? 發布於 2 年前 (2017年10月30日) – 1210 次检阅

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的类不支持。