АБОБА. Справочник по программированию на Java Методическое пособие
Скачать 242.41 Kb.
|
Импорт пакетовНи один из основных классов Java не хранится в неименованном пакете, используемом по умолчанию. Все стандартные классы хранятся в каком-либо именованном пакете. Поскольку внутри пакетов классы должны быть полностью определены именем или именами их пакетов, длинное, разделенное точками имя пути пакета каждого используемого класса может оказаться слишком громоздким. Поэтому, чтобы определенные классы или весь пакет можно было сделать видимыми, в Java включен оператор import. После того как класс импортирован, на него можно ссылаться непосредственно, используя только его имя. Оператор import служит только для удобства программистов и не является обязательным с технической точки зрения для создания завершенной Java-программы. Однако если в приложении придется ссылаться на несколько десятков классов, оператор import значительно уменьшит объем вводимого кода. В исходном файле Java-программы операторы import должны следовать непосредственно за оператором package (если таковой имеется) перед любыми определениями классов. Оператор import имеет следующую общую форму: import пакет1[.пакет2].(имя_класса|*); В этой форме пакет1 – имя пакета верхнего уровня, пакет2 – имя подчиненного пакета внутри внешнего пакета, отделенное символом точки (.). Глубина вложенности пакетов практически не ограничена ничем, кроме файловой системы. И, наконец, имя_класса может быть задано либо явно, либо с помощью символа звездочки (*), который указывает компилятору Java о необходимости импорта всего пакета. Следующий фрагмент демонстрирует применение обеих форм оператора: import java.util.Date; import java.io.*; Использование формы с применением символа звездочки может привести к увеличению времени компиляции – особенно при импорте нескольких больших пакетов. Однако использование формы с применением звездочки никак не влияет на производительность системы времени выполнения или на размеры классов. Все стандартные классы, поставляемые с системой Java, хранятся в пакете java. Основные функции языка хранятся в пакете java.lang внутри пакета java. Обычно каждый пакет или класс, который нужно использовать, приходится импортировать. Но поскольку система Java бесполезна без многих функций, определенных в пакете java.lang, компилятор неявно импортирует его для всех программ. Это эквивалентно присутствию следующей строки в каждой из программ: import java.lang.*; При наличии в двух различных пакетах, импортируемых с применением формы со звездочкой, классов с одинаковыми именами компилятор никак на это не отреагирует, если только не будет предпринята попытка использования одного из этих классов. В этом случае возникнет ошибка времени компиляции, и имя класса придется указать явно, задавая его пакет. Полностью определенное имя класса с указанием полной иерархии пакетов можно использовать везде, где можно допускается имя класса. Например, в следующем фрагменте кода присутствует оператор импорта: import java.util.*; class MyDate extends Date { } Этот же пример без оператора import выглядит следующим образом: class MyDate extends java.util.Date { } ИнтерфейсыПрименение ключевого слова interface позволяет полностью абстрагировать интерфейс класса от его реализации. То есть с использованием ключевого слова interface можно задать действия, которые должен выполнять класс, но не то, как именно он должен это делать. Синтаксически интерфейсы аналогичны классам, но не содержат переменных экземпляров, а объявления их методов не содержат тела метода. На практике это означает, что можно объявлять интерфейсы, которые не делают никаких допущений относительно их реализации. Как только интерфейс определен, его может реализовать любое количество классов. Кроме того, один класс может реализовать любое число интерфейсов. Чтобы реализовать интерфейс, класс должен создать полный набор методов, определенных интерфейсом. Однако каждый класс может определять нюансы своей реализации данного интерфейса. Ключевое слово interface позволяет в полной мере использовать концепцию полиморфизма под названием “один интерфейс, несколько методов”. Интерфейсы предназначены для поддержки динамического разрешения методов во время выполнения. Обычно чтобы вызов метода мог выполняться из одного класса в другом, оба класса должны присутствовать во время компиляции, дабы компилятор Java мог проверить совместимость сигнатур методов. Само по себе это требование создает статическую и нерасширяемую среду обработки классов. В такой системе функциональные возможности неизбежно передаются по иерархии классов все выше и выше, в результате чего механизмы будут становиться доступными все большему числу подклассов. Интерфейсы предназначены для предотвращения этой проблемы. Они изолируют определение метода или набора методов от иерархии наследования. Поскольку иерархия интерфейсов не совпадает с иерархией классов, классы, никак не связанные между собой в иерархии классов, могут реализовать один и тот же интерфейс. Именно здесь возможности интерфейсов проявляются наиболее полно. Интерфейсы добавляют большинство функциональных возможностей, требуемых многим приложениям, которым в обычных условиях в языках вроде C++ пришлось бы прибегать к использованию множественного наследования. |