2010-07-03 87 views
1
Connection con = DriverManager.getConnection("jdbc:odbc:MyDataSource1"); 

這是一條JDBC編程線。在這一行中,我們正在爲Connection接口創建一個對象。怎麼可能?是否可以爲接口類型創建對象

+0

「怎麼可能」使用一行代碼?把它放在你的應用程序中! – 2010-07-03 12:49:18

+0

Copyedited;如果不正確請回復。 – trashgod 2010-07-03 13:26:28

回答

7

該接口是「con」變量的引用類型。接口的實現來自您爲問題註冊的JDBC驅動程序。 DriverManager返回Connection的驅動程序實現以及java.sql中的所有其他接口類型。

3

分配的右側產生的對象是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?

2

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(); 
+3

這可能應該是: while(true){System.out.println(「Bzzzzzzzzzzzz」); } – 2010-07-03 13:58:40

+1

getInstrument()應該返回一個NOPI工具並且不爲null。否則,您將在某天早上的3時調試NullPointerExceptions。 – 2010-07-03 20:23:27

1

你要明白,一個Java接口是合同一個:實現接口的對象承諾都在界面呈現的東西!

對象能夠做什麼,與這個特定的接口無關,實際上經常出現給定接口有多個可能的候選者,並且調用代碼基本上不關心(或者需要需要保健)哪一個它收到。

在JDBC情況下,您要求提供數據庫連接,DriverManager根據您傳遞的字符串選擇一個並將其返回給您。所有你需要知道的是,你得到的那個具有Connection接口契約中列出的所有方法,然後可以根據需要使用它們。

所以,當一個接口在左側用於一個賦值時,它意味着只要它實現接口,就可以獲得任何對象。當左邊使用一個類時,你必須展示該類(或者子類)的一個對象,事實證明這個對象具有更多的限制。

相關問題