Содержание | Предыдущий | Следующий | Индекс Спецификация языка Java
Третий Выпуск


ГЛАВА 1

Введение


Язык программирования Java является параллельным, основанным на классе, объектно-ориентированным языком общего назначения. Это разрабатывается, чтобы быть достаточно простым, что много программистов могут достигнуть беглости на языке. Язык программирования Java связывается с C и C++, но организуется скорее по-другому со многими аспектами C и опущенного C++ и несколько идей с других включенных языков. Это предназначается, чтобы быть производственным языком, не языком исследования, и таким образом, как К. А. Р. Хоар предложил в своей классической статье на проекте языка, проект избежал включая новые и непротестированные функции.

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

Язык программирования Java является относительно высокоуровневым языком в этом, детали машинного представления не доступны через язык. Это включает автоматическое управление хранением, обычно используя сборщик "мусора", чтобы избежать проблем безопасности явного освобождения (как в К free или C++ 's delete). Высокоэффективный собрал "мусор", реализации могли ограничить паузы к программированию систем поддержки и приложениям реального времени. Язык не включает опасных конструкций, таких как доступы массива без индексной проверки, так как такие опасные конструкции заставили бы программу вести себя неуказанным способом.

Язык программирования Java обычно компилируется в bytecoded набор команд и двоичный формат, определенный в Спецификации виртуальной машины Java, Второй Выпуск (Аддисон-Уэсли, 1999).

Эта спецификация организуется следующим образом:

Глава 2 описывает грамматики и нотацию, используемую, чтобы представить лексические и синтаксические грамматики для языка.

Глава 3 описывает лексическую структуру языка программирования Java, который основан на C и C++. Язык пишется в наборе символов Unicode. Это поддерживает запись символов Unicode на системах та поддержка только ASCII.

Глава 4 описывает типы, значения, и переменные. Типы подразделяются на типы примитивов и ссылочные типы.

Типы примитивов определяются, чтобы быть тем же самым на всех машинах и во всех реализациях, и являются различными размерами two's-дополнительных целых чисел, единственных - и стандарт IEEE 754 двойной точности числа с плавающей точкой, a boolean введите, и символ Unicode char ввести. Значения типов примитивов не совместно используют состояние.

Ссылочные типы являются типами классов, интерфейсными типами, и типами массива. Ссылочные типы реализуются динамически создаваемыми объектами, которые являются или экземплярами классов или массивами. Могут существовать много ссылок на каждый объект. Все объекты (включая массивы) поддерживают методы класса Object, который является (единственным) корнем иерархии классов. Предопределенный String класс поддерживает символьные строки Unicode. Классы существуют для того, чтобы обернуть примитивные значения в объектах. Во многих случаях обертывание и разворачивание выполняются автоматически компилятором (когда, обертывание вызывают, упаковывая, и разворачивание вызывают, распаковывая). Класс и интерфейсные объявления могут быть универсальными, то есть, они могут быть параметризованы другими ссылочными типами. Такие объявления могут тогда быть вызваны с параметрами определенного типа.

Переменные являются введенными местами хранения. Переменная типа примитива содержит значение того точного типа примитива. Переменная типа класса может содержать нулевую ссылку или ссылку на объект, тип которого то, что тип класса или любой подкласс того типа класса. Переменная интерфейсного типа может содержать нулевую ссылку или ссылку на экземпляр любого класса, который реализует интерфейс. Переменная типа массива может содержать нулевую ссылку или ссылку на массив. Переменная типа класса Object может содержать нулевую ссылку или ссылку на любой объект, ли экземпляр класса или массив.

Глава 5 описывает преобразования и числовые продвижения. Преобразования изменяют тип времени компиляции и, иногда, значение выражения. Эти преобразования включают упаковку и распаковывание преобразований между типами примитивов и ссылочными типами. Числовые продвижения используются, чтобы преобразовать операнды числового оператора к общему типу, где работа может быть выполнена. На языке нет никаких лазеек; набирает ссылочные типы, проверяются во время выполнения, чтобы гарантировать безопасность типов.

Глава 6 описывает объявления и имена, и как определить, какое среднее значение имен (обозначают). Язык не требует, чтобы типы или их элементы были объявлены прежде, чем они будут использоваться. Порядок объявления является существенным только для локальных переменных, локальных классов, и порядка инициализаторов полей в классе или интерфейсе.

Язык программирования Java обеспечивает управление контекстом имен и поддерживает ограничения на внешний доступ к элементам пакетов, классов, и интерфейсов. Это помогает в записи больших программ, отличая реализацию типа от его пользователей и тех, кто расширяет это. Рекомендуемые соглашения о присвоении имен, которые делают для большего количества читаемых программ, описываются здесь.

Глава 7 описывает структуру программы, которая организуется в пакеты, подобные модулям Modula. Элементы пакета являются классами, интерфейсами, и подпакетами. Пакеты делятся на единицы компиляции. Единицы компиляции содержат описания типа и могут импортировать типы из других пакетов, чтобы дать им краткие названия. У пакетов есть имена в иерархическом пространстве имен, и система имени Интернет-домена может обычно использоваться, чтобы сформировать уникальные имена пакета.

Глава 8 описывает классы. Элементы классов являются классами, интерфейсами, поля (переменные) и методы. Переменные класса существуют однажды на класс. Методы класса работают независимо от конкретной цели. Переменные экземпляра динамически создаются в объектах, которые являются экземплярами классов. Методы экземпляра вызываются на экземпляры классов; такие экземпляры становятся текущим объектом this во время их выполнения, поддерживая стиль объектно-ориентированного программирования.

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

Классы поддерживают параллельное программирование с synchronized методы. Методы объявляют проверенные исключения, которые могут явиться результатом их выполнения, которое позволяет времени компиляции, проверяя гарантировать, что обрабатываются исключительные условия. Объекты могут объявить a finalize метод, который будет вызван перед объектами, отбрасывается сборщиком "мусора", позволяя объекты очистить их состояние.

Для простоты у языка нет ни объявления "заголовки", отдельные от реализации класса, ни отдельного типа и иерархий классов.

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

Глава 9 описывает интерфейсные типы, которые объявляют ряд абстрактных методов, типов элемента, и констант. Классы, которые иначе не связаны, могут реализовать тот же самый интерфейсный тип. Переменная интерфейсного типа может содержать ссылку на любой объект, который реализует интерфейс. Многократное интерфейсное наследование поддерживается.

Типы аннотации специализируются интерфейсы, используемые, чтобы аннотировать объявления. Таким аннотациям не разрешают влиять на семантику программ в языке программирования Java всегда. Однако, они обеспечивают полезный ввод для различных инструментов.

Глава 10 описывает массивы. Доступы массива включают проверку границ. Массивы динамически создаются объекты и могут быть присвоены переменным типа Object. Язык поддерживает массивы массивов, а не многомерных массивов.

Глава 11 описывает исключения, которые невозобновляются и полностью интегрированные с семантикой языка и механизмами параллелизма. Есть три вида исключений: проверенные исключения, исключения на этапе выполнения, и ошибки. Компилятор гарантирует, что проверенные исключения должным образом обрабатываются, требуя, чтобы метод или конструктор могли привести к проверенному исключению, только если метод или конструктор объявляют это. Это обеспечивает время компиляции, проверяя, что обработчики исключений существуют, и помогает программированию в большом. Большинство определяемых пользователем исключений должно быть проверенными исключениями. Недопустимые операции в программе, обнаруженной виртуальной машиной Java, приводят к исключениям на этапе выполнения, такой как NullPointerException. Ошибки следуют из отказов, обнаруженных виртуальной машиной, такой как OutOfMemoryError. Самые простые программы не пытаются обработать ошибки.

Глава 12 описывает действия, которые происходят во время выполнения программы. Программа обычно сохранена как двоичные файлы, представляющие скомпилированные классы и интерфейсы. Эти двоичные файлы могут быть загружены в виртуальную машину Java, соединились с другими классами и интерфейсами, и инициализировали.

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

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

Глава 13 описывает совместимость на уровне двоичных кодов, определяя воздействие изменений к типам на других типах, которые используют измененные типы, но не были перекомпилированы. Эти соображения представляют интерес для разработчиков типов, которые должны быть широко распределены, в продолжающейся серии версий, часто через Интернет. Хорошие среды разработки программы автоматически перекомпилировали зависимый код всякий раз, когда тип изменяется, таким образом, большинство программистов не должно быть обеспокоено этими деталями.

Глава 14 описывает блоки и операторы, которые основаны на C и C++. Язык имеет нет goto оператор, но включает маркированный break и continue операторы. В отличие от C, язык программирования Java требует boolean (или Boolean) выражения в операторах управления, и не преобразовывают типы в boolean неявно (кроме посредством распаковывания), в надежде на фиксацию большего количества ошибок во время компиляции. A synchronized оператор обеспечивает основную блокировку монитора уровня объектов. A try оператор может включать catch и finally пункты, чтобы защитить от нелокальных передач управления.

Глава 15 описывает выражения. Этот документ полностью определяет (очевидный) порядок оценки выражений для увеличенного детерминизма и мобильности. Перегруженные методы и конструкторы разрешаются во время компиляции, выбирая самый определенный метод или конструктора от тех, которые применимы.

Глава 16 описывает точный путь, которым язык гарантирует, что локальные переменные определенно устанавливаются перед использованием. В то время как все другие переменные автоматически инициализируются к значению по умолчанию, язык программирования Java автоматически не инициализирует локальные переменные, чтобы избежать маскировать ошибки программирования.

Глава 17 описывает семантику потоков и блокировок, которые основаны на основанном на мониторе параллелизме, первоначально начатом с Меза-языка программирования. Язык программирования Java определяет модель памяти для многопроцессорных систем совместно используемой памяти, которая поддерживает высокоэффективные реализации.

Глава 18 представляет синтаксическую грамматику для языка.

Книга заканчивается индексом, кредитами на расценки, используемые в книге, и выходных данных, описывающих, как книга создавалась.

1.1 Примеры программы

Большинство примеров программы, данных в тексте, готово быть выполненным и подобно в форме:


class Test {
        public static void main(String[] args) {
                for (int i = 0; i < args.length; i++)
                        System.out.print(i == 0 ? args[i] : " " + args[i]);
                System.out.println();
        }
}
На Java Sun использования рабочей станции Sun 2 Платформы Standard Edition программное обеспечение Набора Develpment, этот класс, сохранено в файле Test.java, может быть скомпилирован и выполнен, давая команды:


javac Test.java
java Test Hello, world.
создание вывода:

Hello, world.

1.2 Нотация

Всюду по этой книге мы обращаемся к классам и интерфейсам, оттянутым из Java и Java 2 платформы. Всякий раз, когда мы обращаемся к классу или интерфейсу, который не определяется в примере в этой книге, используя единственный идентификатор N, намеченная ссылка к классу или интерфейсу по имени N в пакете java.lang. Мы используем каноническое имя (§6.7) для классов или интерфейсов от пакетов кроме java.lang.

Всякий раз, когда мы обращаемся к Спецификация виртуальной машины Java в этой книге, мы имеем в виду второй выпуск, как исправлено JSR 924.

1.3 Отношение к Предопределенным Классам и Интерфейсам

Как отмечено выше, эта спецификация часто отсылает к классам Java и Java 2 платформы. В частности у некоторых классов есть особые отношения с языком программирования Java. Примеры включают классы такой как Object, Class, ClassLoader, String, Thread, и классы и интерфейсы в пакете java.lang.reflect, среди других. Определение языка ограничивает поведение этих классов и интерфейсов, но этот документ не предоставляет полную спецификацию им. Читатель относится в другие части спецификации платформы Java для таких подробных спецификаций API.

Таким образом этот документ не описывает отражение во всех подробностях. У многих лингвистических конструкций есть аналоги в API Reflection, но они обычно не обсуждаются здесь. Так, например, когда мы перечисляем пути, которыми может быть создан объект, мы обычно не включаем пути, которыми отражающий API может выполнить это. Читатели должны знать об этих дополнительных механизмах даже при том, что они не упоминаются в этом тексте.

1.4 Ссылки

Apple Computer. Справочник Дилана. Apple Computer Inc., Купертино, Калифорния. 29 сентября 1995. См. также http://www.cambridge.apple.com.

Bobrow, Даниэль Г., Линда Г. Демичил, Ричард П. Габриэль, Соня Е. Кеене, Грегор Кикзэйлс, и Дэвид А. Мун. Системная Спецификация Объекта языка Common LISP, 88-002R Документ X3J13, июнь 1988; появляется как Глава 28 Стила, Парня. Язык Common LISP: Язык, 2-ая Цифровая печать редактора, 1990, ISBN 1-55558-041-6, 770-864.

Эллис, Маргарет А., и Бьярне Штруштруп. Аннотируемый Справочник C++. Аддисон-Уэсли, Чтение, Массачусетс, 1990, переизданный с октябрем 1992 исправлений, ISBN 0-201-51459-1.

Голдберг, Адель и Робсон, Дэвид. Smalltalk-80: Язык. Аддисон-Уэсли, Чтение, Массачусетс, 1989, ISBN 0-201-13688-0.

Харбисон, Сэмюэль. Modula-3. Прентис Хол, Энглвудские Утесы, Нью-Джерси, 1992, ISBN 0-13-596396.

Хоар, К. А. Р. Подсказки на Проекте Языка программирования. Технический отчет № CS-73-403 Кафедры информатики Стэнфордского университета, декабрь 1973. Переизданный на Симпозиуме SIGACT/SIGPLAN по Принципам Языков программирования. Ассоциация вычислительной техники, Нью-Йорк, октябрь 1973.

Стандарт IEEE для Двоичной Арифметики С плавающей точкой. Станд. ANSI/IEEE 754-1985. Доступный из Глобальных Технических Документов, 15 Инвернесса Путем Восток, Энглвуд, Колорадо 80112-5704 США; 800-854-7179.

Керниган, Брайан В., и Деннис М. Ричи. Язык программирования C, 2-ой редактор Прентис Хол, Энглвудские Утесы, Нью-Джерси, 1988, ISBN 0-13-110362-8.

Мэдсен, Оле Лерман, Бирджер Мыллер-Педерсен, и Кристен Нигэард. Объектно-ориентированное программирование в Бета Языке программирования. Аддисон-Уэсли, Чтение, Массачусетс, 1993, ISBN 0-201-62430-3.

Митчелл, Джеймс Г., Уильям Мейбери, и Ричард Свит. Меза-Язык программирования, Версия 5.0. Xerox PARC, Пало-Альто, Калифорния, CSL 79-3, апрель 1979.

Stroustrup, Бьярне. C++ Язык Progamming, 2-ой редактор Аддисон-Уэсли, Чтение, Массачусетс, 1991, переизданный с январем 1994 исправлений, ISBN 0-201-53992-6.

Консорциум Unicode. Стандарт Unicode: Глобальная Кодировка символов, Версия 1.0, Объем 1, ISBN 0-201-56788-1, и Объем 2, ISBN 0-201-60845-6. Обновления и дополнения, необходимые, чтобы принести Стандарту Unicode до версии 1.1, могут быть найдены в -http://www.unicode.org.

Консорциум Unicode. Стандарт Unicode, Версия 2.0, ISBN 0-201-48345-9. Обновления и дополнения, необходимые, чтобы принести Стандарту Unicode до версии 2.1, могут быть найдены в http://www.unicode.org.

Консорциум Unicode. Стандарт Unicode, Версия 4.0, ISBN 0-321-18578-1. Обновления и дополнения могут быть найдены в http://www.unicode.org.


Содержание | Предыдущий | Следующий | Индекс Спецификация языка Java
Третий Выпуск

Авторское право © 1996-2005 Sun Microsystems, Inc. Все права защищены
Пожалуйста, отправьте любые комментарии или исправления через нашу форму обратной связи



Spec-Zone.ru - all specs in one place



free hit counter