關於java介面與多型、繼承的思考
阿新 • • 發佈:2019-02-07
Java 的介面可以想象成為c++的抽象類, 是java實現多型的一種方法
如果有個類擁有一個介面, 那麼這個類就是介面的子類, 即介面是這個類的父類;
如下例
那麼GraphicCard、NetworkCard實際上就是PCI介面(類)的子類,如果你學過c++那麼這段程式碼等效於interface PCI{ public abstract void start(); public abstract void stop(); } class GraphicCard implements PCI{ private String model; public GraphicCard(String mod) { model = mod; } public void start() { System.out.println("GraphicCard is working"); } public void stop() { System.out.println("GraphicCard is stopping"); } } class NetworkCard implements PCI{ private String model; public NetworkCard(String mod) { model = mod; } public void start() { System.out.println("NetworkCard is working"); } public void stop() { System.out.println("NetworkCard is stopping"); } }
class PCI { virtual void start(); virtual void stop(); }; class GraphicCard: public PCI { private: String model; public: GraphicCard(String mod) { model = mod; } void start() { System.out.println("GraphicCard is working"); } void stop() { System.out.println("GraphicCard is stopping"); } }; class NetworkCard : public PCI { private: String model; public: NetworkCard(String mod) { model = mod; } void start() { System.out.println("NetworkCard is working"); } void stop() { System.out.println("NetworkCard is stopping"); } };
c++有些知識忘了, 大體意思如此,或許有疑問,有繼承了為啥還要介面,這個問題待會再說;
理解了這步以後以後讓我們看下例
主機板類例
一個主機板可能只有一個插槽, 插槽上可以插網絡卡、顯示卡等, 但是怎麼實現呢?
這樣你就應該理解介面型別sloat1為什麼賦值成NetworkCard 、GraphicCard等類了(即上將介面看做c++中的類 ),這樣主機板上無論插上顯示卡還是網絡卡都能工作了。package com.abc; interface PCI{ public abstract void start(); public abstract void stop(); } class GraphicCard implements PCI{ private String model; public GraphicCard(String mod) { model = mod; } public void start() { System.out.println("GraphicCard is working"); } public void stop() { System.out.println("GraphicCard is stopping"); } } class NetworkCard implements PCI{ private String model; public NetworkCard(String mod) { model = mod; } public void start() { System.out.println("NetworkCard is working"); } public void stop() { System.out.println("NetworkCard is stopping"); } } /* * 可以定義一系列可以插了主機板的卡片..... */ class MainBoard{ private String model; private PCI slot1; // 實現多型的條件 public MainBoard(String mod, PCI card) { model = mod; slot1 = card; } public void setSlot1(PCI card) { this.slot1 = card; } public void work() { slot1.start(); } } public class TestMainBorad { public static void main(String[] args) { NetworkCard Nc = new NetworkCard("網絡卡"); GraphicCard Gc = new GraphicCard("顯示卡"); //初始化主機板插槽放置顯示卡 MainBoard M1 = new MainBoard("主機板", Gc); //顯示卡開始工作 M1.work(); //更換主機板插槽所放卡片型別 M1.setSlot1(Nc); //網絡卡開始工作 M1.work(); } }
至於為什麼要有介面,因為Java只允許單繼承, 卻允許有多個介面, 如上例,NetworkCard如果能夠插了手機上(假設), 那麼NetworkCard需要繼承手機的PCIForMobile類,
然而Java不允許多繼承,只好用介面代替。