Java J2SE接口规范和这些接口的实现

Java J2SE接口规范和这些接口的实现,java,interface,java-7,Java,Interface,Java 7,出于某些原因,我查看了rt.jar,在那里我看到了一些包,比如java.sql.*等等 在我们编写的典型jdbc程序中(例如,对于连接类): 根据文档,java.sql.Connection是接口,不是具体实现,java.sql.Connection在rt.jar中 当我们编写jdbc程序时,我们需要jdbc驱动程序,从我所读到的jdbc驱动程序实现接口(例如java.sql.Connection) 因此,当我们在典型的java程序中编写时:(并加载jdbc驱动程序) -->java.sql.C

出于某些原因,我查看了rt.jar,在那里我看到了一些包,比如java.sql.*等等

在我们编写的典型jdbc程序中(例如,对于连接类):

根据文档,java.sql.Connection是接口,不是具体实现,java.sql.Connection在rt.jar中

当我们编写jdbc程序时,我们需要jdbc驱动程序,从我所读到的jdbc驱动程序实现接口(例如java.sql.Connection)

因此,当我们在典型的java程序中编写时:(并加载jdbc驱动程序)

-->java.sql.Connection是来自rt.jar还是来自驱动程序类

据我猜测,在本例中,java.sql.Connection必须来自rt.jar(作为接口),而实际实现来自驱动程序类

如果我的假设是正确的,通常我们需要包括具有接口定义的jar,以便包括导入

例如,考虑这种情况:

package com.vipin.myinterface;

public interface Interface1 {
      public void print();
}
如果我们将上述接口打包为interface1.jar

假设Concrete1.java实现此接口:

package com.vipin.concrete1;
    public class Concrete1 implements Interface1 {

         public void print () {
               //code
         }
   }
这个包在jar-->concrete1.jar中


现在,假设我正在编写一个使用print()方法的应用程序,那么我是否需要同时包含这两个jar?

对于
java.sql.Connection
来说,驱动程序为这个接口和其他接口提供实现类,比如
java.sql.Statement
java.sql.ResultSet
,等等。将接口绑定到适当的类实现的所有魔力都发生在方法中,该方法调用内部方法
私有静态连接getConnection(字符串url,java.util.Properties info,class caller)抛出SQLException
,该方法将初始化
java.sql.Connection
的适当实例

当然,您可以在代码中使用类似的方法,使用反射来:

  • 找到接口的正确实现
  • 如果有正确的实现,请创建此类的实例
  • 初始化并运行后返回此类的实例
  • 如果找不到该类或该类存在任何初始化问题,则引发适当的异常

请不要认为仅仅创建一个包含接口的jar和另一个包含此接口的实现类的jar会自动为您连接起来,这不会发生。

@bayou.io为什么不写一个答案?@Würgspaß-coz我很懒?:)@或者可能是因为你不能对这个问题给出正确的解释。@Würgspaß我没有看到这样的正确解释,事实上我只看到两个问题:这是怎么做到的?我能像看上去那样轻松地完成吗?@bayou.io我不是这么说的。你可以知道某些东西是如何工作的,但在向其他人解释这一点时可能会有问题。这并不会让你变得愚蠢,只是很难表达自己:)实际上你也可以调用DriverManager#getDriver,然后调用Driver#connect,因此如果你必须重新连接,你已经有了正确的实现。另外,您可以说每个驱动程序实现都有一个方法acceptsURL(…),因此,DriverManager只需询问每个实现并获取一个接受url的实现。@nyamiouthegaleanstrope我的观点是:您不能仅仅创建一个接口和一个实现,然后期望Java为您加载实现并动态初始化您的接口。您必须以某种方式执行此操作,
Driver#getConnection
也不例外。
package com.vipin.myinterface;

public interface Interface1 {
      public void print();
}
package com.vipin.concrete1;
    public class Concrete1 implements Interface1 {

         public void print () {
               //code
         }
   }