русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Импорт выражения


Дата добавления: 2015-06-12; просмотров: 734; Нарушение авторских прав


Как будет рассмотрено ниже, область видимости объявления типа -пакет, в котором он располагается. Это означает, что внутри данного паке­та допускается обращение к типу по его простому имени. Из всех других пакетов необходимо обращаться по составному имени, то есть полное имя пакета плюс простое имя типа, разделенные точкой. Поскольку пакеты могут иметь довольно длинные имена (например, дополнительный пакет в составе JDK1.2 называется com.sun.image.codec.jpeg), а тип может

многократно использоваться в модуле компиляции, такое ограничение может привести к усложнению исходного кода и сложностям в разработке. Для решения этой проблемы вводятся import-выражения, позволя­ющие импортировать типы в модуль компиляции и далее обращаться к ним по простым именам. Существует два вида таких выражений:

• импорт одного типа;

• импорт пакета.

Важно подчеркнуть, что импортирующие выражения являются, по сути, подсказкой компилятора. Он пользуется ими, чтобы для каждого простого имени типа из другого пакета получить его полное имя, которое и попадает в компилированный код. Это означает, что импортирующих выражений может быть очень много, включая и те, что импортируют не­используемые пакеты и типы, но это никак не отразится, ни на размере, ни на качестве бинарного кода. Также безразлично, обращаться к типу по его полному имени, или включить его в импортирующее выражение и об­ращаться по простому имени - результат будет один и тот же.

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

Выражение, импортирующее один тип, записываются с помощью ключевого слова import и полного имени типа. Например:



import java.net.URL;

Такое выражение означает, что в дальнейшем в этом модуле компиля­ции простое имя URLбудет обозначать одноименный класс из пакета java.net. Попытка импортировать тип, недоступный на момент компиля­ции, вызовет ошибку. Если один и тот же тип импортируется несколько раз,то это не создает ошибки, а дублированные выражения игнорируются. Если же импортируются типы с одинаковыми простыми именами из раз­ных пакетов, то такая ситуация породит ошибку компиляции.

Выражение, импортирующее пакет, включает в себя полное имя пакетаследующим образом.

import java.awt.*;

Это выражение делает доступными все типы, находящиеся в пакете java.awt,по их простому имени. Попытка импортировать пакет, недоступный на момент компиляции, вызовет ошибку Импортирование одного па­кета многократно не создает ошибки, дублированные выражения игнори­руются. Обратите внимание, что импортировать вложенный пакет нельзя.

Например:

// пример вызовет ошибку компиляции import java.awt.image;

Создается впечатление, что теперь мы можем обращаться к типам па­кета java.awt.image по упрощенному имени, например, image. ImageFilter. На самом деле пример вызовет ошибку компиляции, так как данное вы­ражение расценивается как импорт типа, а в пакете java.awt отсутствует тип image.

Аналогично, выражение

import java.awt.*;

не делает более доступными классы пакета java.awt.image, их необходи­мо импортировать отдельно.

Поскольку пакет java.lang содержит типы, без которых невоз­можно создать ни одну программу, он неявным образом импортирует­ся в каждый модуль компиляции. Таким образом, все типы из этого пакета доступны по их простым именам без каких-либо дополнитель­ных усилий. Попытка импортировать данный пакет еще раз будет проигнорирована.

Допускается одновременно импортировать пакет и какой-нибудь тип из него:

import java.awt.*; Import java.awt.Point;

Может возникнуть вопрос, как же лучше поступать - импортировать типы по отдельности или весь пакет сразу? Есть ли какая-нибудь разница в этих подходах?

Разница заключается в алгоритме работы компилятора, который приводит каждое простое имя к полному. Он состоит из трех шагов:

• сначала просматриваются выражения, импортирующие типы;

• затем другие типы, объявленные в текущем пакете, в том числе в текущем модуле компиляции;

• наконец, просматриваются выражения, импортирующие пакеты.

Таким образом, если тип явно импортирован, то невозможно ни объ­явление нового типа с таким же именем, ни доступ по простому имени к одноименному типу в текущем пакете.

Например:

// пример вызовет ошибку компиляции package my_geom;

import java.awt.Point;

class Point {}

Этот модуль вызовет ошибку компиляции, так как имя Point в объявлении высшего типа будет рассматриваться как обращение к импортированному классу java.awt.Point, а его переопределять, конечно, нельзя.

Если в пакете объявлен тип:

package my_geom;

class Point { }

то в другом модуле компиляции: package my_geom; import java.awt.Point;

class Line {

void main() {

System.out.prlntln(new PolntO);} }

складывается неопределенная ситуация, какой из классов, my_geom.Point или java.awt.Point, будет использоваться при создании объекта? Результа­там будет:

java.awt.Point[x=0,y=0]

В соответствии с правилами, имя Point было трактовано на основе импорта типа. К классу текущего пакета все еще можно обращаться по полному имени: my_geom.Point. Если бы рассматривался безымянный пакет, то обратиться к такому "перекрытому" типу было бы уже невозможно,что является дополнительным аргументом к рекомендации располагать важные программы в именованных пакетах.

Теперь рассмотрим импорт пакета. Его еще называют "импорт по требованию", подразумевая, что никакой "загрузки" всех типов импорти­рованного пакета сразу при указании импортирующего выражения не происходит, их полные имена подставляются по мере использования про­стых имен в коде. Можно импортировать пакет и задействовать только один тип (или даже ни одного) из него.

Изменим рассмотренный выше пример:

package my_geom;

import Java.awt.*;

class Line { void main() {

System.out.println{newPolnt()); System.out.println(newRectangle{)); } }

Теперь результатом будет:

my_geom.Point@92d342 java.awt.Rectangle[x=0,y=0,width=0,height=0]

Тип Point нашелся в текущем пакете, поэтому компилятору не при­шлось выполнять поиск по пакету Java.awt. Второй объект порождается от класса Rectangle, которого не существует в текущем пакете, зато он обнаруживается в java.avtft.

Также корректен теперь пример:

package my_geom;

import Java.awt.*;

class Point { }

Таким образом, импорт пакета не препятствует объявлению новых типов или обращению к существующим типам текущего пакета по про­стым именам. Если все же нужно работать именно с внешними типами, то можно воспользоваться импортом типа, или обращаться к ним по полным именам. Кроме того, считается, что импорт конкретных типов помогает при прочтении кода сразу понять, какие внешние классы и интерфейсы

используются в этом модуле компиляции. Однако полностью полагаться на такое соображение не стоит, так как возможны случаи, когда импорти­рованные типы не используются и, напротив, в коде стоит обращение к другим типам по полному имени.



<== предыдущая лекция | следующая лекция ==>
Объявление пакета | Объявление верхнего уровня


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 2.346 сек.