Connection con = DriverManager.getConnection("jdbc:odbc:MyDataSource1");
這是一條JDBC編程線。在這一行中,我們正在爲Connection
接口創建一個對象。怎麼可能?是否可以爲接口類型創建對象
Connection con = DriverManager.getConnection("jdbc:odbc:MyDataSource1");
這是一條JDBC編程線。在這一行中,我們正在爲Connection
接口創建一個對象。怎麼可能?是否可以爲接口類型創建對象
該接口是「con」變量的引用類型。接口的實現來自您爲問題註冊的JDBC驅動程序。 DriverManager返回Connection的驅動程序實現以及java.sql中的所有其他接口類型。
分配的右側產生的對象是Connection的子類型:實現 Connection的類的實例。您不需要知道確切類型是什麼,因此您可以使用具有不同連接字符串的同一行並接收MySqlConnection,DB2Connection,OracleConnection或WhatHaveYouConnection實例,該實例可以正確處理後續的數據庫調用通過con變量。
參見,例如:
What does it mean to "program to an interface"?
What exactly is "interface based programming"?
What does "program to interfaces, not implementations" mean?
DriverManager.getConnection()
是static factory method返回一個實現Connection
接口的類的一個實例。這種方法允許programming to an interface降低依賴性,也討論了here。
DriverManager.getConnection("jdbc:odbc:MyDataSource1");
以某種方式創建一個實現Connection接口的對象。
只要返回的對象是Connection
類型,就可以通過類型爲Connection
的變量保存對其的引用。只要它是一個Connection
- 即返回的對象實現Connection
接口,則不需要關心實際對象。
它的原理與例如
public interface Instrument {
public void play();
}
public class Vuvuzela implements Instrument {
public void play() {
System.out.println("Bzzzzzzzzzzzzzz");
}
...
public static Instrument getInstrument(String name) {
if("Vuvuzela".equals(name)) {
return new Vuvuzela();
}
return null;
}
...
//get an instrument, we don't care what the actual object
//is as long as it is an Instrument.
//in this case the instrument variable will "point" to n
//Vuvuzela object but we don't need to care about that
Instrument instrument = getInstrument("Vuvuzela");
intrument.play();
這可能應該是: while(true){System.out.println(「Bzzzzzzzzzzzz」); } – 2010-07-03 13:58:40
getInstrument()應該返回一個NOPI工具並且不爲null。否則,您將在某天早上的3時調試NullPointerExceptions。 – 2010-07-03 20:23:27
你要明白,一個Java接口是合同一個:實現接口的對象承諾都在界面呈現的東西!
對象能夠做什麼,與這個特定的接口無關,實際上經常出現給定接口有多個可能的候選者,並且調用代碼基本上不關心(或者需要需要保健)哪一個它收到。
在JDBC情況下,您要求提供數據庫連接,DriverManager根據您傳遞的字符串選擇一個並將其返回給您。所有你需要知道的是,你得到的那個具有Connection接口契約中列出的所有方法,然後可以根據需要使用它們。
所以,當一個接口在左側用於一個賦值時,它意味着只要它實現接口,就可以獲得任何對象。當左邊使用一個類時,你必須展示該類(或者子類)的一個對象,事實證明這個對象具有更多的限制。
「怎麼可能」使用一行代碼?把它放在你的應用程序中! – 2010-07-03 12:49:18
Copyedited;如果不正確請回復。 – trashgod 2010-07-03 13:26:28