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

时间:2015-05-29 16:00:31

标签: java interface java-7

由于某些原因,我正在查看rt.jar,在那里我看到了一些像java.sql。*等软件包。

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

final Spinner spinner_year= (Spinner)findViewById(R.id.spinner_year);

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

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

所以当我们在典型的java程序中编写:(并加载jdbc驱动程序)

import java.sql.Connection;

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

根据我的猜测,在这种情况下,java.sql.Connection必须来自rt.jar(作为接口),实际的实现来自驱动程序类。

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

例如,考虑这种情况:

import java.sql.Connection;

如果我们将上面的接口打包为interface1.jar。

假设Concrete1.java实现了这个接口:

package com.vipin.myinterface;

public interface Interface1 {
      public void print();
}

这包装在罐子里 - > concrete1.jar。

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

1 个答案:

答案 0 :(得分:2)

java.sql.Connection的情况是驱动程序为此和其他接口(如java.sql.Statementjava.sql.ResultSet和on)提供实现类。将接口绑定到正确的类实现的所有 magic 都发生在方法DriverManager#getConnection中,该方法调用内部方法private static Connection getConnection(String url, java.util.Properties info, Class<?> caller) throws SQLException,该方法将初始化{{1}的正确实例}。

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

  • 找到正确的接口实现
  • 如果有正确的实现,请创建此类的实例。
  • 初始化并运行后返回此类的实例。
  • 如果无法找到类或者有任何初始化问题,请抛出正确的异常。

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