Spec-Zone .ru
спецификации, руководства, описания, API
Содержание | Предыдущий | Следующий | Индекс Спецификация языка Java
Третий Выпуск


ГЛАВА 3

Лексическая Структура


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

Программы пишутся в Unicode (§3.1), но лексическим преобразованиям обеспечивают (§3.2) так, чтобы (§3.3) Escape Unicode мог использоваться, чтобы включать любой символ Unicode использование только символов ASCII. Разделители строки определяются (§3.4), чтобы поддерживать различные соглашения существующих хост-систем, поддерживая непротиворечивые номера строки.

Символы Unicode, следующие из лексических преобразований, уменьшаются до последовательности входных элементов (§3.5), которые являются пробелом (§3.6), комментарии (§3.7), и маркеры. Маркеры являются идентификаторами (§3.8), ключевые слова (§3.9), литералы (§3.10), разделители (§3.11), и операторы (§3.12) синтаксической грамматики.

3.1 Unicode

Программы пишутся, используя набор символов Unicode. Информация об этом наборе символов и его связанных кодировках символов может быть найдена в:

http://www.unicode.org
Платформа Java отслеживает спецификацию Unicode, как это развивается. Точная версия Unicode, используемого данным выпуском, определяется в документации класса Character.

Версии языка программирования Java до 1.1 используемых версий 1.1.5 Unicode. Обновления до более новых версий Стандарта Unicode произошли в JDK 1.1 (к Unicode 2.0), JDK 1.1.7 (к Unicode 2.1), J2SE 1.4 (к Unicode 3.0), и J2SE 5.0 (к Unicode 4.0).

Стандарт Unicode был первоначально разработан как фиксированная ширина 16-разрядная кодировка символов. Это было с тех пор изменено, чтобы учесть символы, представление которых требует больше чем 16 битов. Диапазоном точек свода законов является теперь U+0000 к U+10FFFF, используя шестнадцатеричную нотацию U+n. Символы, кодовые точки которых больше чем U+FFFF, вызывают дополнительными символами. Чтобы представить полный спектр символов, используя только 16-разрядные модули, стандарт Unicode определяет кодирование под названием UTF-16. В этом кодировании дополнительные символы представляются как пары 16-разрядных элементов кода, первого от диапазона высоких заместителей, (U+D800 к U+DBFF), второе от диапазона низких заместителей (U+DC00 к U+DFFF). Для символов в диапазоне U+0000 к U+FFFF, значениям кодовых точек и элементов кода UTF-16 являются тем же самым.

Язык программирования Java представляет текст в последовательностях 16-разрядных элементов кода, используя кодирование UTF-16. Несколько API, прежде всего в Character класс, используйте 32-разрядные целые числа, чтобы представить кодовые точки как отдельные объекты. Платформа Java обеспечивает методы, чтобы преобразовать между этими двумя представлениями.

Эта книга использует кодовую точку сроков и элемент кода UTF-16, где представление релевантно, и символ общего обозначения, где представление не важно обсуждению.

За исключением комментариев (§3.7), идентификаторы, и содержание символьных и строковых литералов (§3.10.4, §3.10.5), все входные элементы (§3.5) в программе формируются только из символов ASCII (или Escape Unicode (§3.3), которые приводят к символам ASCII). ASCII (ANSI X3.4) является Стандартный американский код обмена информацией. Первые 128 символов кодировки символов Unicode являются символами ASCII.

3.2 Лексические Преобразования

Необработанный поток символа Unicode преобразовывается в последовательность маркеров, используя следующие три лексических шага преобразования, которые применяются поочередно:

  1. Преобразование Escape Unicode (§3.3) в необработанном потоке символов Unicode к соответствующему символу Unicode. escape Unicode формы \uxxxx, где xxxx является шестнадцатеричным значением, представляет элемент кода UTF-16, кодирование которого является xxxx. Этот шаг преобразования позволяет любой программе быть выраженной, используя только символы ASCII.
  2. Преобразование потока Unicode, следующего из шага 1 в поток входных символов и разделителей строки (§3.4).
  3. Преобразование потока входных символов и разделителей строки, следующих из шага 2 в последовательность входных элементов (§3.5), который, после пробела отбрасываются (§3.6) и комментарии (§3.7), включает маркеры (§3.5), которые являются терминальными символами синтаксической грамматики (§2.3).
Самое длинное преобразование используется в каждом шаге, даже если результат в конечном счете не делает корректную программу, в то время как другое лексическое преобразование было бы. Таким образом входные символы a--b маркируются (§3.5) как a, --, b, который не является частью любой грамматически корректной программы, даже при том, что tokenization a, -, -, b могла быть часть грамматически корректной программы.

3.3 Escape Unicode

Реализации сначала распознают Escape Unicode в своем вводе, преобразовывая символы ASCII \u сопровождаемый четырьмя шестнадцатеричными цифрами к элементу кода UTF-16 (§3.1) с обозначенным шестнадцатеричным значением, и передающий все другие неизменные символы. Представление дополнительных символов требует двух последовательных Escape Unicode. Этот шаг преобразования приводит к последовательности входных символов Unicode:


UnicodeInputCharacter:
        UnicodeEscape
        RawInputCharacter

UnicodeEscape:
        \ UnicodeMarker HexDigit HexDigit HexDigit HexDigit

UnicodeMarker:
        u
        UnicodeMarker u

RawInputCharacter:
        any Unicode character

HexDigit: one of
        0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F
\, u, и шестнадцатеричные цифры здесь являются всеми символами ASCII.

В дополнение к обработке, подразумеваемой грамматикой, для каждого необработанного входного символа, который является наклонной чертой влево \, входная обработка должна рассмотреть сколько другой \ символы рядом предшествуют этому, разделяя это от не -\ символ или запуск входного потока. Если это число даже, то \ имеет право начать escape Unicode; если число нечетно, то \ не имеет право начать escape Unicode. Например, необработанный ввод "\\u2297=\u2297" результаты в этих одиннадцати символах " \ \ u 2 2 9 7 = " (\u2297 кодирование Unicode символа""),.

Если имеющее право \ не сопровождается u, тогда это обрабатывается как RawInputCharacter и остается частью оставленного потока Unicode. Если имеющее право \ сопровождается u, или больше чем один u, и последнее u не сопровождается четырьмя шестнадцатеричными цифрами, затем ошибка времени компиляции происходит.

Символ, произведенный escape Unicode, не участвует в дальнейших Escape Unicode. Например, необработанный ввод \u005cu005a результаты в этих шести символах \ u 0 0 5 a, потому что 005c значение Unicode для \. Это не приводит к символу Z, который является символом Unicode 005a, потому что \ это следовало \u005c не интерпретируется как запуск дальнейшего escape Unicode.

Язык программирования Java определяет стандартный способ преобразовать программу, записанную в Unicode в ASCII, который изменяет программу в форму, которая может быть обработана основанными на ASCII инструментами. Преобразование включает преобразование любых Escape Unicode в исходный текст программы к ASCII, добавляя дополнительное u- например, \uxxxx становится \uuxxxx-в-то-время-как одновременно преобразовывая символы неASCII в исходном тексте к Escape Unicode, содержащим сингл u каждый.

Эта преобразованная версия является одинаково приемлемой для компилятора для языка программирования Java ("компилятор Java") и представляет ту же самую программу. Точный источник Unicode может позже быть восстановлен от этой формы ASCII, преобразовывая каждую escape-последовательность где кратное число u's присутствуют к последовательности символов Unicode с одним меньше u, одновременно преобразовывая каждую escape-последовательность с синглом u к соответствующему единственному символу Unicode.

Реализации должны использовать \uнотация xxxx как выходной формат, чтобы вывести на экран символы Unicode, когда подходящий шрифт не доступен.

3.4 Разделители строки

Реализации затем делят последовательность входных символов Unicode в строки, распознавая разделители строки. Это определение строк определяет номера строки, произведенные компилятором Java или другим системным компонентом. Это также определяет завершение // форма комментария (§3.7).

LineTerminator:
        the ASCII LF character, also known as "newline"
        the ASCII CR character, also known as "return"
  the ASCII CR character followed by the ASCII LF character

InputCharacter:
        UnicodeInputCharacter but not CR or LF
Строки завершаются символами ASCII CR, или LF, или CR LF. Эти два символа CR сразу сопровождаемый LF считаются как один разделитель строки, не два.

Результатом является последовательность разделителей строки и входных символов, которые являются терминальными символами для третьего шага в процессе tokenization.

3.5 Входные Элементы и Маркеры

Входные символы и разделители строки, которые следуют из Escape, обрабатывающего (§3.3), и затем вводят распознавание строки (§3.4), уменьшаются до последовательности входных элементов. Те входные элементы, которые не являются пробелом (§3.6) или комментарии (§3.7), являются маркерами. Маркеры являются терминальными символами синтаксической грамматики (§2.3).

Этот процесс определяется следующим производством:

Input:
        InputElementsopt Subopt

InputElements:
        InputElement
        InputElements InputElement

InputElement:
        WhiteSpace
        Comment
        Token

Token:
        Identifier
        Keyword
        Literal
        Separator
        Operator

Sub:
        the ASCII SUB character, also known as "control-Z"
Пробел (§3.6) и комментарии (§3.7) может служить, чтобы разделить маркеры, которые, если смежный, могли бы маркироваться другим способом. Например, символы ASCII - и = во вводе может сформировать маркер оператора -= (§3.12), только если нет никакого прошедшего пробела или комментария.

Как специальная концессия для совместимости с определенными операционными системами, ASCII символ SUB (\u001a, или управление-Z), игнорируется, если это - последний знак в оставленном входном потоке.

Рассмотрите два маркера x и y в получающемся входном потоке. Если x предшествует y, то мы говорим, что x налево от y и что y направо от x.

Например, в этой простой части кода:

class Empty {
}
мы говорим что } маркер направо от { маркер, даже при том, что это появляется, в этом двумерном представлении на бумаге, вниз и налево от { маркер. Это соглашение об использовании левых и правых слов позволяет нам говорить, например, правого операнда бинарного оператора или левой стороны присвоения.

3.6 Пробел

Пробел определяется как пространство ASCII, горизонтальная вкладка, и символы перевода формата, так же как разделители строки (§3.4).

WhiteSpace:
        the ASCII SP character, also known as "space"
        the ASCII HT character, also known as "horizontal tab"
        the ASCII FF character, also known as "form feed"
        LineTerminator

3.7 Комментарии

Есть два вида комментариев:

/* text */               A traditional comment: all the 
                        text from the ASCII characters /* 
                        to the ASCII characters */ is ignored
                        (as in C and C++).

// text                  A end-of-line comment: all the text 
                        from the ASCII characters // to 
                        the end of the line is ignored (as in C++).
Эти комментарии формально определяются следующим производством:

Comment:
        TraditionalComment
        EndOfLineComment

TraditionalComment:
        / * CommentTail

EndOfLineComment:
        / / CharactersInLineopt 

CommentTail:
        * CommentTailStar
        NotStar CommentTail

CommentTailStar:
        /
        * CommentTailStar
        NotStarNotSlash CommentTail

NotStar:
        InputCharacter but not *
        LineTerminator

NotStarNotSlash:
        InputCharacter but not * or /
        LineTerminator

CharactersInLine:
        InputCharacter
        CharactersInLine InputCharacter
        
Это производство подразумевает все следующие свойства:

В результате текст:

/* this comment /* // /** ends here: */
единственный полный комментарий.

Лексическая грамматика подразумевает, что комментарии не происходят в пределах символьных литералов (§3.10.4) или строковые литералы (§3.10.5).

3.8 Идентификаторы

Идентификатор является последовательностью неограниченно-длиной букв Java и цифр Java, первой из которых должна быть буква Java. У идентификатора не может быть того же самого написания (последовательность символа Unicode) как ключевое слово (§3.9), булев литерал (§3.10.3), или нулевой литерал (§3.10.7).

Identifier:
        IdentifierChars but not a Keyword or BooleanLiteral or NullLiteral

IdentifierChars:
        JavaLetter
        IdentifierChars JavaLetterOrDigit

JavaLetter:
        any Unicode character that is a Java letter (see below)

JavaLetterOrDigit:
        any Unicode character that is a Java letter-or-digit (see below)
Буквы и цифры могут быть оттянуты из всего набора символов Unicode, который поддерживает большинство сценариев записи в использовании в мире сегодня, включая большие наборы для китайского, японского, и корейского языка. Это позволяет программистам использовать идентификаторы в своих программах, которые пишутся на их родных языках.

"Буква Java" является символом для который метод Character.isJavaIdentifierStart(int) возвраты true. "Java "буква или цифра"" является символом для который метод Character.isJavaIdentifierPart(int) возвраты true.

Буквы Java включают прописные и строчные латинские буквы ASCII A-Z (\u0041-\u005a), и a-z (\u0061-\u007a), и, по историческим причинам, подчеркивание ASCII (_, или \u005f) и знак доллара ($, или \u0024). $ символ должен использоваться только в механически сгенерированном исходном коде или, редко, к доступу, существующему ранее имена на унаследованных системах.

"Цифры Java" включают цифры ASCII 0-9 (\u0030-\u0039).

Два идентификатора являются тем же самым, только если они идентичны, то есть, имейте тот же самый символ Unicode для каждой буквы или цифры.

Идентификаторы, у которых есть то же самое внешнее появление, могут все же отличаться. Например, идентификаторы, состоящие из ЛАТИНСКОЙ ПРОПИСНОЙ БУКВЫ A одних букв (A, \u0041), ЛАТИНСКАЯ СТРОЧНАЯ БУКВА (a, \u0061), ГРЕЧЕСКАЯ АЛЬФА ПРОПИСНОЙ БУКВЫ (A, \u0391), КИРИЛЛИЧЕСКАЯ СТРОЧНАЯ БУКВА (a, \u0430) и МАТЕМАТИЧЕСКИЙ ПОЛУЖИРНЫЙ КУРСИВ, МАЛЕНЬКИЙ (a, \ud835\udc82) все отличаются.

Символы составного объекта Unicode отличаются от анализируемых символов. Например, ЛАТИНСКАЯ ПРОПИСНАЯ БУКВА ОСТРОЕ (Á, \u00c1) как могли полагать, был тем же самым как ЛАТИНСКОЙ ПРОПИСНОЙ БУКВОЙ A (A, \u0041) сразу сопровождаемый ОСТРЫМ БЕЗ ИНТЕРВАЛОВ (´, \u0301) сортируя, но они отличаются в идентификаторах. См. Стандарт Unicode, Объем 1, страницы 412ff для деталей о разложении, и см. страницы 626-627 той работы для деталей о сортировке. Примеры идентификаторов:

       String                  i3                                   MAX_VALUE                               isLetterOrDigit

3.9 Ключевые слова

Следующие символьные последовательности, сформированные из букв ASCII, резервируются для использования в качестве ключевых слов и не могут использоваться в качестве идентификаторов (§3.8):

Keyword: one of
        abstract    continue    for           new          switch
        assert      default     if            package      synchronized
        boolean     do          goto          private      this
        break       double      implements    protected    throw
        byte        else        import        public       throws
        case        enum        instanceof    return       transient
        catch       extends     int           short        try
        char        final       interface     static       void 
        class       finally     long          strictfp     volatile
        const       float       native        super        while                        
        

Ключевые слова const и goto резервируются, даже при том, что они в настоящий момент не используются. Это может позволить компилятору Java производить лучшие сообщения об ошибках, если эти ключевые слова C++ неправильно появляются в программах.

В то время как true и false могло бы казаться, был бы ключевыми словами, они - технически Булевы литералы (§3.10.3). Точно так же, в то время как null могло бы казаться, был бы ключевым словом, это - технически нулевой литерал (§3.10.7).

3.10 Литерала

Литерал является представлением исходного кода значения типа примитива (§4.2), String введите (§4.3.3), или нулевой тип (§4.1):

Literal:
        IntegerLiteral
        FloatingPointLiteral
        BooleanLiteral
        CharacterLiteral
        StringLiteral
        NullLiteral
        

3.10.1 Целочисленные Литералы

См. §4.2.1 для общего обсуждения целочисленных типов и значений.

Целочисленный литерал может быть выражен в десятичном числе (базируйтесь 10), шестнадцатеричный (базируются 16), или восьмеричный (базируются 8):

IntegerLiteral:
        DecimalIntegerLiteral
        HexIntegerLiteral       
        OctalIntegerLiteral

DecimalIntegerLiteral:
        DecimalNumeral IntegerTypeSuffixopt

HexIntegerLiteral:
        HexNumeral IntegerTypeSuffixopt

OctalIntegerLiteral:    
        OctalNumeral IntegerTypeSuffixopt

IntegerTypeSuffix: one of
        l L
Целочисленный литерал имеет тип long если это снабжается суффиксом букву ASCII L или l (эль); иначе это имеет тип int (§4.2.1). Суффикс L предпочитается, потому что буква l (эль) часто трудно отличить от цифры 1 (один).

Десятичная цифра является любой единственным символом ASCII 0, представление целочисленного нуля, или состоит из цифры ASCII от 1 к 9, дополнительно сопровождаемый одной или более цифрами ASCII от 0 к 9, представление положительного целого числа:

DecimalNumeral:
        0
        NonZeroDigit Digitsopt

Digits:
        Digit
        Digits Digit

Digit:
        0
        NonZeroDigit

NonZeroDigit: one of
        1 2 3 4 5 6 7 8 9
Шестнадцатеричная цифра состоит из ведущих символов ASCII 0x или 0X сопровождаемый одним или более ASCII шестнадцатеричные цифры и может представить положительное, нуль, или отрицательное целое число. Шестнадцатеричные цифры со значениями 10 - 15 представляются буквами ASCII a через f или A через F, соответственно; каждая буква, используемая в качестве шестнадцатеричной цифры, может быть прописной или строчной.

HexNumeral:
        0 x HexDigits
        0 X HexDigits

HexDigits:
        HexDigit
        HexDigit HexDigits

Следующее производство от §3.3 повторяется здесь для ясности:

HexDigit: one of
        0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F
Восьмеричная цифра состоит из цифры ASCII 0 сопровождаемый один или больше цифр ASCII 0 через 7 и может представить положительное, нуль, или отрицательное целое число.

OctalNumeral:
        0 OctalDigits

OctalDigits:
        OctalDigit
        OctalDigit OctalDigits

OctalDigit: one of
        0 1 2 3 4 5 6 7
Отметьте, что восьмеричные цифры всегда состоят из двух или больше цифр; 0 как всегда полагают, десятичная цифра - не, что она имеет значение очень практически для цифр 0, 00, и 0x0 все представляют точно то же самое целочисленное значение.

Самый большой десятичный литерал типа int 2147483648 (231). Все десятичные литералы от 0 к 2147483647 может появиться где угодно int литерал может появиться, но литерал 2147483648 может появиться только как операнд унарного оператора отрицания -.

Самые большие положительные шестнадцатеричные и восьмеричные литералы типа int 0x7fffffff и 017777777777, соответственно, который равный 2147483647 (231-1). Самые отрицательные шестнадцатеричные и восьмеричные литералы типа int 0x80000000 и 020000000000, соответственно, каждый из которых представляет десятичное значение -2147483648 (-231). Шестнадцатеричные и восьмеричные литералы 0xffffffff и 037777777777, соответственно, представьте десятичное значение -1.

Ошибка времени компиляции происходит если десятичный литерал типа int больше чем 2147483648 (231), или если литерал 2147483648 появляется где угодно кроме как операнд унарного - оператор, или если шестнадцатеричное или восьмеричное int литерал не помещается в 32 бита.

Примеры int литералы:

       0       2       0372    0xDadaCafe      1996     0x00FF00FF
Самый большой десятичный литерал типа long 9223372036854775808L (263). Все десятичные литералы от 0L к 9223372036854775807L может появиться где угодно a long литерал может появиться, но литерал 9223372036854775808L может появиться только как операнд унарного оператора отрицания -.

Самые большие положительные шестнадцатеричные и восьмеричные литералы типа long 0x7fffffffffffffffL и 0777777777777777777777L, соответственно, который равный 9223372036854775807L (263-1). Литералы 0x8000000000000000L и 01000000000000000000000L являются самыми отрицательными long шестнадцатеричные и восьмеричные литералы, соответственно. У каждого есть десятичное значение -9223372036854775808L (-263). Шестнадцатеричные и восьмеричные литералы 0xffffffffffffffffL и 01777777777777777777777L, соответственно, представьте десятичное значение -1L.

Ошибка времени компиляции происходит если десятичный литерал типа long больше чем 9223372036854775808L (263), или если литерал 9223372036854775808L появляется где угодно кроме как операнд унарного - оператор, или если шестнадцатеричное или восьмеричное long литерал не помещается в 64 бита.

Примеры long литералы:

       0l      0777L   0x100000000L    2147483648L     0xC0B0L

3.10.2 Литералы с плавающей точкой

См. §4.2.3 для общего обсуждения типов с плавающей точкой и значений.

У литерала с плавающей точкой есть следующие части: часть целого числа, десятичная или шестнадцатеричная точка (представленный символом точки ASCII), дробная часть, экспонента, и суффикс типа. Число с плавающей точкой может быть записано или как десятичное значение или как шестнадцатеричное значение. Для десятичных литералов, экспоненты, если есть обозначается буквой ASCII e или E сопровождаемый дополнительно целым числом со знаком. Для шестнадцатеричных литералов экспонента всегда требуется и обозначается буквой ASCII p или P сопровождаемый дополнительно целым числом со знаком.

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

Литерал с плавающей точкой имеет тип float если это снабжается суффиксом букву ASCII F или f; иначе его тип double и это может дополнительно быть снабжено суффиксом букву ASCII D или d.


FloatingPointLiteral:
        DecimalFloatingPointLiteral
        HexadecimalFloatingPointLiteral

DecimalFloatingPointLiteral:
        Digits . Digitsopt ExponentPartopt FloatTypeSuffixopt
      . Digits ExponentPartopt FloatTypeSuffixopt
      Digits ExponentPart FloatTypeSuffixopt
        Digits ExponentPartopt FloatTypeSuffix

ExponentPart:
        ExponentIndicator SignedInteger

ExponentIndicator: one of
        e E

SignedInteger:
        Signopt Digits

Sign: one of
        + -

FloatTypeSuffix: one of
        f F d D

HexadecimalFloatingPointLiteral:
        HexSignificand BinaryExponent FloatTypeSuffixopt

HexSignificand:
        HexNumeral
        HexNumeral .
        0x HexDigitsopt . HexDigits
        0X HexDigitsopt . HexDigits

BinaryExponent:
        BinaryExponentIndicator SignedInteger

BinaryExponentIndicator:one of
        p P
Элементы типов float и double те значения, которые могут быть представлены, используя IEEE 754 32-разрядная одинарная точность и 64-разрядный двоичный файл двойной точности форматы с плавающей точкой, соответственно.

Детали надлежащего входного преобразования из строкового представления Unicode числа с плавающей точкой к внутреннему двоичному файлу IEEE 754 представление с плавающей точкой описываются для методов valueOf из класса Float и класс Double из пакета java.lang.

Самое большое положительное конечное float литерал 3.4028235e38f. Самый маленький положительный конечный ненулевой литерал типа float 1.40e-45f. Самое большое положительное конечное double литерал 1.7976931348623157e308. Самый маленький положительный конечный ненулевой литерал типа double 4.9e-324.

Ошибка времени компиляции происходит, если ненулевой литерал с плавающей точкой является слишком большим, так, чтобы на округленном преобразовании в его внутреннее представление это стало бесконечностью IEEE 754. Программа может представить бесконечности, не производя ошибку времени компиляции при использовании константных выражений такой как 1f/0f или -1d/0d или при использовании предопределенных констант POSITIVE_INFINITY и NEGATIVE_INFINITY из классов Float и Double.

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

Предопределенные константы, представляющие значения Не-числа, определяются в классах Float и Double как Float.NaN и Double.NaN.

Примеры float литералы:

       1e1f    2.f     .3f     0f      3.14f   6.022137e+23f

Примеры double литералы:

        1e1     2.      .3      0.0     3.14    1e-9d   1e137

Помимо выражения значений с плавающей точкой в десятичном и шестнадцатеричном, методе intBitsToFloat из класса Float и метод longBitsToDouble из класса Double обеспечьте способ выразить значения с плавающей точкой с точки зрения шестнадцатеричных или восьмеричных целочисленных литералов. Например, значение:

Double.longBitsToDouble(0x400921FB54442D18L)
равно значению Math.PI.

3.10.3 Булевы Литералы

boolean у типа есть два значения, представленные литералами true и false, сформированный из букв ASCII.

Булев литерал всегда имеет тип boolean.

BooleanLiteral: one of
        true false

3.10.4 Символьные Литералы

Символьный литерал выражается как символ или escape-последовательность, включенная в одинарные кавычки ASCII. (Одинарная кавычка, или апостроф, символ \u0027.) Символьные литералы могут только представить элементы кода UTF-16 (§3.1), то есть, они ограничиваются значениями от \u0000 к \uffff. Дополнительные символы должны быть представлены или как суррогатная пара в пределах последовательности случайной работы, или как целое число, в зависимости от API, с которым они используются.

Символьный литерал всегда имеет тип char.


CharacterLiteral:
        ' SingleCharacter '
        ' EscapeSequence '

SingleCharacter:
        InputCharacter but not ' or \
Escape-последовательности описываются в §3.10.6.

Как определено в §3.4, символы CR и LF никогда не является InputCharacter; они распознаются как образование LineTerminator.

Это - ошибка времени компиляции для символа после SingleCharacter или EscapeSequence, чтобы быть кроме a '.

Это - ошибка времени компиляции для разделителя строки, чтобы появиться после открытия ' и перед закрытием '.

Следующее является примерами char литералы:

'a'
'%'
'\t'
'\\'
'\''
'\u03a9'
'\uFFFF'
'\177'
''
''

Поскольку Escape Unicode обрабатываются очень рано, это не корректно, чтобы записать '\u000a' для символьного литерала, значение которого является переводом строки (LF); escape Unicode \u000a преобразовывается в фактический перевод строки в шаге 1 преобразования (§3.3), и перевод строки становится LineTerminator в шаге 2 (§3.4), и таким образом, символьный литерал не допустим в шаге 3. Вместо этого нужно использовать escape-последовательность '\n' (§3.10.6). Точно так же это не корректно, чтобы записать '\u000d' для символьного литерала, значение которого является возвратом каретки (CR). Вместо этого используйте '\r'.

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

3.10.5 Строковые литералы

Строковый литерал состоит из нуля или большего количества символов, включенных в двойные кавычки. Символы могут быть представлены escape-последовательностями - одна escape-последовательность для символов в диапазоне U+0000 к U+FFFF, двум escape-последовательностям для суррогатных элементов кода UTF-16 символов в диапазоне U+010000 к U+10FFFF.

Строковый литерал всегда имеет тип String (§4.3.3). Строковый литерал всегда обращается к тому же самому экземпляру (§4.3.1) класса String.


StringLiteral:
        " StringCharactersopt "

StringCharacters:
        StringCharacter
        StringCharacters StringCharacter

StringCharacter:
        InputCharacter but not " or \
        EscapeSequence

Escape-последовательности описываются в §3.10.6.

Как определено в §3.4, ни одном из символов CR и LF, как когда-либо полагают, является InputCharacter; каждый распознается как образование LineTerminator.

Это - ошибка времени компиляции для разделителя строки, чтобы появиться после открытия " и перед соответствием закрытия ". Долгий строковый литерал может всегда разбиваться в более короткие части и писаться как (возможно заключенный в скобки) выражение, используя оператор конкатенации строк + (§15.18.1).

Следующее является примерами строковых литералов:

""                                      // the empty string
"\""                                    // a string containing " alone
"This is a string"                      // a string containing 16 characters
"This is a " +                          // actually a string-valued constant expression,
        "two-line string"               //              formed from two string literals

Поскольку Escape Unicode обрабатываются очень рано, это не корректно, чтобы записать "\u000a" для строкового литерала, содержащего единственный перевод строки (LF); escape Unicode \u000a преобразовывается в фактический перевод строки в шаге 1 преобразования (§3.3), и перевод строки становится LineTerminator в шаге 2 (§3.4), и таким образом, строковый литерал не допустим в шаге 3. Вместо этого нужно записать "\n" (§3.10.6). Точно так же это не корректно, чтобы записать "\u000d" для строкового литерала, содержащего единственный возврат каретки (CR). Вместо этого используйте "\r".

Каждый строковый литерал является ссылкой (§4.3) к экземпляру (§4.3.1, §12.5) класса String (§4.3.3). String у объектов есть постоянная величина. Строковые литералы - или, более широко, строки, которые являются значениями константных выражений (§15.28) - "интернируются", чтобы совместно использовать уникальные экземпляры, используя метод String.intern.

Таким образом, тестовая программа, состоящая из единицы компиляции (§7.3):

package testPackage;
class Test {
        public static void main(String[] args) {
                String hello = "Hello", lo = "lo";
                System.out.print((hello == "Hello") + " ");
                System.out.print((Other.hello == hello) + " ");
                System.out.print((other.Other.hello == hello) + " ");
                System.out.print((hello == ("Hel"+"lo")) + " ");
                System.out.print((hello == ("Hel"+lo)) + " ");
                System.out.println(hello == ("Hel"+lo).intern());
        }
}
class Other { static String hello = "Hello"; }
и единица компиляции:

package other;
public class Other { static String hello = "Hello"; }
производит вывод:

true true true true false true
Этот пример иллюстрирует шесть тезисов:

Результатом явного интернирования вычисленной строки является та же самая строка как любая существующая ранее литеральная строка с тем же самым содержанием.

3.10.6 Escape-последовательности для Символьных и Строковых литералов

Символ и строковые escape-последовательности учитывают представление некоторых неграфических символов так же как одинарной кавычки, двойная кавычка, и символы наклонной черты влево в символьных литералах (§3.10.4) и строковые литералы (§3.10.5).


EscapeSequence:
        \ b                     /* \u0008: backspace BS                   */
        \ t                     /* \u0009: horizontal tab HT              */
        \ n                     /* \u000a: linefeed LF                    */
        \ f                     /* \u000c: form feed FF           */
        \ r                     /* \u000d: carriage return CR             */
        \ "                     /* \u0022: double quote "             */
        \ '                     /* \u0027: single quote '          */
        \ \                     /* \u005c: backslash \                     */
        OctalEscape               /* \u0000 to \u00ff: from octal value   */

OctalEscape:
        \ OctalDigit
        \ OctalDigit OctalDigit
        \ ZeroToThree OctalDigit OctalDigit

OctalDigit: one of
        0 1 2 3 4 5 6 7

ZeroToThree: one of
        0 1 2 3
Это - ошибка времени компиляции, если символ после наклонной черты влево в escape не является ASCII b, t, n, f, r, ", ', \, 0, 1, 2, 3, 4, 5, 6, или 7. escape Unicode \u обрабатывается ранее (§3.3). (Восьмеричные Escape обеспечиваются для совместимости с C, но могут выразить только значения Unicode \u0000 через \u00FF, таким образом, Escape Unicode обычно предпочитаются.)

3.10.7 Нулевой Литерал

У нулевого типа есть одно значение, нулевая ссылка, представленная литералом null, который формируется из символов ASCII. Нулевой литерал всегда имеет нулевой тип.


NullLiteral:
        null

3.11 Разделителя

Следующие девять символов ASCII являются разделителями (punctuators):


Separator: one of
        (       )       {       }       [       ]       ;       ,       .

3.12 Оператора

Следующие 37 маркеров являются операторами, сформированными из символов ASCII:

Operator: one of
        =       >    <    !       ~       ?       :
        ==      <=   >=   !=      &&      ||      ++      --
        +       -       *       /       &   |       ^       %       <<        >>        >>>
        +=      -=      *=      /=      &=  |=      ^=      %=      <<=       >>=       >>>=


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

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

free hit counter