当前位置: 首页 > 知识库问答 >
问题:

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

龚博涛
2023-03-14
 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);

GetConnection(host,username,password)返回对对象的引用(类型为Connection),但DriverManager类中没有实现接口。谁能澄清我的这个疑问..?还是我漏掉了什么?

下面的代码段不能得到相同的东西

Statement SQL = Con.createStatement();

createStatement()应该返回对实现语句接口的对象的引用。但是这个连接接口是由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;
      }

}

共有1个答案

东深
2023-03-14

让我们一点一点来看看:

DriverManager.GetConnection(主机,用户名,密码)返回对对象得引用(类型为Connection)...

这是正确的。

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

这也是正确的。

您的解释缺少的是DriverManager.getConnection()没有返回对DriverManager的引用。它返回对另一个类的对象的引用,这个类确实实现了connection接口。

为了便于论证,假设有一个名为mysqlconnection的类:

class MySqlConnection implements Connection {
   ...
}

现在,DriverManager.getConnection()可以很好地返回该类的实例:

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

希望这能把事情弄清楚。

 类似资料:
  • 问题内容: 有没有为接口方法创建默认实现的首选方法或样式?假设我有一个常用的接口,在90%的情况下,我想要的功能是相同的。 我的第一个直觉是用静态方法创建一个具体的类。然后,当我想要默认功能时,可以将功能委托给静态方法。 这是一个简单的示例: 接口 方法的具体实现 使用默认功能的具体实现 这里有更好的方法吗? 编辑 在看到了一些建议的解决方案之后,我认为我应该更加清楚自己的意图。本质上,我正在尝试

  • 我正在使用GraphQL工具来构建一个GraphQL模式,本质上我有这个结构 我有以下解析器 我让模式可执行 可选参数inheritResolversFromInterfaces:true应该允许我根据apollo graphql工具文档(链接)将公民身份解析程序从继承到。这样,当查询作者时,“示例公民身份”字符串将出现。 然而它没有,查询返回

  • 问题内容: 给定以下代码,如何遍历ProfileCollection类型的对象? 问题答案: Iterable是通用接口。您可能遇到的问题(实际上并没有说出您遇到的问题,如果有的话)是,如果使用通用接口/类而不指定类型实参,则可以擦除不相关的通用类型在课堂上。 因此,我至少将其更改为: 这应该工作: 在Iterable上没有type参数的情况下,迭代器可以简化为Object类型,因此只有这样才能起

  • 我有一个叫做InputInterface的接口,它有一些get方法。我还有一个复杂的gui类,它实现了InputInterface,现在因为它太复杂了,无法序列化整个类,而且它扩展并实现了更多的接口,所以我想创建一个类似于模拟对象的东西,它会创建一个类似于我的复杂类目前给出的答案的副本。 我想创建一个实现该接口的类,它将保存这些值,但后来我意识到这应该是EasyMock或其他模拟库的标准过程?这是

  • 问题内容: 我有一个定义方法的接口。我有一个 实现 此接口的结构。在其中,我已经从该接口实现了方法,并且还定义了其他方法。 例如: 在操场上:https : //play.golang.org/p/B1GgoNToNl_l 在此,WagTail()不是Animal接口的一部分,但属于Dog结构。运行此代码会出现错误 dog.WagTail未定义(动物类型没有字段或方法WagTail)。 有没有一种

  • 我读过很多解释接口和抽象类之间差异的文章;这些帖子特别有用:接口和抽象类之间有什么区别?接口与抽象类(通用面向对象);然而,我找不到任何具体解决我问题的答案。 上下文:今天在课堂上,我们编写了一个接口和两个实现接口的类: 我知道这是可能的,因为它有效;我的问题是它为什么有效?我知道子类与其超类有ISA关系,但接口根本不是类,那么继承仍然适用于它们吗?实现多个接口的类是否与这些接口有ISA关系? 这