1. 程式人生 > >abstract class 抽象類與interface 介面的區別,以及應用

abstract class 抽象類與interface 介面的區別,以及應用

抽象類

特點

  • 擁有抽象方法的類必須是抽象類
  • 抽象類可以沒有抽象方法
  • 繼承了抽象類的子類必須實現抽象方法,如果不實現抽象方法那麼子類必須是抽象類
  • 抽象類中可以對方法進行宣告也可以對方法進行實現
  • 抽象方法不能宣告為static
  • 抽象方法不能宣告為private
  • 抽象類不能宣告為static
  • 抽象類可以implements介面,抽象類可以不用實現介面的方法,抽象類的子類需要實現抽象類implements的介面的方法

使用場景

JAVA為一門單繼承語言,但是需要實現其多型性,所以我們對繼承需要謹慎處理。抽象類可以說是一個類的所屬,也就是說抽象類需要抽象出子類們所共同的屬性和方法。舉例如下:

public
abstract class Person { abstract void sex(); } public class Man extends Person { @Override void sex() { } } public class Woman extends Person { @Override void sex() { } }

由上面可見,人是一個抽象類,男人和女人類繼承於人這個抽象類。該抽象類抽象出了,男人,女人都是人這個屬性,以及他們的屬性——性別。性別不同,所以必須實現性別這個方法。

又或者類似於廣播模式。

//觀察者
public abstract class Observer{ protected Subject subject; public abstract void update(); } //被觀察物件 public class Subject { //觀察者列表 private List<Observer> observers = new ArrayList<>(); private int state; public int getState() { return state; } //更改屬性state
public void setState(int state) { this.state = state; notifyAllObservers(); } //新增一個觀察者進入觀察者列表 public void attach(Observer observer) { observers.add(observer); } //通知觀察者列表中的所有觀察者更新 public void notifyAllObservers(){ for (Observer observer : observers) { observer.update(); } } } //其中一個觀察者 public class OctalObserver extends Observer { public OctalObserver(Subject subject){ this.subject = subject; this.subject.attach(this); } @Override public void update() { System.out.println( "Octal String: " + Integer.toOctalString( subject.getState() ) ); } } //其中一個觀察者 public class HexaObserver extends Observer { public HexaObserver(Subject subject){ this.subject = subject; this.subject.attach(this); } @Override public void update() { System.out.println( "Hex String: " + Integer.toHexString( subject.getState() ).toUpperCase() ); } } //其中一個觀察者 public class BinaryObserver extends Observer { public BinaryObserver(Subject subject){ this.subject = subject; this.subject.attach(this); } @Override public void update() { System.out.println( "Binary String: " + Integer.toBinaryString( subject.getState() ) ); } }

從上述可以看出,後續的OctalObserver,HexaObserver,BinaryObserver都是觀察者,都繼承於Observer。這是因為他們的根源都是觀察者,只不過他們型別不同。

所以抽象類可以說是定義了子類的根源,它的作用也是如此。

介面

特點

  • 介面只能對方法進行宣告,不能擁有方法體。(即實現方法)
  • 介面中的所有屬性預設為public
  • 介面可以extends多個介面。繼承這些介面後可以不實現其方法,留給implements該介面的類來實現
  • 子類必須實現介面中的所有方法

使用場景

介面更傾向於描述一系列的行為動作。比如,描述一個人的必須的活動,吃飯,睡覺,社交等。

public interface HowPersonDo {
     void sleep();
     void eat();
     void makeFriend();
}

兩者區別

  • 實現介面使用implements,繼承抽象類使用extends
  • 接口裡面只能對方法進行宣告,抽象類既可以對方法進行宣告也可以對方法進行實現
  • 介面中的方法必須全部實現,不然子類就必須為抽象類。繼承抽象類,必須實現抽象類中的所有抽象方法,不然子類就必須為抽象類。
  • 介面中的方法只能宣告,不能實現。而抽象類中的可以宣告也可以實現,實現的方法不是抽象方法。
  • 抽象類中可以沒有抽象方法
  • 擁有抽象方法的必須為抽象類
  • 由於抽象類中方法必須全部實現,所以抽象方法不能為static,也不能為private
  • 介面可以繼承多個介面,類只能繼承一個類

使用區別:

  • 抽象類是抽象出一個事物的類別,介面是抽象出方法和功能。
  • 著重事物本質就用抽象類,關注操作就用介面。
  • 介面更具有擴充套件性。(因為單繼承,多介面原因)