是否可以为接口类型创建对象

时间:2010-07-03 12:47:22

标签: java jdbc interface database-connection driver

Connection con = DriverManager.getConnection("jdbc:odbc:MyDataSource1");

这是一个JDBC编程行。在这一行中,我们正在为Connection接口创建一个对象。怎么可能?

5 个答案:

答案 0 :(得分:7)

接口是“con”变量的引用类型。接口的实现来自您为问题注册的JDBC驱动程序。 DriverManager返回Connection的驱动程序实现以及java.sql中的所有其他接口类型。

答案 1 :(得分:3)

赋值右侧生成的对象是Connection的子类型:实现 Connection接口的Class实例。您不需要知道确切类型是什么,因此您可以使用具有不同连接字符串的相同行并接收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 :(得分: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 :(得分:1)

DriverManager.getConnection()static factory method,它返回实现Connection接口的类的实例。这种方法允许programming to an interface减少依赖性,还讨论了here

答案 4 :(得分:1)

您需要了解Java接口是合同:实现接口的对象承诺在接口中显示所有内容!

该对象能够做什么,与这个特定的接口无关,实际上通常情况下,给定接口有多个可能的候选者,并且调用代码基本上不关心(或需要< / em>照顾它收到的那个。

在JDBC-case中,您要求建立数据库连接,DriverManager根据您传递的字符串选择一个并将其返回给您。所有需要知道的是你得到的那个具有Connection接口合同中列出的所有方法,然后你可以根据需要使用它们。

因此,当在一个赋值的左侧使用接口时,它只意味着只要它实现了接口就可以获得任何对象。当在左侧使用类时,您必须呈现该类(或子类)的对象,该对象已被证明更具限制性。