前言
本文将通過一個案例,實作面向抽象程式設計與面向接口程式設計,在舉例之前先簡單說明下抽象與接口這兩個概念。
1、面向抽象:抽象類的設計就是隻關心操作,不關心具體實作,這樣可以使得程式設計者在
将主要精力放在程式設計上,而不必拘泥于細節的實作。如人類分中國人、美國人、南韓人,他們都說早上好,設計者隻需要設計一個speak()抽象方法,不用管具體哪國人說什麼語言,他們具體說的語言給其他具體實作的程式員去做。抽象程式設計常常與繼承、多态結合,面向抽象程式設計可以更适應需求變化,如我們又加一個日本人,使得代碼可維護,在設計上注重于将共性抽取出來,也就是将子類的共性抽取出來,形成一個抽象父類來繼承。
2、面向接口:接口中隻有抽象方法,不像抽象類中可以有普通方法。接口隻關心操作,而不關心具體實作細節,可以把主要精力放在程式設計上,内容細節由實作接口的類去完成。開發中比如我們開發一個登入功能,這時就可以用面向接口程式設計,不用管登入的具體細節,如實作登入時記錄登入人數,隻要定義loginEvent接口即可,以後開發接口非常常用。
總結:面向抽象程式設計是将子類共性抽取,而面向接口程式設計都是将主要精力放在程式設計,而先不管具體實作細節。
常考面試題:接口和抽象類的差別
1、抽象類中除了有抽象方法以外,還可以有普通方法,而接口中必須全是抽象方法(public abstract 可省略)
2、抽象類隻能繼承一個,接口可以實作多個
3、抽象類中的成員變量可以是各種類型,而接口中的成員變量隻能是public static final(可省)類型
案例
1、面向抽象程式設計
分析:
編寫抽象類Animal就是隻關注有兩個行為,不關注具體實作,具體實作又其子類來實作,然後實作後隻需要建立Simulator,往playSound方法中傳入這個具體實作(貓或狗—多态)。
Animal.java
public abstract class Animal {
public abstract void cry();
public abstract String getAnimalName();
}
Simulator.java
public class Simulator {
public void playSound(Animal animal){
System.out.print(animal.getAnimalName()+":");
animal.cry();
}
}
Cat.java
public class Cat extends Animal {
@Override
public void cry() {
System.out.println("喵喵喵");
}
@Override
public String getAnimalName() {
return "貓";
}
}
Dog.java
public class Dog extends Animal{
@Override
public void cry() {
System.out.println("汪汪汪");
}
@Override
public String getAnimalName() {
return "狗";
}
}
Application.java
public class Application {
public static void main(String[] args) {
Simulator simulator = new Simulator();
simulator.playSound(new Cat());
simulator.playSound(new Dog());
}
}
輸出

2、面向接口程式設計
分析
同樣的案例,隻是這裡是接口
設計一個動物聲音“模拟器”,希望可以模仿許多動物的叫聲(cry),要求如下:
-
編寫接口Animal
Animal接口有兩個抽象方法cry()和getAnimalName(),既要求給出各種動物叫聲與名稱
-
程式設計模拟器Simulator
該類有一個playSound(Animal animal)方法,參數類型是Animal
- 編寫Animal接口的Dog類與Cat類
- 主類:Application
實作代碼:
Animal.java
public interface Animal {
public void cry();
public String getAnimalName();
}
Simulator.java
public class Simulator {
public void playSound(Animal animal){
System.out.print(animal.getAnimalName()+":");
animal.cry();
}
}
Cat.java
public class Cat implements Animal{
@Override
public void cry() {
System.out.println("喵喵喵");
}
@Override
public String getAnimalName() {
return "貓";
}
}
Dog.java
public class Dog implements Animal {
@Override
public void cry() {
System.out.println("汪汪汪");
}
@Override
public String getAnimalName() {
return "狗";
}
}
Application.java
public class Application{
public static void main(String[] args) {
Simulator simulator = new Simulator();
simulator.playSound(new Cat());
simulator.playSound(new Dog());
}
}
輸出
That’s all !