![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| jah2 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 12.4.2013 Репутация: нет Всего: нет |
Предполагаю вопрос из области основ языка: когда переменная получает тип интерфейса?
Например, стандартный способ получения соединения с базой данных
но Connection - это интерфейс, а не класс (по крайней мере, реализацию одноимённого класса в библиотеке-драйвере я не нашёл) отсюда, собственно, и вопрос, как это всё объяснить |
|||
|
||||
| Samotnik |
|
|||
![]() Super star ! ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 7192 Регистрация: 4.11.2006 Где: Минск City Репутация: 8 Всего: 191 |
jah2, а что именно нужно объяснить?
Стандартная ситуация: переменная суперкласса может ссылаться на объект наследника. В данном случае тип объекта, на который сделана ссылка определяет, какая версия переопределенного метода будет вызвана в рантайме (это в случае с переопределением методов). Это сообщение отредактировал(а) Samotnik - 7.5.2013, 23:29 |
|||
|
||||
| batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 24 Всего: 151 |
Ну а когда собака становится животным? Когда квадрат становится геометрической фигурой? -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
| Mirkes |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 586 Регистрация: 18.8.2011 Где: Красноярск Репутация: 7 Всего: 17 |
Если речь идет об основах языка, то, насколько я понимаю, интерфейс по большому счету тот-же класс. Наличие двух типов "классов" связано с возможностью множественного наследования - каждый класс имеет только один класс-предок и сколько угодно интерфейсов-предков.
При этом создание классов-интерфейсов происходит на каждом шагу:
Так что вопрос не совсем понятен. -------------------- Mirkes |
|||
|
||||
| jah2 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 12.4.2013 Репутация: нет Всего: нет |
спасибо за ответы
из-того, что мне удалось на сегодня накопать по этой теме, я сделал вывод, что нужно просто принять как должное тот факт, что если переменная имеет тип интерфейса, то, помимо null, она может хранить ссылку либо на объект класса, реализующего этот интерфейс, либо на объект класса-наследника этого класса (последний считается также реализующим этот интерфейс, так как получает по наследству его элементы) ну и ещё небольшой ряд закономерностей у Вязовика это звучит так http://www.bookmate.com/books/i8lXrblg (ссылка только для примера про кого речь)
то есть в приведённом примере, вызов DriverManager.getConnection("строка_соединения") приводит к созданию объекта класса, реализующего интерфейс Connection, при этом явно этот класс не создаётся (в том смысле что он нигде явно не описан, то есть нельзя стандартным образом через new создать его объект) Это сообщение отредактировал(а) jah2 - 8.5.2013, 17:43 |
|||
|
||||
| jah2 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 12.4.2013 Репутация: нет Всего: нет |
вот здесь ещё есть пояснение по этому поводу
http://www.helloworld.ru/texts/comp/lang/j...java3/4-doc.htm (http://docs.oracle.com/javase/specs/jls/se...html#jls-4.12.6)
Это сообщение отредактировал(а) jah2 - 8.5.2013, 20:42 |
||||
|
|||||
| Arantir |
|
|||
|
Рыбак без удочки ![]() ![]() Профиль Группа: Участник Сообщений: 960 Регистрация: 18.11.2012 Репутация: 1 Всего: 55 |
jah2, интерфейс не может иметь экземпляра. Должен существовать класс, явно реализующий этот интерфейс.
DriverManager.getConnection(String) возвращает экземпляр некого класса, который реализует интерфейс Connection. Что именно это за класс вы можете легко проверить с помощью метода getClass() на объекте типа Connection. Класс зависит от используемого для подключения к базе софта. Например, com.mchange.v2.c3p0.impl.NewProxyConnection. -------------------- interface Жопа { // ATTENTION: has to be implemented by every class of the project for proper project work } |
|||
|
||||
| jah2 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 12.4.2013 Репутация: нет Всего: нет |
Arantir, спасибо, проверю
это всё окончательно проясняет: класс, реализующий интерфейс Connection, всегда явно существует, а не создаётся где-то там внутри без возможности стандартного доступа, как я предположил сначала |
|||
|
||||
| batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 24 Всего: 151 |
Почитай про паттерн "фабричный метод" (factory method). Тут просто использован альтернативный способ создания объекта (без явного вызова конструктора). Где-то в недрах getConnection неизбежно будет вызван new - хотя конструктор и может быть, к примеру, private. -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |