接口怎么实例化?
最開(kāi)始看到數(shù)據(jù)庫(kù)連接的時(shí)候忽然想到這個(gè)問(wèn)題:
Connection con=null;try {Class.forName(Driver);} catch (ClassNotFoundException e) {e.printStackTrace();}try {con=DriverManager.getConnection(url, user, pass);} catch (SQLException e) {e.printStackTrace();}Connection是java中的一個(gè)接口,但是使用的時(shí)候是這樣的:
Connection con=DriverManager.getConnection(url, user, pass);而且方法getConnection的返回類(lèi)型是Connection類(lèi)型。也是接口類(lèi)型?
接口不是不能實(shí)例化嗎?為什么能實(shí)例化,而且,接口里面的方法不是沒(méi)有方法實(shí)現(xiàn)嗎?為什么能夠直接調(diào)用con.Close()等等的方法。
?
接口不能直接new,但是它可以作為別的類(lèi)的變量。如果有類(lèi)實(shí)現(xiàn)了這個(gè)接口,則可以new!
舉一個(gè)簡(jiǎn)單的例子:java.lang.List是一個(gè)接口,但是List list=new ArrayList();是沒(méi)有任何錯(cuò)誤的,因?yàn)锳rrayList實(shí)現(xiàn)了List接口。
這樣來(lái)回答吧,為什么父類(lèi)的引用能指向子類(lèi)對(duì)象呢?
父類(lèi)定義了子類(lèi)中一定存在的方法和屬性。
同理,接口的引用指向他的實(shí)例化對(duì)象也是因?yàn)閷?shí)例化對(duì)象中必然要實(shí)現(xiàn)接口中定義的方法和屬性。
對(duì)象的類(lèi)型還是new出來(lái)的類(lèi)型,或方法返回的類(lèi)型,
(如DriverManager.getConnection(String a,String b,String c)靜態(tài)方法返回Connection接口的實(shí)例化對(duì)象)。
也可以這樣寫(xiě):
Connection conn =new XXX ()
XXX為實(shí)現(xiàn)Connection接口的類(lèi)。
只不過(guò)引用(變量名)如conn只能調(diào)用接口定義的方法(這也是接口的意義之一)。
?
DriverManager.getConnection 返回的是接口的一個(gè)實(shí)現(xiàn),是實(shí)現(xiàn)類(lèi),這個(gè)類(lèi)已經(jīng)實(shí)現(xiàn)了Connection這個(gè)接口,
但是getConnection方法里面就已經(jīng)轉(zhuǎn)換了類(lèi)型,轉(zhuǎn)換成Connection類(lèi)型。但是Con這個(gè)實(shí)例實(shí)際上還是指向?qū)崿F(xiàn)類(lèi)的實(shí)例。不過(guò)這個(gè)實(shí)例只能調(diào)用接口有的方法。
?
一位網(wǎng)友的回答挺好的:
小霸王游戲機(jī)應(yīng)該玩過(guò)吧,接口(Connection)就像是插游戲卡的插槽,它事先弄好了各種方法(con.close),但是具體實(shí)現(xiàn)沒(méi)有寫(xiě)進(jìn)去。這時(shí)候 類(lèi)就像是游戲卡(你get到的對(duì)象)一樣,它的方法和插口一樣,但是它還寫(xiě)了這些方法是如何實(shí)現(xiàn)的。 于是我們把游戲卡(你get到的對(duì)象)插到游戲機(jī)的插槽(connection)上,就可以玩游戲啦。 游戲機(jī)可不知道游戲卡的具體實(shí)現(xiàn)是什么,但是它知道插槽有什么方法,直接調(diào)用插槽的方法(con.close)就行,
因?yàn)椴宀凵喜逯螒蚩?#xff0c;就會(huì)調(diào)用游戲卡的該方法。
?
轉(zhuǎn)載于:https://www.cnblogs.com/alsf/p/6685607.html
總結(jié)
- 上一篇: SELinux入门简介
- 下一篇: 特性Attribute