Spec-Zone.ru › Java Language Specification 7

Глава 1. Введение

Оглавление

1.1. Организация спецификации
1.2. Примерные программы
1.3. Нотация
1.4. Связь с предопределенными классами и интерфейсами
1.5. Ссылки

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

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

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

Язык программирования Java обычно компилируется в наборе инструкций байткода и двоичном формате, определённом в Спецификации виртуальной машины Java, издание Java SE 7.

1.1. Организация спецификации

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

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

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

Примитивные типы определены одинаково на всех машинах и во всех реализациях и представляют собой различные размеры целых чисел со знаком со значением «два», однозначные и двойной точности стандартные числа с плавающей точкой IEEE 754, тип boolean и тип символа Unicode char. Значения примитивных типов не разделяют состояние.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1.2. Примеры программ

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

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();
    }
}

На машине с установленным Oracle JDK этот класс, сохранённый в файле Test.java, может быть скомпилирован и выполнен с помощью команд:

javac Test.java
java Test Hello, world.

что даёт вывод:

Hello, world.

1.3. Нотация

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

Ненормативная информация, предназначенная для уточнения спецификации, представлена в более мелких, отступающих строках.

Это ненормативная информация. Она предоставляет интуицию, обоснование, советы, примеры и т. д.

1.4. Взаимосвязь с предопределёнными классами и интерфейсами

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

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

1.5. Ссылки

Библиография

Apple Computer. Справочник по Dylan. Apple Computer Inc., Купертино, Калифорния. 29 сентября 1995 г.

Bobrow, Daniel G., Linda G. DeMichiel, Richard P. Gabriel, Sonya E. Keene, Gregor Kiczales и David A. Moon. Спецификация системы обьектов Common Lisp, документ X3J13 88-002R, июнь 1988; публикуется в главе 28 Стела, Гай. Common Lisp: Язык, 2-е изд. Digital Press, 1990, ISBN 1-55558-041-6, 770-864.

Ellis, Margaret A., и Bjarne Stroustrup. Комментированный справочник по C++. Addison-Wesley, Ридинг, Массачусетс, 1990, перепечатано с исправлениями в октябре 1992 г., ISBN 0-201-51459-1.

Goldberg, Adele и Robson, David. Smalltalk-80: Язык. Addison-Wesley, Ридинг, Массачусетс, 1989, ISBN 0-201-13688-0.

Harbison, Samuel. Modula-3. Prentice Hall, Энглвуд Клифс, Нью-Джерси, 1992, ISBN 0-13-596396.

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

Стандарт IEEE для двоичной арифметики с плавающей запятой. ANSI/IEEE Std. 754-1985. Доступно в Global Engineering Documents, 15 Inverness Way East, Энглвуд, Колорадо 80112-5704 США; 800-854-7179.

Kernighan, Brian W., и Dennis M. Ritchie. Язык программирования C, 2-е изд. Prentice Hall, Энглвуд Клифс, Нью-Джерси, 1988, ISBN 0-13-110362-8.

Madsen, Ole Lehrmann, Birger Møller-Pedersen и Kristen Nygaard. Объектно-ориентированное программирование на языке программирования Beta. Addison-Wesley, Ридинг, Массачусетс, 1993, ISBN 0-201-62430-3.

Mitchell, James G., William Maybury и Richard Sweet. Язык программирования Mesa, версия 5.0. Xerox PARC, Пало-Альто, Калифорния, CSL 79-3, апрель 1979 г.

Stroustrup, Bjarne. Язык программирования C++, 2-е изд. Addison-Wesley, Ридинг, Массачусетс, 1991, перепечатано с исправлениями в январе 1994 г., ISBN 0-201-53992-6.

Консорциум Unicode. Стандарт Unicode, версия 6.0.0. Маунтин-Вью, Калифорния, 2011, ISBN 978-1-936213-01-6.

© Oracle and/or its affiliates. All rights reserved.
Licensed under the Oracle Technology Network License Agreement.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API