1. 程式人生 > >關於java介面與多型、繼承的思考

關於java介面與多型、繼承的思考

Java 的介面可以想象成為c++的抽象類, 是java實現多型的一種方法

如果有個類擁有一個介面, 那麼這個類就是介面的子類, 即介面是這個類的父類;

如下例

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");
	}
}
那麼GraphicCard、NetworkCard實際上就是PCI介面(類)的子類,如果你學過c++那麼這段程式碼等效於
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++有些知識忘了, 大體意思如此,或許有疑問,有繼承了為啥還要介面,這個問題待會再說;

理解了這步以後以後讓我們看下例

主機板類例

一個主機板可能只有一個插槽, 插槽上可以插網絡卡、顯示卡等, 但是怎麼實現呢?

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

}
這樣你就應該理解介面型別sloat1為什麼賦值成NetworkCard 、GraphicCard等類了(即上將介面看做c++中的類 ),這樣主機板上無論插上顯示卡還是網絡卡都能工作了。

至於為什麼要有介面,因為Java只允許單繼承, 卻允許有多個介面, 如上例,NetworkCard如果能夠插了手機上(假設), 那麼NetworkCard需要繼承手機的PCIForMobile類,

然而Java不允許多繼承,只好用介面代替。