最開始看到數據庫連接的時候忽然想到這個問題:
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中的一個接口,但是使用的時候是這樣的:
Connection con=DriverManager.getConnection(url, user, pass);而且方法getConnection的返回類型是Connection類型。也是接口類型?
接口不是不能實例化嗎?為什么能實例化,而且,接口里面的方法不是沒有方法實現嗎?為什么能夠直接調用con.Close()等等的方法。
接口不能直接new,但是它可以作為別的類的變量。如果有類實現了這個接口,則可以new!
舉一個簡單的例子:java.lang.List是一個接口,但是List list=new ArrayList();是沒有任何錯誤的,因為ArrayList實現了List接口。
這樣來回答吧,為什么父類的引用能指向子類對象呢?
父類定義了子類中一定存在的方法和屬性。
同理,接口的引用指向他的實例化對象也是因為實例化對象中必然要實現接口中定義的方法和屬性。
對象的類型還是new出來的類型,或方法返回的類型,
(如DriverManager.getConnection(String a,String b,String c)靜態方法返回Connection接口的實例化對象)。
也可以這樣寫:
Connection conn =new XXX ()
XXX為實現Connection接口的類。
只不過引用(變量名)如conn只能調用接口定義的方法(這也是接口的意義之一)。
DriverManager.getConnection 返回的是接口的一個實現,是實現類,這個類已經實現了Connection這個接口,
但是getConnection方法里面就已經轉換了類型,轉換成Connection類型。但是Con這個實例實際上還是指向實現類的實例。不過這個實例只能調用接口有的方法。
一位網友的回答挺好的:
小霸王游戲機應該玩過吧,接口(Connection)就像是插游戲卡的插槽,它事先弄好了各種方法(con.close),但是具體實現沒有寫進去。
這時候 類就像是游戲卡(你get到的對象)一樣,它的方法和插口一樣,但是它還寫了這些方法是如何實現的。 於是我們把游戲卡(你get到的對象)插到游戲機的插槽(connection)上,就可以玩游戲啦。 游戲機可不知道游戲卡的具體實現是什么,但是它知道插槽有什么方法,直接調用插槽的方法(con.close)就行,
因為插槽上插着游戲卡,就會調用游戲卡的該方法。