1. 程式人生 > >介面與抽象類,區別以及使用場景

介面與抽象類,區別以及使用場景

順便做個記錄


介面和抽象類應該是Java語法中最常見的兩個概念

關於兩者,網上也是一搜一噸的對比,總體如下:

1,抽象類的成員可以具有訪問級別 介面的成員全部public級別
2,抽象類可以包含欄位 介面不可以
3,抽象類可以繼承介面 介面不能繼承抽象類
4,抽象類的成員可以具有具體實現 介面不行
5,抽象的子類可以選擇性實現其基類的抽象方法 介面的子類必須實現

6,介面是抽象類的一種特例!

概念雖然簡單

不過到具體使用場景中,什麼情況下用抽象類,什麼情況下用介面呢,很多人卻搞不明白


下面我舉個例子

有一個Door,裡面有方法open()和方法close()

我們要把他抽象出來,形成一個類,可以有下面兩種方法

1,抽象成抽象類,如下

	abstract class Door{
		void open() {}
		void close(){}
	}


2,抽象成介面,如下

	interface Door{
		void open();
		void close();
	}

看起來兩者好像沒啥區別,現在我們要加一個功能,門鈴功能

沒啥問題,那就加上

1,抽象類

	abstract class Door{
		void open() {}
		void close(){}
		void bilibili(){}
	}

2,介面

	interface Door{
		void open();
		void close();
		void bilibili();
	}


那麼問題來了,所有門都有開關門功能,是不是所有的門都有門鈴呢?

那不是所有的實現Door的類都得具有門鈴方法?


所以,我們應該把門鈴理解成一種附件,一種Attach,可以加到門上面的一種點綴

對於這種附件形式的類,我們就可以用介面來表示


所以,啥叫介面,就是在門上鑿出一個門鈴大小的洞,用來放門鈴的,就跟電腦上的usb介面一樣,一個洞嘛!


我們就可以這樣來定義鈴聲這樣一個介面

	interface Ring{
		void bilibili();
	}
這樣定義Door這個類

	abstract class Door{
		void open() {}
		void close(){}
	}

這樣,如果有一個鈴鐺的門,可以這樣來寫:

	class DoorWithRing extends Door implements Ring{

		public void bilibili() {
			// TODO Auto-generated method stub
			
		}
	}

如果是一個沒有鈴鐺的門

	class DoorWithRing extends Door{

	}


現在我們要在門上裝一個貓眼,咋裝呢,很簡單

買個貓眼:

	interface CatEye{
		void see();
	}


把貓眼裝進門上的洞裡:

class DoorWithRingAndCatEye extends Door implements Ring,CatEye{
		public void see() {
			// TODO Auto-generated method stub
			
		}
		public void bilibili() {
			// TODO Auto-generated method stub
			
		}
	}

一個門上可以打無數的洞,也就是可以實現多個介面!


有人會問,門鈴,貓眼,這些東西不也是類嗎,為啥不做成類,做成介面呢?


對的,當然可以做成一個正常的類,有他的屬性什麼的,這樣貓眼,門鈴和門的關係就變了,變成聚合關係了,不是組合,因為門沒了門鈴和貓眼還是門,這些基本的概念有機會再延伸吧


所以,對於那種功能單一(響鈴,看人),又需要拿來作為一個附件附加到基本類上的類,我們就把它定義成介面



ok!