如何在这个java程序中实例化此接口?

时间:2013-06-16 19:24:23

标签: java interface

package jdbc;

import java.sql.*;

public class Mango {

    public static void main(String[] args) throws Exception {
        Class.forName("oracle.jdbc.driver.OracleDriver");   
        Connection con = DriverManager.getConnection("jdbc:oracle:thin:@66.66.66.128:1521:xe","SYSTEM","matrix");
        Statement comm = con.createStatement();
        comm.executeQuery("insert into a values('a',1)");
        ResultSet res = comm.executeQuery("SELECT * FROM A");
        comm.executeQuery("insert into a values('a',1)");
        while(res.next()) {
            System.out.println(res.getString(1) + " " + res.getInt(2));
        }
        System.out.println("con class is "+ con.getClass());
        System.out.println("comm class is "+ comm.getClass());
        System.out.println("res class is "+ res.getClass());
    }

}

输出:

con class is class oracle.jdbc.driver.T4CConnection
comm class is class oracle.jdbc.driver.T4CStatement
res class is class oracle.jdbc.driver.OracleResultSetImpl

T4CConnection实现接口Connection T4CStatement实现接口Statement OracleResultSetImpl实现了接口ResultSet

如果连接,语句和结果集是接口,我怎么能调用它们?我读here我永远无法实例化一个界面,但请看这个下面的程序......

2 个答案:

答案 0 :(得分:2)

接口本身实例化。相反,实现这些接口的类是。

示例代码:

import java.util.ArrayList;
import java.util.List;


public class Interfaces {

/**
 * @param args
 */
public static void main(String[] args) {
    List<String> list = new ArrayList<String>();
    System.out.println("list class is " + list.getClass());
}

}

输出:

  

list类是java.util.ArrayList类

请注意,list的课程为ArrayList,而非List。这表明接口没有像已经声明的那样实例化。

答案 1 :(得分:2)

从方法getConnection()createStatement()等返回的对象是接口的实例。这意味着在接口中实现方法,并在使用适当的类型和instanceof时返回true。

所有接口都是100%抽象的,这意味着这些方法中没有代码,只是方法签名。您的类或其超类必须实现接口中的所有方法。这是Java的多重继承解决方案,以免混淆调用哪个方法实现。它允许一个对象同时表现为多种类型,但只允许一个直接超类。