Как абстрактный метод предопределенного интерфейса, такого как Connection, Statement и т. Д., Выполняет некоторую задачу без тела? - PullRequest
3 голосов
/ 18 октября 2011

В Java есть много предопределенных интерфейсов, таких как ResultSet, Connection, Statement и т. Д. Интерфейс может иметь только абстрактные методы (нереализованные методы). Так почему мы используем там методы, не определяя их сначала. *

например в следующем коде jdbc

public class JDBCSample {

public static void main( String args[]) {

String connectionURL = "jdbc:postgresql://localhost:5432/movies;
user=java;password=samples";`

try {

    Class.forName("org.postgresql.Driver");  


    Connection con = DriverManager.getConnection (connectionURL);


    Statement stmt = con.createStatement();


    ResultSet rs = stmd.executeQuery("select moviename, releasedate from movies");

    while (rs.next())
        {....do something.....}
}catch (SQLException e)
 {e.printStackTrace();}
catch (Exception e) 
{ e.printStackTrace();}}

здесь мы называем абстрактный createStatement() и executeQuery() метод интерфейса Connection и Statement? Если да, то как абстрактный метод (метод без тела) может выполнить какую-то задачу?

Ответы [ 5 ]

2 голосов
/ 18 октября 2011

Звоните:

System.out.println(con.getClass());

и обратите внимание, что фактический объект не относится к типу Connection. Это называется полиморфизм . Проще говоря, DriverManager.getConnection() возвращает что-то , которое реализует Connection. Вы вызываете методы для этого что-то . Это является преимуществом полиморфизма - драйвер JDBC может позже принять решение об изменении что-то , и, пока он реализует Connection, ваш код может не заботиться.

Простой пример:

List<String> list = new ArrayList<String>();
list.size();  //calling abstract method?!? No!

В приведенном выше примере мы на самом деле называем ArrayList.size().

1 голос
/ 18 октября 2011

Когда вы вызываете DriverManager.getConnection, он возвращает экземпляр org.postgresql.jdbc4.Jdbc4Connection, который является классом, реализующим интерфейс java.sql.Connection.

Jdbc4Connection имеет тело метода для createStatement, которое возвращает экземпляр org.postgresql.jdbc4.Jdbc4Statement, который является классом, реализующим интерфейс java.sql.Statement.

Jdbc4Statement имеет методтело для executeQuery, которое возвращает экземпляр org.postgresql.jdbc4.Jdbc4ResultSet, который является классом, который реализует интерфейс java.sql.ResultSet.

0 голосов
/ 18 октября 2011

Конкретная реализация используемого вами интерфейса, в данном случае DriverManager, возвращает конкретный класс, реализующий абстрактные методы интерфейса.

Как вы указали, только интерфейс объявляет методы, которые должна обеспечить конкретная реализация.Фактический класс реализации предоставляет тела этих методов.

Класс DriverManager и его пакет предоставляют недостающие части, возвращая конкретные классы, которые имеют полные тела методов.Однако вы взаимодействуете с этими классами на стороне вашего клиентского кода только через интерфейс.Детали реализации конкретных классов эффективно скрыты от глаз.

0 голосов
/ 18 октября 2011

Когда вы на самом деле вызываете что-то, у вас есть ссылка на экземпляр конкретного подкласса, который предоставляет все тела.Дело в том, что вам (как клиенту) не нужно заботиться о том, что это за реализация - она ​​предоставляется вам DriverManager (и т. Д.).Все, о чем вам нужно заботиться, это то, что это «что-то, что реализует данный интерфейс» или «то, что расширяет абстрактный класс».

Более простой пример - использование типов коллекций:

List<String> list = new ArrayList<String>();
doSomething(list);

...

public static void doSomething(List<String> list) {
    // Act on the list
}

Здесь doSomething не нужно знать, что мы использовали ArrayList<E> - он может работать на любом виде List<String> ... но, как вы можете видеть, как это происходитмы создаем экземпляр ArrayList<E>, который является конкретным классом.

0 голосов
/ 18 октября 2011

Вы вызываете методы классов, которые реализуют эти методы.

DriverManager.getConnection возвращает конкретную реализацию интерфейса Connection, и вам не нужно знать, какой именно класс возвращается. Это основная идея иметь интерфейсы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...