是否可以为接口类型创建对象
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