Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Когда переменная получает тип интерфейса? 
:(
    Опции темы
jah2
Дата 7.5.2013, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 12.4.2013

Репутация: нет
Всего: нет



Предполагаю вопрос из области основ языка: когда переменная получает тип интерфейса?

Например, стандартный способ получения соединения с базой данных
Код

Connection con = DriverManager.getConnection("строка_соединения");

но Connection - это интерфейс, а не класс (по крайней мере, реализацию одноимённого класса в библиотеке-драйвере я не нашёл)
отсюда, собственно, и вопрос, как это всё объяснить
PM MAIL   Вверх
Samotnik
Дата 7.5.2013, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



jah2, а что именно нужно объяснить? 
Стандартная ситуация: переменная суперкласса может ссылаться на объект наследника. В данном случае тип объекта, на который сделана ссылка определяет, какая версия переопределенного метода будет вызвана в рантайме (это в случае с переопределением методов). 

Это сообщение отредактировал(а) Samotnik - 7.5.2013, 23:29
PM MAIL   Вверх
batigoal
Дата 8.5.2013, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Цитата(jah2 @  7.5.2013,  19:50 Найти цитируемый пост)
когда переменная получает тип интерфейса?

Ну а когда собака становится животным? Когда квадрат становится геометрической фигурой?


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Mirkes
Дата 8.5.2013, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 7
Всего: 17



Если речь идет об основах языка, то, насколько я понимаю, интерфейс по большому счету тот-же класс. Наличие двух типов "классов" связано с возможностью множественного наследования - каждый класс имеет только один класс-предок и сколько угодно интерфейсов-предков.
При этом создание классов-интерфейсов происходит на каждом шагу:
Код

new Runnable() {
                public void run() {
                    ...
                }
            }

Так что вопрос не совсем понятен.


--------------------
Mirkes
PM MAIL   Вверх
jah2
Дата 8.5.2013, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 12.4.2013

Репутация: нет
Всего: нет



спасибо за ответы

из-того, что мне удалось на сегодня накопать по этой теме, 
я сделал вывод, что нужно просто принять как должное тот факт, что

если переменная имеет тип интерфейса, то, помимо null, она может хранить ссылку либо на объект класса, реализующего этот интерфейс, либо на  объект класса-наследника этого класса 
(последний считается также реализующим этот интерфейс, так как получает по наследству его элементы)

ну и ещё небольшой ряд закономерностей


у Вязовика это звучит так
http://www.bookmate.com/books/i8lXrblg (ссылка только для примера про кого речь)
Цитата

Итак, если имя интерфейса указано после implements в объявлении класса, то класс
реализует этот интерфейс. Наследники этого класса также реализуют интерфейс, поскольку
им достаются по наследству его элементы.
Если интерфейс A наследуется от интерфейса B, а класс реализует A, то считается, что
интерфейс B также реализуется этим классом по той же причине - все элементы передаются
по наследству в два этапа - сначала интерфейсу A, а затем и классу.
Наконец, если класс C1 наследуется от класса C2, класс C2 реализуется интерфейс A1,
а интерфейс A1 наследуется от интерфейса A2, то класс C1 также реализует интерфейс
A2.
Вышесказанное позволяет утверждать, что переменные типа интерфейс также допустимы.
Они могут иметь значение null или ссылаться на объекты, порожденные от классов,
реализующих этот интерфейс. Поскольку объекты порождаются только от классов, а все
они наследуются от Object, то это означает, что значения типа интерфейс обладают всеми
элементами класса Object.


то есть в приведённом примере, вызов DriverManager.getConnection("строка_соединения") приводит к созданию объекта класса, реализующего интерфейс Connection, при этом явно этот класс не создаётся (в том смысле что он нигде явно не описан, то есть нельзя стандартным образом через new создать его объект)

Это сообщение отредактировал(а) jah2 - 8.5.2013, 17:43
PM MAIL   Вверх
jah2
Дата 8.5.2013, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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)

Цитата

Хотя переменная или выражение могут иметь тип времени компиляции, который является типом интерфейса, но не существует экземпляров интерфейсов. Переменная или выражение, чей тип - это тип интерфейса, может ссылаться на любой объект, если класс объекта реализует (§8.1.4) данный интерфейс.

Пример, иллюстрирующий создание новых объектов и различия между типом переменной и классом объекта:
Код

public interface Colorable {
    void setColor(byte r, byte g, byte b);
}

class Point { int x, y; }

class ColoredPoint extends Point implements Colorable {

    byte r, g, b;


    public void setColor(byte rv, byte gv, byte bv) {
  r = rv; g = gv; b = bv;
    }

}


class Test {
    public static void main(String[] args) {
  Point p = new Point();
  ColoredPoint cp = new ColoredPoint();
  p = cp;
  Colorable c = cp;
    }
}

В этом примере:

- Локальная переменная p метода main класса Test имеет тип Point и первоначально предназначена для ссылки на новый экземпляр класса Point.
- Локальная переменная cp имеет тип ColoredPoint, и первоначально предназначена для ссылки на новый экземпляр класса ColoredPoint.
- Присваивание значения cp переменной p заставляет p содержать ссылку на объект ColoredPoint. Это разрешается, так как ColoredPoint - подкласс Point, поэтому класс ColoredPoint совместим по присваиванию (§5.2) с типом Point. Объект ColoredPoint включает поддержку для всех методов Point. В дополнение к специфическим полям r, g, и b, он содержит и поля класса Point, а именно x и y.
- Типом локальной переменной с является интерфейсный тип Colorable, так что с может содержать ссылку на любой объект, чей класс реализует Colorable; например, она может содержать ссылку на ColoredPoint.
- Заметьте, что выражение вида " new Colorable () " неверно, потому что невозможно создать экземпляр интерфейса, а только класса.


Это сообщение отредактировал(а) jah2 - 8.5.2013, 20:42
PM MAIL   Вверх
Arantir
Дата 8.5.2013, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 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
}
PM   Вверх
jah2
Дата 8.5.2013, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 12.4.2013

Репутация: нет
Всего: нет



Arantir, спасибо, проверю
это всё окончательно проясняет: класс, реализующий интерфейс Connection, всегда явно существует, 
а не создаётся где-то там внутри без возможности стандартного доступа, как я предположил сначала
PM MAIL   Вверх
batigoal
Дата 8.5.2013, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Цитата(jah2 @  8.5.2013,  18:37 Найти цитируемый пост)
при этом явно этот класс не создаётся (в том смысле что он нигде явно не описан, то есть нельзя стандартным образом через new создать его объект)

Почитай про паттерн "фабричный метод" (factory method). Тут просто использован альтернативный способ создания объекта (без явного вызова конструктора). Где-то в недрах getConnection неизбежно будет вызван new - хотя конструктор и может быть, к примеру, private.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0529 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.