抽象類
抽象類是什麼
簡單地說,抽象類就是被abstract修飾的類
抽象類的作用
提取子類中的公共方法,但是不提供具體的實現
抽象類有什麼
-
構造器
-
普通屬性
-
普通方法
-
抽象方法(用abstract修飾的方法)
- 使用abstract修飾方法
- 沒有方法體
注意1:抽象類與普通類的區別
- 使用abstract修飾類
- 多了抽象方法
注意2:抽象類雖然有構造器,但是不能用抽象類創建對象,其意義在於子類繼承之後,由子類實現抽象類的抽象方法,從而體現多態(向上造型)。
注意3:抽象類的繼承與普通繼承一樣具有傳遞性:如果子類不想實現父類的抽象方法,那麼子類也可以成爲抽象類,由下一代來實現(爺爺的願望—>父親無法完成—>孫子繼承爺爺的願望)
抽象類的簡單示例
package day20191106;
public abstract class AbstrClass {
//普通變量
int a;
int b;
//構造器
public AbstrClass() {
}
//普通方法
public void method() {
}
//構造方法
public abstract void abstrMethod();
}
package day20191106;
public class Demo01 extends AbstrClass{
@Override
public void abstrMethod() {
// TODO Auto-generated method stub
}
}
關於抽象類的一些小tip
- 抽象類不一定有抽象方法
- 有抽象方法的類一定是抽象類
- 抽象方法的意義在於被繼承,而不是被調用
- abstract不能和final一起使用
- 被final修飾的類不能被繼承、被final修飾的方法不能被重寫,這與抽象類的意義衝突
- 抽象類可以有構造器,但是不能被實例化
- 通過子類的向上造型來實例化
接口
接口是什麼
接口是特殊的抽象類,特殊之處如下:
- 不使用abstract修飾,而使用interface修飾,且沒有class關鍵字
- 內部沒有普通屬性,只有常量(默認添加public、static、final,且只能在聲明的同時初始化)
- 內部沒有普通方法,只能有抽象方法,且方法聲明時不用寫abstract和訪問控制符,接口會默認給所有方法添加abstract和public(因此也不存在構造器)
- 接口不能被繼承,只能被子類實現
接口的意義
- 規範動作
- 擴展功能
接口的使用
- 關鍵字:implements,表示當前類實現該接口
注意1:接口的實現與繼承不同
- 繼承:一個子類只能繼承一個父類
- 接口:一個子類可以同時實現多個接口,一個接口也可以被多個子類實現
注意2:extends可以與implements一起使用,但是繼承必須在實現接口之前
- 所有類都默認繼承了Object,即使是實現接口的子類也不例外
注意3:接口可以繼承接口(extends),且一個接口可以繼承多個接口
接口的簡單示例
接口1
package day20191106;
//接口1
public interface InterClass1 {
void method();
}
接口2
package day20191106;
//接口2
public interface InterClass2 {
int a = 0;
int b = 0;
void method1();
void method2();
}
子類同時實現接口1和接口2
package day20191106;
//子類同時實現接口1和接口2,如果有更多的接口需要實現,只需要用“,”分割多個接口
public class Demo02 implements InterClass1,InterClass2{
@Override
public void method1() {
// TODO Auto-generated method stub
}
@Override
public void method2() {
// TODO Auto-generated method stub
}
@Override
public void method() {
// TODO Auto-generated method stub
}
}
子類繼承抽象類AbstrClass,同時實現接口1和接口2
package day20191106;
//extends與implements共同使用
public class Demo02 extends AbstrClass implements InterClass1,InterClass2{
@Override
public void method1() {
// TODO Auto-generated method stub
}
@Override
public void method2() {
// TODO Auto-generated method stub
}
@Override
public void method() {
// TODO Auto-generated method stub
}
@Override
public void abstrMethod() {
// TODO Auto-generated method stub
}
}
接口繼承接口
package day20191106;
import java.awt.event.KeyListener;
import java.awt.event.MouseListener;
//接口繼承接口(一對多)
public interface InterClass1 extends MouseListener,KeyListener{
void method();
}
對比
普通類、抽象類、接口的區別
普通類 | 抽象類 | 接口 | |
---|---|---|---|
構造器 | ✔ | ✔ | ✖ |
普通屬性 | ✔ | ✔ | ✖ |
常量 | ✔ | ✔ | ✔ |
普通方法 | ✔ | ✔ | ✖ |
抽象方法 | ✖ | ✔ | ✔ |
父、子類關係 | extends | extends | implements |
創建對象的方式 | 直接創建或者子類向上造型 | 子類向上造型 | 子類向上造型 |
繼承與實現
繼承extends | 實現implements | |
---|---|---|
類-類 | 1-1 | 無 |
類-接口 | 無 | 1-N |
接口-類 | 無 | 無 |
接口-接口 | 1-N | 1-N |