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的類不支援。

Tags: