接口如何引用没有实现接口的对象?

时间:2017-08-13 10:54:27

标签: java interface

我创建了一个与mysql数据库的连接。以下是我的代码

 package org;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;

public class DatabaseConn {

    public static void main(String[] args) {

        System.out.println("Loading driver...");

        try {
                Class.forName("com.mysql.jdbc.Driver");
                System.out.println("Driver loaded!");
        } catch (ClassNotFoundException e) {
                throw new IllegalStateException("Cannot find the driver in the classpath!", e);
    }

        try {
                String host = "jdbc:mysql://localhost:3306/sys";
                String username = "root";
                String password = "root";

                Connection Con = DriverManager.getConnection(host, username, password);
                Statement stmnt = Con.createStatement();
                String SQL = "SELECT * FROM sys_config";
                ResultSet rs = stmnt.executeQuery( SQL );

                System.out.println("Records:"+rs);


    }   catch (SQLException err) {
                System.out.println(err.getMessage());
    }

    }
}

我对类的接口实现的理解说,接口类型引用实现接口的类的对象。

但是当我调查下面代码中使用的代码片段时。

Connection Con = DriverManager.getConnection(host, username, password);

DriverManager.getConnection(host,username,password)向对象返回一个引用(类型为Connection),但在类DriverManager中没有实现任何接口。任何人都可以清除我的怀疑..?或者我错过了什么?

同样的事情是我无法使用下面的代码片段

Statement SQL = Con.createStatement();

Con.createStatement()应返回对实现Statement接口的对象的引用。但是这个Connection接口是由ConnectionImpl类实现的,其实现如下所示

public class ConnectionImpl
  extends ConnectionPropertiesImpl
  implements Connection {

    public Statement createStatement()
        throws SQLException
      {
        return createStatement(1003, 1007);
      }

      public Statement createStatement(int resultSetType, int resultSetConcurrency)
        throws SQLException
      {
        checkClosed();

        StatementImpl stmt = new StatementImpl(this, this.database);
        stmt.setResultSetType(resultSetType);
        stmt.setResultSetConcurrency(resultSetConcurrency);

        return stmt;
      }

}

3 个答案:

答案 0 :(得分:3)

让我们一点一点地看一下:

  

DriverManager.getConnection(host, username, password)向对象返回引用(类型为Connection)...

这是正确的。

  

...但是在类DriverManager中没有实现任何接口。

这也是正确的。

您的解释缺失的是DriverManager.getConnection()没有返回对DriverManager的引用。它返回对不同类的对象的引用,该类实现了Connection接口。

为了论证,我们说有一个名为MySqlConnection的类:

class MySqlConnection implements Connection {
   ...
}

现在,DriverManager.getConnection()可以返回此类的实例:

class DriverManager {
   public Connection getConnection(...) {
      return new MySqlConnection(...);
   }
}

希望这可以解决问题。

答案 1 :(得分:1)

getConnection和createStatement是factory methods。请注意,该接口是在返回的对象类中实现的。

答案 2 :(得分:1)

只有DriverManagerConnectionStatement等接口在JDK中声明,实现它们的具体类存在于您使用的相应JDBC驱动程序中。例如,在您的情况下,在您的类路径中添加了mysql jdbc驱动程序。因此,驱动程序jar中的这些具体实现知道如何连接到数据库并与之通信。 JDK刚刚以所有供应商类应实现的接口形式定义了规范。这使得java代码独立于数据库和相应驱动程序中的任何更改。