Набір символів

Більшості програмістів доводилося мати справу з вихідними текстами програм, в яких використовувалося одне з двох уявлень символів: кодування ASCII та її різновиди (в тому числі Latin-1) і EBCDIC Обидва цих набору містять символи, використовувані в англійській та деяких інших західно-європейських мовах

На відміну від них, програми на мові Java написані в Unicode — 16-розрядному наборі символів Перші 256 символів Unicode представляють собою набір Latin-1, а основна частина перша 128 символів Latin-1 відповідає 7-разрядному набору символів ASCII В даний час оточення Java може читати стандартні файли в кодуванні ASCII або Latin-1, негайно перетворюючи їх в Unicode / У Java використовується Unicode 115 з виправленими помилками Довідкова інформація наведена в розділі Бібліографія /

В даний час лише деякі текстові редактори здатні працювати з символами Unicode, тому Java розпізнає escape-послідовності виду \ udddd, якими кодуються символи Unicode кожному d відповідає шестнадцатеричная цифра (ASCII-символи 0-9, а також a-f або A-F для представлення десяткових значень 10-15) Такі послідовності допускаються в будь-якому місці програми – не тільки в символах і строкових константах, але також і в ідентифікаторах На початку послідовності може стояти декілька u записується і як \ u0b87, і як \ uu0b87

отже, символ / Використання множинних u може здатися дивною, але на те є вагомі причини При перекладі Unicode-файлу в формат ASCII, доводиться кодувати символи Unicode, лежать за межами ASCII-діапазону, у вигляді escape-

послідовностей Таким чином, представляється у вигляді \ u0b87 При зворотному перекладі здійснюється зворотний заміна але що станеться, якщо вихідний текст в містив \ u0b87 У цьому випадку при зворотній кодуванні Unicode замість символу заміні вихідний текст зміниться (синтаксичний аналізатор не помітить ніяких змін – але не читач програми) Вихід полягає в тому, щоб при прямому перекладі вставляти додаткові u у вже існуючі \ udddd, а при зворотному – прибирати їх, і, якщо u не залишиться, замінювати escape-послідовність еквівалентним символом Unicode /

52 Коментарі

Коментарі в Java бувають трьох видів:

/ / Коментар – ігноруються символи від / / до кінця рядка

/ * Коментар * / – ігноруються символи між / * і наступним * /,

включаючи

завершальні символи рядків \ r, \ n і \ r \ n

/ ** Коментар * / – ігноруються символи між / ** і наступним * /,

включаючи

Документують безпосередньо після конструктора вони

документацію

перераховані вище завершальні символи коментарі повинні розташовуватися оголошення класу, члена класу або включаються до автоматично генерується

Коли ми говоримо символи, то маємо у вигляді будь-які символи Unicode Коментарі в Java можуть включати довільні символи Unicode: інь-янь (\ u262f), вигук (\ u203d) або сніговика (\ u2603)

У Java не дозволяються вкладені коментарі Наведений нижче текст (як би спокусливо він виглядав) компілюватися не буде:

/ * Закомментіруем до кращих часів поки не реалізовано

/ * Зробити небудь отаке * /

universeneatStuff()

*/

Перша комбінація символів / * починає коментар найближча парна * / закінчує його, залишаючи весь наступний код синтаксичному аналізатору, який повідомляє про решту символах * / як про синтаксичну помилку Кращий спосіб тимчасово прибрати фрагмент з програми – або помістити / / на початку кожного рядка, або вставити конструкцію if (false):

if (false) {

/ / Викликати метод, коли він буде працювати

dwim()

}

Зрозуміло, даний фрагмент припускає, що метод dwim визначений десь в іншому місці програми

53 Лексеми

Лексемами (tokens) мови називаються слова, з яких складається програма Синтаксичний аналізатор розбиває вихідний текст на окремі лексеми і намагається зрозуміти, з яких операторів, ідентифікаторів і т д складається програма У мові Java символи-роздільники (пробіли, табуляція, переклад рядка і повернення курсору) застосовуються виключно для розділення лексем або вмісту символьних або строкових літералів Ви можете взяти будь-яку працюючу програму і замінити довільну кількість символів-роздільників між лексемами (тобто роздільників, що не входять в рядки і символи) на іншу кількість роздільників (не рівне нулю) – Це ніяк не вплине на роботу програми

Роздільники необхідні для відділення лексем один від одного, які б в іншому випадку представляли б собою одне ціле Наприклад, в операторі

return 0

не можна прибрати пробіл між return і 0, оскільки це призведе до появи неправильного оператора

return0

що складається всього з одного ідентифікатора return0 Додаткові роздільники полегшують читання вашої програми, незважаючи на те що синтаксичний аналізатор їх ігнорує Зверніть увагу: коментарі вважаються роздільниками

Алгоритм ділення програми на лексеми функціонує за принципом чим більше, тим краще: він відводить для наступної лексеми якомога більше символів, не піклуючись про те, що при цьому може статися помилка Отже, раз + + виявляється довшим, ніж +, вираз

j = i + + + + + i / / НЕВІРНО невірно інтерпретується як j = i + + + + + i / / НЕВІРНО замість правильного

j = i++ + ++i

54 Ідентифікатори

ІдентифікаториJava, використовувані для іменування оголошених у програмі величин (змінних і констант) і міток, повинні починатися з літери, символу підкреслення (_) або знака долара ($), за якими слідують букви або цифри в довільному порядку Багатьом програмістам це здасться знайомим, але у звязку з тим, що вихідні тексти Java-програм пишуться в кодуванні Unicode, поняття буква або цифра виявляється значно більш широким, ніж у більшості мов програмування Букви в Java можуть являти собою символи з вірменського, корейського, грузинського, індійського та практично будь-якого алфавіту, який використовується в наш час Отже, поряд з ідентифікатором kitty можна

користуватися ідентифікаторами maіka, кішка, ,

і / Ці слова означають кішка або кошеня англійською, сербо-хорватською, російською, фарсі, тамільською та японською мовами відповідно Якщо в інших мовах вони мають інше значення, ми щиро сподіваємося, що воно не є образливим в іншому випадку приносимо свої вибачення і запевняємо, що образа була ненавмисним / Терміни буква і цифра в Unicode трактуються досить широко, але якщо який-небудь символ вважається літерою або цифрою в деякому мовою, то, цілком ймовірно, він має аналогічний зміст і в Java Повні визначення цих понять наводяться в таблицях Цифри Unicode і Букви і цифри Unicode.

Будь-які розбіжності в символах, що входять до складу ідентифікаторів, роблять два ідентифікатора різними Регістр символів має значення:

і т д є різними ідентифікаторами Символи,

які виглядають однаково або майже однаково, неважко сплутати один з одним

Наприклад, латинська заголовна n (N) і грецька заголовна (N) виглядають практично однаково, проте їм відповідають різні символи Unicode (\ u004e і

\ U039d відповідно) Єдина можливість уникнути помилок полягає в тому,

щоб кожен ідентифікатор був написаний тільки на одній мові (і, отже, включав символи відомого набору), щоб програміст міг зрозуміти, що ви маєте на увазі – E або E / Одна з цих букв входить в кирилицю, а інша – в ASCII Відрізните одну від іншої, і ви отримаєте приз /

Ідентифікатори в мові Java можуть мати довільну довжину

541 Зарезервовані слова Java

Ключові слова Java не можуть використовуватися в якості ідентифікаторів Наведемо список ключових слів Java (слова, помічені символом *, зарезервовані, але в даний час не застосовуються):

abstract boolean break byte

double else extends final

int interface long native

super switch synchronized this

case catch char class const*

finally float for goto*

if

new package private protected public

throw throws transient* try

void

continue default do

implements import instanceof

return short static

volatile while

Хоча слова null, true і false зовні схожі на ключові, формально вони ставляться до ЛІТЕРАЛЬ (як, скажімо, число 12) і тому відсутні в наведеній вище таблиці Проте ви не можете використовувати слова null, true і false (як і 12) в якості ідентифікаторів, хоча вони і можуть входити до складу ідентифікатора Формально null, true і false не є ключовими словами, але до них відносяться ті ж самі обмеження

55 Примітивні типи

Деякі зарезервовані слова являють собою назви типів У Java

передбачені наступні примітивні типи:

boolean або true, або false

char 16-розрядний символ Unicode 115

byte 8-розрядне ціле зі знаком, доповнене за модулем 2 short 16-розрядне ціле зі знаком, доповнене за модулем 2 int 32-розрядне ціле зі знаком, доповнене за модулем 2 long 64-розрядне ціле зі знаком, доповнене за модулем 2 float 32-розрядне число з плаваючою точкою (IEEE 7541985) double 64-розрядне число з плаваючою точкою (IEEE 7541985)

Кожному з примітивних типів мови Java, за винятком short і byte, відповідає однойменний клас пакета javalang Значення типів short і byte завжди перетворюються в int перед виконанням будь-яких обчислень – Наведений вище формат використовується тільки для зберігання, але не для обчислень (див Тип виразу) У класах мови, службовців оболонками для примітивних типів (Boolean, Character, Integer, Long, Float і Double), також визначається ряд корисних констант і методів Наприклад, в класах-оболонках для деяких примітивних типів визначаються константи MIN_VALUE і MAX_VALUE

У класах Float і Double визначено константи NEGATIVE_INFINITY, POSITIVE_INFINITY і NaN, а також метод isNaN, який перевіряє, чи не є значення з плаваючою точкою «не-числом (Not a Number) – тобто результатом невірної операції, начебто ділення на нуль Значення NaN може використовуватися для позначення неприпустимого значення, подібно до того як значення null для посилань не вказує ні на який конкретний обєкт Класи-оболонки детально розглядаються в розділі 13

56 Літерали

Для кожного типу Java визначається поняття літералів, Які являють собою постійні значення даного типу Кілька наступних підрозділів описують способи запису літералів (неіменованого констант) у кожному з типів

561 Посилання на обєкти

Для посилань на обєкти існує всього один літерал – null Він може знаходитися всюди, де допускається використання посилання Найчастіше null представляє посилання на неприпустимий або неіснуючий обєкт null не відноситься ні до одного типу, навіть до типу Object

562 Логічні значення

У типі boolean є два литерала – true і false

563 Цілі значення

Цілі константи є послідовностями вісімкових, десяткових або шістнадцяткових цифр Початок константи визначає основу системи числення: 0 (нуль) позначає вісімкове число (підстава 8) 0x або 0X позначає шістнадцяткове число (підстава 16) будь-який інший набір цифр вказує на десяткове число (підстава 10) Наступні числа мають однакове значення:

29 035 0x1D 0X1d

Цілі константи відносяться до типу long, якщо вони закінчуються символом L або l, як

29L бажано користуватися L, тому що l легко сплутати з 1 (цифрою один) В іншому випадку вважається, що ціла константа відноситься до типу int Якщо літерал типу int безпосередньо присвоюється змінної типу short або byte і його значення знаходиться в межах діапазону допустимих значень для типу змінної, то операції з літералом здійснюються так, наче він відноситься до типу short або byte відповідно

564 Значення з плаваючою точкою

Число з плаваючою точкою представляється у вигляді десяткового числа з необовязковою десятковою крапкою, за яким (також необовязково) може слідувати порядок Число повинно містити як мінімум одну цифру Наприкінці числа може стояти символ F або f для позначення константи з одинарною точністю або ж символ d або D для позначення константи з подвійною точністю Наступні літерали позначають одне і те ж значення:

18 18e1 18E2

Константи з плаваючою точкою відносяться до типу double, якщо тільки вони не завершуються символом f або F – в цьому випадку вони мають тип float, як константа 180f Завершальний символ D або d визначає константу типу double Нуль може бути позитивним (00) або негативним (-00) Позитивний нуль дорівнює негативному, але при використанні в деяких висловах вони можуть призводити до різних результатів Наприклад, вираз 1d/0d одно +, а 1d/-0d одно –

Константа типу double не може присвоюватися змінної типу float, навіть якщо її значення лежить в межах діапазону float Для присвоювання значень змінним і полях типу float слід використовувати константи типу float або привести double до float

565 Символи

Символьні літерали полягають в апострофи – наприклад, Q. Деякі службові символи можуть представлятися у вигляді escape-послідовностей До їх числа належать:

\ N перехід на новий рядок (\ u000A)

\ T табуляція (\ u0009)

\ B забій (\ u0008)

\ R ввід (\ u000D)

\ F подача аркуша (\ u000C)

\ \ Зворотна коса риска (\ u005C)

\ Апостроф (\ u0027)

\ лапки (\ u0022)

\ Ddd символ в вісімковому поданні, де кожне d відповідає цифрі від 0 до 7

Вісімкові символьні константи можуть складатися з трьох або менш цифр і не можуть перевищувати значення \ 377 (\ u00ff) Символи, представлені в шістнадцятковому вигляді, завжди повинні складатися з чотирьох цифр

566 Рядки

Рядкові літерали полягають в подвійні лапки: along. У них можуть входити будь escape-послідовності, допустимі в символьних константах Рядкові літерали є обєктами типу String Більш детально про рядках розповідається в главі 8

Символи переходу на новий рядок не можуть перебувати в середині строкових літералів Якщо ви хочете вставити такий символ в рядок, скористайтеся escape-послідовністю \ n

У рядках може застосовуватися восьмерична запис символів, але для запобігання плутанини (у тих випадках, коли символи, представлені таким чином, сусідять з іншими символами) необхідно вказувати всі три вісімкові цифри Наприклад, рядок \ 0116 еквівалентна рядку \ t6, тоді як рядок \ 116 еквівалентна N.

57 Оголошення змінних

У оголошенні вказується тип, рівень доступу та інші атрибути ідентифікатора Оголошення складається з трьох частин: спочатку наводиться список модифікаторів, За ним слід тип, І на завершення слід список ідентифікаторів

Модифікатори можуть бути відсутні в оголошенні змінної Модифікатор static оголошує, що змінна зберігає своє значення після виходу з методу модифікатор final оголошує, що значення змінної присвоюється всього один раз, при її ініціалізації Модифікатор final може використовуватися тільки для полів

Тип в оголошенні вказує на те, які значення можуть приймати оголошуються величини і як вони повинні себе вести

Між оголошенням змінної окремо або одночасно з декількома іншими змінними немає ніяких відмінностей Наприклад, оголошення:

float [] x, y рівносильно float [] x float [] y

Оголошення можуть перебувати в довільному місці вихідного тексту програми Ви не

зобовязані ставити їх на початку класу, методу або блоку У загальному випадку,

ідентифікатором можна користуватися в будь-який момент після його оголошення в деякому блоці (див розділ Оператори та блоки), за одним винятком: нестатичні поля недоступні в статичних методах

Поля з модифікатором final повинні инициализироваться при оголошенні

Оголошенню члена класу може передувати один з декількох модифікаторів Модифікатори можуть слідувати в довільному порядку, але ми рекомендуємо виробити деякий угоду і дотримуватися його У цій книзі використовується наступний порядок: спочатку слідують модифікатори доступу (public, private або protected), потім static, потім synchronized, і, нарешті, final Використання єдиного порядку модифікаторів полегшує читання вихідного тексту програми

571 Значення імені

Кожен створений ідентифікатор існує в деякому просторі імен (namespace) Імена ідентифікаторів в межах одного простору імен повинні відрізнятися Коли ви використовуєте ідентифікатор для того, щоб привласнити імя змінної, класу або методу, то для визначення значення імені проводиться пошук в наступному порядку:

1 Локальні змінні, оголошені в блоці, циклі for або серед параметрів обробника виключень Блок являє собою один або кілька операторів, укладених у фігурні дужки Змінні також можуть оголошуватися під час ініціалізації в циклі for

2 Параметри методу або конструктора, якщо код входить в метод або конструктор

3 Члени даного класу або інтерфейсного типу, тобто його поля і методи, в тому числі всі успадковані члени

4 Імпортовані типи з явним імям

5 Інші типи, оголошені в тому ж пакеті

6 Імпортовані типи з неявним імям

7 Інші пакунки доступні в системі

У кожному з вкладених блоків або операторів for можуть оголошуватися нові імена

Щоб уникнути плутанини, ви не можете скористатися вкладенням для переобявленія параметра або ідентифікатора із зовнішнього блоку або оператора for Так, після появи локального ідентифікатора або параметра з імям über ви не можете

створити у вкладеному блоці новий, відмінний від нього ідентифікатор з тим же імям

über

Простори назв поділяються залежно від типу ідентифікатора Імя змінної може збігатися з імям пакета, типу, методу, поля або мітки оператора Вироджений випадок може виглядати наступним чином:

class Reuse {

Reuse Reuse(Reuse Reuse) { Reuse:

for (;) {

if (ReuseReuse(Reuse) == Reuse)

break Reuse

}

return Reuse

}

}

Описаний вище порядок перегляду означає, що ідентифікатори, оголошені всередині методу, можуть приховувати зовнішні ідентифікатори Зазвичай приховування ідентифікаторів вважається проявом поганого стилю програмування, оскільки при читанні програми доводиться переглядати всі рівні ієрархії, щоб зясувати, яка ж змінна використовується в тому чи іншому випадку

Вкладення областей видимості означає, що змінна існує лише в тому фрагменті програми, в якому планується її використання Наприклад, до змінної, оголошеної при ініціалізації циклу for, неможливо звернутися за межами циклу Нерідко це буває корисно, щоб код за межами циклу for не зміг визначити, при якому значенні керуючої змінної завершився цикл

Вкладення допомагає посилити роль локального коду Якби приховування зовнішніх змінних не допускалося, то включення нового поля в клас або інтерфейс могло б призвести до порушення роботи існуючих програм, в яких використовуються змінні з тим же імям Концепція областей видимості призначена скоріше для загального захисту системи, ніж для підтримки повторного використання імен

58 Масиви

Масив являє собою упорядкований набір елементів Елементи масиву можуть мати примітивний тип або бути посиланнями на обєкти, в тому числі і посиланнями на інші масиви Рядок

int[] ia = new int[3]

оголошує масив з імям ia, в якому спочатку зберігається три значення типу int

При оголошенні змінної-масиву розмір не вказується Кількість елементів у масиві задається при його створенні оператором new, а не при оголошенні Розмір обєкта-масиву фіксується в момент його створення і не може змінюватися надалі Зверніть увагу: фіксується саме розмір обєкта-масиву в наведеному вище прикладі ia може бути присвоєна посилання на будь-який масив іншого розміру

Перший елемент масиву має індекс 0 (нуль), а останній – індекс розмір-1 У нашому прикладі останнім елементом масиву є ia [2] При кожному використанні індексу перевіряється, чи лежить він в діапазоні допустимих значень При виході індексу за його межі збуджується виняток IndexOutOfBounds

Розмір масиву можна отримати з поля length Для нашого прикладу наступний фрагмент програми перебирає всі елементи масиву і виводить кожне значення:

for (int i =0 i &lt&lt ialength i++) Systemoutprintln(i + &quot: &quot + ia[i])

Масиви завжди є неявним розширенням класу Object Якщо у вас є клас X, що розширює його клас Y і масиви кожного з цих класів, то ієрархія буде виглядати наступним чином:

Завдяки цій обставині масиви поводяться полиморфно Ви можете присвоїти масив змінної типу Object, після чого здійснити зворотне перетворення Масив обєктів типу Y допускається використовувати усюди, де дозволено присутність масиву обєктів базового типу X

Як і до будь-яким іншим створеним обєктам, до масивів застосовується збірка сміття

Основне обмеження на обєктність масивів полягає в тому, що вони не можуть розширюватися для включення до них нових методів Так, наступна конструкція є неприпустимою:

class ScaleVector extends double[] { //

// ..

}

При оголошенні масиву обєктів ви насправді розкажете масив змінних відповідного типу Розглянемо наступний фрагмент:

Attr[] attrs = new Attr[12]

for (int i = 0 i &lt&lt attrslength i++)

attrs[i] = new Attr(names[i], values[i])

Після виконання першого оператора new, attrs містить посилання на масив з 12 змінних, ініціалізованих значенням null Обєкти Attr створюються тільки при виконанні циклу

Якщо ви побажаєте, Java допускає присутність квадратних дужок після змінної, а не після типу, як у наступному оголошенні:

int ia[] = new int[3]

Воно еквівалентно наведеному вище Проте перший варіант все ж вважається більш кращим, оскільки тип оголошується в одному місці

581 Багатовимірні масиви

Елементами масивів в Java можуть бути інші масиви Наприклад, фрагмент програми для оголошення і виведення двовимірної матриці може виглядати наступним чином:

float[][] mat = new float[4][4]

setupMatrix(mat)

for (int y = 0 y &lt&lt matlength y++) {

for (int x = 0 x &lt&lt mat[y]length x++) Systemoutprintln(mat[x][y] + &quot &quot)

Systemoutprintln()

}

Перший (лівий) розмір масиву повинен задаватися при його створенні Інші розміри можуть зазначатися пізніше Використання більш ніж однієї розмірності є скороченням для вкладеного набору операторів new Наведений вище масив може бути створений таким чином:

float[][] mat = new float[4][]

for (int y = 0 y &lt&lt matlength y++)

mat[y] = new float[4]

Одна з переваг багатовимірних масивів полягає в тому, що кожен вкладений

масив може мати свої розміри Ви можете імітувати роботу з масивом 4×4, але при цьому створити масив з чотирьох масивів типу int, кожен з яких має свою власну довжину, необхідну для зберігання його даних

Вправа 51

Напишіть програму, яка будує трикутник Паскаля до глибини 12 Кожен числовий ряд трикутника зберігається в масиві відповідної довжини, а масиви рядів заносяться в масив, елементами якого є 12 масивів типу int

Спроектуйте своє рішення так, щоб результати виводилися методом, який друкує вміст двовимірного масиву з використанням довжини кожного з вкладених масивів, а не константи 12 Тепер модифікуйте програму так, щоб в ній використовувалася константа, відмінна від 12, а метод виведення при цьому не змінився

59 Ініціалізація

Змінна може инициализироваться при її оголошенні Щоб задати початкове значень змінної, слід після її імені поставити = і вираз:

final double p = 314159

float radius = 10f / / Почати з одиничного радіуса

Якщо при оголошенні поля класу не инициализируются, то Java присвоює їм вихідні значення за замовчуванням Значення за замовчуванням залежить від типу поля:

Тип поля

Тип поля

boolean

false

char

‘\u0000’

ціле (byte, short, int, long)

0

з плаваючою точкою

+00 F або +00 d

посилання на обєкт

null

Java не привласнює жодних вихідних значень локальним змінним методу, конструктора або статичного ініціалізатора Відсутність вихідного значення у локальної змінної звичайно являє собою програмну помилку, і перед використанням локальних змінних їх необхідно ініціалізувати

Момент ініціалізації змінної залежить від її області видимості Локальні змінні инициализируются кожен раз, коли виконується їх оголошення Поля обєктів і елементи масивів инициализируются при створенні обєкта або масиву оператором new – див Порядок виклику конструкторів. Ініціалізація статичних змінних класу відбувається перед виконанням будь-якого коду, що відноситься до даного класу

Ініціалізатори полів не можуть порушувати перевіряються виключення або викликати методи, які можуть це зробити, так як не існує способу перехопити ці винятки Для нестатичних полів можна обійти дане правило, привласнюючи вихідне значення в конструкторі (конструктор може обробляти виключення) Для статичних полів аналогічний вихід полягає в тому, щоб привласнити початкове значення всередині статичного ініціалізатора, обробного виняток

591 Ініціалізація масивів

Щоб ініціалізувати масив, слід задати значення його елементів у фігурних дужках після його оголошення Наступне оголошення створює і ініціалізує обєкт-масив:

String[] dangers = { &quotLions&quot, &quotTigers&quot, &quotBears&quot }

Це рівносильно наступного фрагменту:

String[] dangers = new String[3]

dangers[0] = &quotLions"

dangers[1] = &quotTigers"

dangers[2] = &quotBears"

Для ініціалізації багатовимірних масивів може використовуватися вкладення ініціалізаторів окремих масивів Наведемо оголошення, в якому инициализируется матриця розмірів 4×4:

double[][] identityMatrix = {

{ 10, 00, 00, 00 },

{ 00, 10, 00, 00 },

{ 00, 00, 10, 00 },

{ 00, 00, 00, 10 },

}

Джерело: Арнольд К, Гослінг Д – Мова програмування Java (1997)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*