![]() |
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) синтаксической грамматики.
Платформа Java отслеживает спецификацию Unicode, как это развивается. Точная версия Unicode, используемого данным выпуском, определяется в документации классаhttp://www.unicode.org
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.
\u
xxxx, где xxxx является шестнадцатеричным значением, представляет элемент кода UTF-16, кодирование которого является xxxx. Этот шаг преобразования позволяет любой программе быть выраженной, используя только символы ASCII.
a--b
маркируются (§3.5) как a
, --
, b
, который не является частью любой грамматически корректной программы, даже при том, что tokenization a
, -
, -
, b
могла быть часть грамматически корректной программы.\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
- например, \u
xxxx становится \uu
xxxx-в-то-время-как одновременно преобразовывая символы неASCII в исходном тексте к Escape Unicode, содержащим сингл u
каждый.
Эта преобразованная версия является одинаково приемлемой для компилятора для языка программирования Java ("компилятор Java") и представляет ту же самую программу. Точный источник Unicode может позже быть восстановлен от этой формы ASCII, преобразовывая каждую escape-последовательность где кратное число u
's присутствуют к последовательности символов Unicode с одним меньше u
, одновременно преобразовывая каждую escape-последовательность с синглом u
к соответствующему единственному символу Unicode.
Реализации должны использовать \u
нотация xxxx как выходной формат, чтобы вывести на экран символы Unicode, когда подходящий шрифт не доступен.
//
форма комментария (§3.7).
Строки завершаются символами ASCIILineTerminator: the ASCIILF
character, also known as "newline" the ASCIICR
character, also known as "return"the ASCII
CR
character followed by the ASCIILF
character InputCharacter: UnicodeInputCharacter but notCR
orLF
CR
, или LF
, или CR LF
. Эти два символа CR
сразу сопровождаемый LF
считаются как один разделитель строки, не два. Результатом является последовательность разделителей строки и входных символов, которые являются терминальными символами для третьего шага в процессе tokenization.
Этот процесс определяется следующим производством:
Пробел (§3.6) и комментарии (§3.7) может служить, чтобы разделить маркеры, которые, если смежный, могли бы маркироваться другим способом. Например, символы ASCIIInput: InputElementsopt Subopt InputElements: InputElement InputElements InputElement InputElement: WhiteSpace Comment Token Token: Identifier Keyword Literal Separator Operator Sub: the ASCIISUB
character, also known as "control-Z"
-
и =
во вводе может сформировать маркер оператора -=
(§3.12), только если нет никакого прошедшего пробела или комментария.
Как специальная концессия для совместимости с определенными операционными системами, ASCII символ SUB (\u001a
, или управление-Z), игнорируется, если это - последний знак в оставленном входном потоке.
Рассмотрите два маркера x и y в получающемся входном потоке. Если x предшествует y, то мы говорим, что x налево от y и что y направо от x.
Например, в этой простой части кода:
мы говорим чтоclass Empty { }
}
маркер направо от {
маркер, даже при том, что это появляется, в этом двумерном представлении на бумаге, вниз и налево от {
маркер. Это соглашение об использовании левых и правых слов позволяет нам говорить, например, правого операнда бинарного оператора или левой стороны присвоения.
WhiteSpace: the ASCIISP
character, also known as "space" the ASCIIHT
character, also known as "horizontal tab" the ASCIIFF
character, also known as "form feed" LineTerminator
Эти комментарии формально определяются следующим производством:/* 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).
Буквы и цифры могут быть оттянуты из всего набора символов Unicode, который поддерживает большинство сценариев записи в использовании в мире сегодня, включая большие наборы для китайского, японского, и корейского языка. Это позволяет программистам использовать идентификаторы в своих программах, которые пишутся на их родных языках.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)
"Буква 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 i3MAX_VALUE isLetterOrDigit
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).
String
введите (§4.3.3), или нулевой тип (§4.1):
Literal: IntegerLiteral FloatingPointLiteral BooleanLiteral CharacterLiteral StringLiteral NullLiteral
Целочисленный литерал может быть выражен в десятичном числе (базируйтесь 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
, представление положительного целого числа:
Шестнадцатеричная цифра состоит из ведущих символов ASCIIDecimalNumeral: 0 NonZeroDigit Digitsopt Digits: Digit Digits Digit Digit: 0 NonZeroDigit NonZeroDigit: one of 1 2 3 4 5 6 7 8 9
0x
или 0X
сопровождаемый одним или более ASCII шестнадцатеричные цифры и может представить положительное, нуль, или отрицательное целое число. Шестнадцатеричные цифры со значениями 10 - 15 представляются буквами ASCII a
через f
или A
через F
, соответственно; каждая буква, используемая в качестве шестнадцатеричной цифры, может быть прописной или строчной.
Следующее производство от §3.3 повторяется здесь для ясности:HexNumeral: 0 x HexDigits 0 X HexDigits HexDigits: HexDigit HexDigit HexDigits
Восьмеричная цифра состоит из цифры ASCIIHexDigit: one of 0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F
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
У литерала с плавающей точкой есть следующие части: часть целого числа, десятичная или шестнадцатеричная точка (представленный символом точки 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
.boolean
у типа есть два значения, представленные литералами true
и false
, сформированный из букв ASCII.
Булев литерал всегда имеет тип boolean
.
BooleanLiteral: one of true false
\u0027
.) Символьные литералы могут только представить элементы кода UTF-16 (§3.1), то есть, они ограничиваются значениями от \u0000
к \uffff
. Дополнительные символы должны быть представлены или как суррогатная пара в пределах последовательности случайной работы, или как целое число, в зависимости от API, с которым они используются.
Символьный литерал всегда имеет тип char
.
Escape-последовательности описываются в §3.10.6.CharacterLiteral: ' SingleCharacter ' ' EscapeSequence ' SingleCharacter: InputCharacter but not'
or \
Как определено в §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 символьный литерал всегда представляет точно один символ.
Строковый литерал всегда имеет тип 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
String
объект (§4.3.1).
String
объект.
String
объект.
Результатом явного интернирования вычисленной строки является та же самая строка как любая существующая ранее литеральная строка с тем же самым содержанием.
Это - ошибка времени компиляции, если символ после наклонной черты влево в escape не является ASCIIEscapeSequence: \ 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
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 обычно предпочитаются.)null
, который формируется из символов ASCII. Нулевой литерал всегда имеет нулевой тип.
NullLiteral: null
Separator: one of ( ) { } [ ] ; , .
Operator: one of = > < ! ~ ? : == <= >= != && || ++ -- + - * / & | ^ % << >> >>> += -= *= /= &= |= ^= %= <<= >>= >>>=
Содержание | Предыдущий | Следующий | Индекс | Спецификация языка Java Третий Выпуск |
Авторское право © 1996-2005 Sun Microsystems, Inc. Все права защищены
Пожалуйста, отправьте любые комментарии или исправления через нашу