1. 程式人生 > 實用技巧 >深入理解Java介面和抽象類

深入理解Java介面和抽象類

一.抽象類

在瞭解抽象類之前,先來了解一下抽象方法。抽象方法是一種特殊的方法:它只有宣告,而沒有具體的實現。抽象方法的宣告格式為:

public abstract void open();

抽象方法必須使用abstract關鍵字進行修飾。如果一個類含有抽象方法,則稱這個類為抽象類,抽象類必須在類前用abstract關鍵字修飾。因為抽象類中無具體實現的方法,所以不能用抽象類建立物件。

抽象類定義為“包含抽象方法的類”

public abstract class TestAbstractDoor {

    public abstract void open();
    
    public abstract void close();
    }

 1)抽象方法必須為public或者protected(因為如果為private,則不能被子類繼承,子類便無法實現該方法),預設情況下預設為public。

  2)抽象類不能用來建立物件;

  3)如果一個類繼承於一個抽象類,則子類必須實現父類的抽象方法。如果子類沒有實現父類的抽象方法,則必須將子類也定義為為abstract類。

  在其他方面,抽象類和普通的類並沒有區別。

二.介面

public interface TestInterface {
public  void beforeHandle();
public  void dealHandle();
public void afterHandle();
}

  介面中可以含有變數和方法。但是要注意,介面中的變數會被隱式地指定為public static final變數(並且只能是public static final變數,用private修飾會報編譯錯誤),而方法會被隱式地指定為public abstract方法且只能是public abstract方法(用其他關鍵字,比如private、protected、static、 final等修飾會報編譯錯誤),並且介面中所有的方法不能有具體的實現,也就是說,介面中的方法必須都是抽象方法。

​ 要讓一個類遵循某組特地的介面需要使用implements關鍵字,具體格式如下:

public class TestInterfaceImpl implements TestInterface{
@Override
public void dealHandle() {
    // TODO Auto-generated method stub
    
}

@Override
public void beforeHandle() {
    // TODO Auto-generated method stub
    
}

@Override
public void afterHandle() {
    // TODO Auto-generated method stub
    
}
}

三.門和警報例項

門都有open( )和close( )兩個動作,此時我們可以定義通過抽象類和介面來定義這個抽象概念:

public abstract class TestAbstractDoor {

    public abstract void open();

    public abstract void close();

}

或者:

public interface TestInterfaceDoor {
    public abstract void open();

    public abstract void close();

}

但是現在如果我們需要門具有報警alarm( )的功能,那麼該如何實現

1)將這三個功能都放在抽象類裡面,但是這樣一來所有繼承於這個抽象類的子類都具備了報警功能,但是有的門並不一定具備報警功能;

  2)將這三個功能都放在接口裡面,需要用到報警功能的類就需要實現這個介面中的open( )和close( ),也許這個類根本就不具備open( )和close( )這兩個功能,比如火災報警器。

public abstract class TestAbstractDoor {

    public abstract void open();

    public abstract void close();

}


public interface TestInterfaceAlarm {
    public void alarm();
}
public class TestAlarmDoor  extends TestAbstractDoor implements TestInterfaceAlarm{

    @Override
    public void alarm() {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void open() {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void close() {
        // TODO Auto-generated method stub
        
    }

}