2.24.2013

[Java 概念]Interface and abstract class

在上一篇介紹了OO的基本概念:封裝,繼承和多型,這篇要來介紹一下Java的介面和抽象類別,他們的差別是Java面試時常見的問題,下面來介紹一下他們的差別,以及使用時機。

介面和抽象類別的差別


  1. 介面本身並不包含實作,他只定義行為,實作介面的類別代表他有此行為。相對地,抽象類別本身可以包含抽象和實體方法,可以提供共同/預設的行為。
  2. Java class可以實作多個介面,但只能繼承一個抽象類別,介面能提供更多的多型支援。
  3. 要實作一個介面,你必需實作其所有行為,一旦行為一多,對於實作類別來說相當痛苦,因此較好的設計是一個介面最多提供1~2個行為,不要設計一個介面包含過多行為;而抽象類別則是一開始就提供了預設的實作。
在前文提到,多型本身可利用介面或繼承達成late-binding,以前的我會搞不太清楚何時用介面,何時用抽象類別(繼承),在這裡分享一下我的心得:

介面和抽象類別的使用時機


  1. 因為Java不支援多重繼承但可以實作多個介面,若你想要更多的多型支援,那就必需使用介面。
  2. IS-A關係,同型態的物件本身的行為相同時,就適合用繼承。至於super class本身需不需要Abstract,則是看情形,我認為大部份都是Abstract為多數,通常Abstract class會定義演算法,而將不同的部份定義為abstract method,由各子類別進行實作,這也就是Template Method pattern。
  3. 介面用於定義支援的行為,譬如:Runnable支援run(),Callable支援call(),當只需定義行為,而每個型態的物件本身的行為不同時,就適合用介面。

你可能對下面主題有興趣:
  1. [OO概念]封裝,繼承,多型
  2. Java的十個物件導向設計原則

No comments: