2010-07-03 63 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接口契约中列出的所有方法,然后可以根据需要使用它们。

所以,当一个接口在左侧用于一个赋值时,它意味着只要它实现接口,就可以获得任何对象。当左边使用一个类时,你必须展示该类(或者子类)的一个对象,事实证明这个对象具有更多的限制。

相关问题