2.2 «Написано однажды – исполняется везде» Если не вдаваться глубоко в историю, то изначально существовала идея создать единое устройство для управления различными техническими устройствами. Именно эта «кроссплатформенность» легла в основу языка Java. Иными словами, код написанный «однажды» выполняется на различных платформах без внесения в него дополнительных изменений (разумеется, все не так просто, но в целом идея именно такая). Достигается это за счет применения виртуальной машины (Java Virtual Machine - JVM), которая, работая на различных аппаратных и программных платформах, интерпретирует и исполняет код. В общем схема работы следующая: 1) Программист пишет исходный код программы и сохраняет его как обычный текстовый файл (или файлы), но с расширением *.java. 2) Компилятор (да, он все-таки есть: java – входит в состав комплекта разработчика JDK), компилирует исходный код в так-называемый байт-код и помещает его в одноименные файлы, но с расширением *.class. 3) Именно *.class файлы интерпретируются и исполняются виртуальной машиной (java – входит в состав JDK и исполняющей среды - JRE) 2.3 Пакеты Особенность современного подхода к разработке ПО – повторное использование компонентов. Создание компонента «с нуля» всегда обходится дороже, чем покупка уже существующего. Кроме того, зачем повторно решать задачу, если вы это делали в предыдущем проекте? И, наконец, зачем заново изобретать колесо, если большинство разработчиков языков программирования предлагают наборы библиотек, содержащие тысячи хорошо протестированных компонентов и готовых для использования, что называется, «из коробки». Комплект разработчика Java (JDK) содержит более 2-х тысяч определений, которые доступны программисту бесплатно (их еще называют интерфейсами прикладного программирования – API). Наиболее доступным для начинающих примером является класс Math – содержащий методы, позволяющие вычислять тригонометрические, логарифмические, экспоненциальные и т.д. функции. Вам не нужно заново создавать и реализовывать алгоритм вычисления синуса – достаточно вызвать метод java.lang.Math.sin(). Аналогично, в JDK есть средства для организации сетевого взаимодействия, работы с файловой системой, аудиоустройствами, взаимодействия с базами данных, организации многопоточных вычислительных процессов и т.д. Также, в каждой организации существует свое хранилище для различных решений, которые можно использовать повторно в различных проектах. Наконец, всегда можно приобрести наборы библиотек «третьей стороны», позволяющие решить какую-нибудь специализированную задачу (если конечно, они удовлетворяют Вашим требованиям). Столкнувшись с таким многообразием классов неизбежно возникает вопрос их организации. Представьте, если все 2к+ определений классов будут находиться в одном «пространстве» или директории – навигация по ним в этом случае будет, мягко говоря, затруднительной. Для того, чтобы логически «организовать» все многообразие API используются пакеты. Каждый пакет объединяет наборы определений, семантически схожих и направленных на решение одной задачи. Например, пакет java.net содержит, определения классов, решающих задачу организации сетевого взаимодействия, javax.swing – создание платформенно независимого графического интерфейса пользователя, java.ion – взаимодействие с файловой системой и т.д. Следующая задача, которую решают пакеты – разрешение конфликтов имен. Для этого рассмотрим просто пример. Слово «Замок», в зависимости от контекста может интерпретироваться как строение, так и как запирающий механизм. Оба эти объекта называются одинаково, но выполняют совершенно разные функции (кроме, пожалуй, обеспечения безопасности). Так вот пакеты создают тот самый контекст, благодаря которому мы можем различить классы с одинаковыми именами – они будут принадлежать разным пакетам. С точки зрения файловой системы, пакет – это директория на жестком диске. Пакеты могут содержать: 1) 2) 3) 4) Вложенные пакеты Классы Интерфейсы Дополнительные файлы ресурсов (файлы настроек, интернационализации, политик прав доступа и т.д.) За счет того, что пакеты могут содержать вложенные пакеты, создается иерархическая система пакетов. Таким образом, пакеты: 1) Позволяют группировать взаимосвязанные классы и интерфейсы в единое целое 2) Способствуют созданию пространств имен, позволяющих избежать конфликтов идентификаторов, относящихся к различным типам 3) Обеспечивают дополнительные средства защиты элементов кода 4) Формируют иерархическую систему И на последок отметим, что классы, поставляющиеся в комплекте разработчика JDK, находятся в одном из двух корневых пакетов – java и javax. Ничто не мешает вам создавать свои пакеты не зависимо от пакетов java или java.