1. 程式人生 > >簡談對Java的abstract和interface的理解

簡談對Java的abstract和interface的理解

Java通過Abstract與Interface來實現對抽象概念的定義1。這兩者強化了Java面向物件的特點。Abstract與Interface對抽象概念的支援很相似,但是區別亦比較顯著。

class A extends B implements C,D,E;2

Abstract (抽象類)

抽象類是實現多型的一種機制。這種機制定義了一組抽象的方法,至於這組抽象方法的具體表現形式則可以由sub-class以extends來實現。

  • 抽象類不能被implement,具體的implementation由子類over-ridding來實現。
  • 換句話說,抽象類建立了sub-class裡某些method的模板
    3
public abstrct class Laptop{
    public abstract void displayLogo();
    public void sayHelloToUser{
        System.out.println("Hello World!");
    }
}

public class MacBookPro extends Laptop{
    public void displayLogo{
        System.out.println("This is an Apple Logo");
    }
}

public class
SurfaceBookPro extends Laptop{
public void displayLogo{ System.out.println("This is a Microsoft Logo"); } }

Interface (介面)

介面是抽象方法的集合。如果一個類implements了某個介面,那麼它就繼承了這個介面的抽象方法。而且必須確保使用接口裡的這些方法。介面只是一種形式,其自身並無實體意義4

  • 注意,接口裡只能有public abstract方法。
  • 接口裡方法的實現,亦可以通過子類繼承父類來實現。

例如:父類A與子類B,子類B呼叫了介面K但未實現介面K的抽象方法M。幸運的是,在父類A裡有返回屬性、方法名稱與引數均相同的方法M的實現。這樣的話,我們也認為子類B實現了抽象方法M。

public interface LogoPage{
    public abstract void displayLogo();
}

public class MacBookPro implements LogoPage{
    //over-riding
    public void displayLogo{
        System.out.println("This is an Apple Logo");
    }
}

public class SurfaceBookPro implements LogoPage{
    //over-riding
    public void displayLogo{
        System.out.println("This is a Microsoft Logo");
    }
}

public class NewMacBookPro extends MacBookPro implements LogoPage{
    //此子類裡不實現displayPage()也不會報錯
}

對比討論

這裡附上我們大學講OOP時的一張表格5

abstract class interface
can have some methods declared as abstract all methods must be abstract
can have static \ protected methods only has public methods with NO implementations
can have final and non-final attributes only has static final constraints

extends 可以理解為全盤繼承了父類的功能,implements 一個 interface 可以理解為幫助這個類附加一些額外的功能。interface 定義了一些抽象方法,但是並未具體實現,需要類呼叫介面來具體實現。

基於程式設計規範,abstrct 方法應使用 public 打頭。下面是我在StackOverFlow上看到的一段討論6

Private methods are not polymorphic (you cannot inherit them), so it makes no sense to make a private method abstract. Making a method abstract means you’d have to override and implement it in a subclass, but since you can’t override private methods, you can’t make them abstract either. You should make it protected instead of private. Private really means private to the class you’ve defined the method in; even subclasses don’t see private methods.

簡單來說,extends 繼承來的 abstract 方法,需要 implements 之後才可用。對於java class來說,extends 用於繼承一個 class,而 implements 用於實現一個 interface。

這篇文章只是對Java抽象方法與介面的一點簡單理解,如有內容疏漏錯誤或侵權,還請及時聯絡我進行訂正。我的個人主頁:https://peterljq.github.io,首頁有聯絡方式。