天天看點

【Java基礎】面向抽象程式設計與面向接口程式設計

前言

本文将通過一個案例,實作面向抽象程式設計與面向接口程式設計,在舉例之前先簡單說明下抽象與接口這兩個概念。

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());
    }
}
           

輸出

【Java基礎】面向抽象程式設計與面向接口程式設計

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());
    }
}
           

輸出

【Java基礎】面向抽象程式設計與面向接口程式設計

That’s all !

【Java基礎】面向抽象程式設計與面向接口程式設計