前言:html
這幾天給別人講JavaSE基礎,又把面向對象看了一遍,講的時候發現一個問題,就是當時講抽象類和接口的時候說接口也是抽象類,是個特殊的抽象類,當時聽的時候別人確實能聽懂,由於確實沒多少東西,可是真正用的時候總會猶豫,到底何時該用抽象類何時用接口呢?java
你們在比較抽象類和接口的區別時,必定要強調抽象類描述的是事物的本質,而接口描述的是事物的功能。好比:保溫杯是水杯,因此水杯應該設計爲抽象類,保溫杯有保溫的功能,因此保溫應該設計爲接口。ide
可理解爲:this
class 保溫杯 extends 水杯 implements 保溫
package zmldemo; //水杯抽象類 public abstract class Cup { String name;//水杯名稱 String color;//水杯顏色 public Cup() { } public Cup(String name, String color) { this.name = name; this.color = color; } //水杯使用說明方法 public abstract void useCup(); }
package zmldemo; //保溫接口 public interface BaoWen { //保溫方法 public void baoWen(); }
package zmldemo; //刷牙杯 public class ShuaYaBei extends Cup { public ShuaYaBei() { } public ShuaYaBei(String name, String color) { super(name, color); } @Override public void useCup() { System.out.println("我是"+this.color+"的"+this.name+","+"我是用來刷牙的"); } }
package zmldemo; //保溫杯 public class BaoWenBei extends Cup implements BaoWen{ public BaoWenBei(){ } public BaoWenBei(String name,String color){ super(name,color); } @Override public void useCup() { System.out.println("我是"+this.color+"的"+this.name+","+"我是用來喝水的"); } @Override public void baoWen() { System.out.println("我能對水杯裏的水進行保溫"); } }
package zmldemo; public class CupTest { public static void main(String[] args) { ShuaYaBei shuaYaBei = new ShuaYaBei("刷牙杯","紅色"); shuaYaBei.useCup(); BaoWenBei baoWenBei = new BaoWenBei("保溫杯","金黃色"); baoWenBei.useCup(); baoWenBei.baoWen(); } }
運行結果:spa
我想看到這,學過抽象類和接口的朋友應該能理解了,那本篇標題「抽象類和接口究竟是什麼垃圾——秒懂」對應的部分完成了,既然都說到這了,再來點延申。設計
抽象類和接口能實例化對象嗎?htm
這個問題其實也有不少人糾結,我以前專門有過對這個問題在網上進行搜索查詢,看了好幾篇別人寫的博客,結果答案不一,理解各不相同,有的博客裏的理解還有錯誤,容易對別人誤導,後來我本身查資料,用本身的理解寫了一篇博客《抽象類能實例化嗎?——口氣很強硬——「不能」(詳解)》,結果固然正如其名所示,是不能的,至於爲什麼,裏面有詳細的解釋,你們自行查閱,在這就不作補充了。對象
*****************************************************************************************************blog
個人博客園地址:https://www.cnblogs.com/zyx110/接口
本文已獨家受權給腳本之家(jb51net)公衆號獨家發佈