前言:
這幾天給別人講JavaSE基礎,又把面向對象看了一遍,講的時候發現一個問題,就是當時講抽象類和接口的時候說接口也是抽象類,是個特殊的抽象類,當時聽的時候別人確實能聽懂,因為確實沒多少東西,但是真正用的時候總會猶豫,到底什么時候該用抽象類什么時候用接口呢?
如何區分使用抽象類和接口
大家在比較抽象類和接口的區別時,一定要強調抽象類描述的是事物的本質,而接口描述的是事物的功能。比如:保溫杯是水杯,所以水杯應該設計為抽象類,保溫杯有保溫的功能,所以保溫應該設計為接口。
可理解為:
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();
}
}
運行結果:

我想看到這,學過抽象類和接口的朋友應該能理解了,那本篇標題“抽象類和接口到底是什么垃圾——秒懂”對應的部分完成了,既然都說到這了,再來點延申。
話題延申
抽象類和接口能實例化對象嗎?
這個問題其實也有很多人糾結,我之前專門有過對這個問題在網上進行搜索查詢,看了好幾篇別人寫的博客,結果答案不一,理解各不相同,有的博客里的理解還有錯誤,容易對別人誤導,后來我自己查資料,用自己的理解寫了一篇博客《抽象類能實例化嗎?——口氣很強硬——“不能”(詳解)》,結果當然正如其名所示,是不能的,至於為何,里面有詳細的解釋,大家自行查閱,在這就不做補充了。
*****************************************************************************************************
我的博客園地址:https://www.cnblogs.com/zyx110/
本文已獨家授權給腳本之家(jb51net)公眾號獨家發布
