МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
“Технологія програмування на мові Java”
Методичні вказівки
до лабораторної роботи №1
з курсу “Об’єктно-орієнтоване програмування”
для студентів базового напрямку
6.0804 “Комп’ютерні науки”
ЗАТВЕРДЖЕНО
на засіданні кафедри “Системи автоматизованого проектування” Протокол № 1від 30.08.2010
ЛЬВІВ 2010 “Технологія програмування на мові Java”. Методичні вказівки до виконання лабораторної роботи №1 з курсу: “Об’єктно-орієнтоване програмування” для студентів базового напрямку 6.0804 “Комп’ютерні науки”.
Укладачі: Керницький А.Б., ст.викл., др.інж.
Каркульовський В.І., доцент, к.т.н.
Загарюк Р.В., асистент, к.т.н.
Відповідальний за випуск:
Рецензенти:
1. МЕТА РОБОТИ
Ознайомитися з технологією програмування із використанням пакета SDK та ECLIPSE, примітивними типами даних, операціями над ними.
2.КОРОТКІ ТЕОРЕТИЧНІ ВІДОМОСТІ
2.1. СТРУКТУРА ПРОГРАМИ НА МОВІ JAVA
Фірма SUN Microsystems – розробник технології Java - безкоштовно розповсюджує набір необхідних програмних інструментів для повного циклу роботи з цією мовою програмування: компіляції, інтерпретації, відлагодження, що включає і багату бібліотеку класів, під назвою JDK (Java Development Kit).
Java програма існує у вигляді класу. Вона починається службовим словом class, за яким іде назва класу, а далі, у фігурних дужках, тіло класу – поля змінних і методи:
Лістинг 2.1. Перша програма на мові Java
class Zero{
public static void main(String[] args){
System.out.println("Hello, World!");
}
}
Програма може бути написана у будь-якому текстовому редакторі, наприклад Notepad. Потім її потрібно зберегти у файлі, назва якого співпадає з назвою класу і з розширенням .java, у даному випадку Zero.java. Потім програму необхідно скомпілювати, що у даному випадку означає перевести її у байт коди. На комп’ютерах версія JDK може відрізнятися від тієї, яка описана у методичних вказівках (вони оновлюються майже щорічно). Те ж саме стосується і її місця знаходження на диску. Тому при потребі потрібно внести корективи у нижче наведену адресу папки bin. Знаходимо в комп’ютері програму Командная строка (CMD) і відкриваємо її.
Рис. 2.1. Програма Командная стрічка
Потрібно повернутися до кореневої директорії С, де знаходиться JDK. Для цього потрібно набрати у командному рядку сd C:\ і натиснути Enter (cd – change directory). Тепер потрібно викликати компілятор javac, що знаходиться у папці bin і вказати йому файл для компіляції (після натискання Enter компілятор створить файл с байт-кодами, дасть йому назву Zero.class і запише у біжучий каталог. Якщо все пройшло як потрбіно, Командная строка повернеться до кореневої директорії С).
Для запуску програми необхідно викликати інтерпретатор java (JVM), передавши йому в якості аргумента назву класа.
Рис. 2.2. Перша Java програма
На цьому прикладі можна зауважити низку суттєвих особливостей мови Java.
Будь-яка програма є одним або декількома класами. У прикладі є лише один клас (class).
Початок класу позначачється службовим словом class, за яким іде назва класу, що вибирається довільно. У даному випадку Zero. Все, що міститься у класі, записується у фігурних дужках і складає тіло класу (class body).
Всі дії виконуються за допомогою методів обробки інформації (method). Цей термін вживається у мові Java замість назви "функція", що використовується в інших мовах.
Методи розрізняються за іменами. Один із методів обов’язково повинен називатися main. З нього починається виконання програми. У прикладі лише один метод, тому його назва main.
Метод завжди повертає (returns) лише одне значення, тип якого обов’язково вказується перед назвою метода. Метод може і не повертати жодного значення, виконуючи роль процедури, як у прикладі. Тоді замість типу значення записується слово void.
Після назви метода у дужках через кому перераховуються аргументи (arguments) - або параметри метода. Для кожного аргумента вказується його тип і, через пробіл, назва. У прикладі лише один аргумент, його тип — масив, що складається з рядків символів. Рядок символів — це вбудований у Java API тип String, а квадратні дужки — ознака масива. Назва масива може бути довільною (у прикладі вибрана назва args).
Перед типом значення, що повертається методом, можуть бути записані модифікатори (modifiers). У прикладі їх два: слово public означає, що цей метод доступний з будь-якого місцяпрограми; слово static забезпечує можливість виклику метода main () у самому початку виконання програми. Модифікатори необов’язкові, але для метода main () вони необхідні.
У тексті після назви метода ставляться дужки, щоб підкреслити, що це є назва метода, а не простої змінної, а все, що містить метод, тіло метода (method body), записується у фігурних дужках.
Єдина дія, яку виконує метод main () у прикладі, полягає у виклику іншого метода зі складеною назвою System.out.println() і передачі йому на опрацювання одного аргумента – текстової константи "Hello, World!". Текстові константи записуються у лапках, які є тільки обмежувачами і не входять у склад тексту.
Складна назва System.out.println() означає, що у класі System, який входить у Java API, визначається змінна з назвою out, яка містить екземпляр одного із класів Java API - клас PrintStream. У ньому є метод println().
Дія метода println () полягає у виведенні свого аргумента у вихідний потік, який, як правило, пов’язаний з виведенням тексту на екран термінала. Після виведення курсор переходить на початок наступного рядка екрана, на що вказує закінчення ln, слово println – скорочення слів print line. У складі об’єкта out є метод print (), який залишає курсор у кінці виведеного рядка.
Для ознайомлення з іншими вбудованими методами класу System необхідно відкрити однойменний файл папки Java2.
Отже, всі Java-програми містять у собі чотирі основні елементи:
класи (classes) – елементи програми, що містять у собі змінні та методи;
інтерфейси (interfaces) – різновид класів, який викоритосвується у спеціальних випадках (реалізація множинного наслідування і протоколів);
змінні (variables) – елементи програми, в яких зберігаються дані;
методи (methods) – елементи програми, які виконують дії над даними (аналогічні функціям, процедурам і підпрограмам в інших мовах програмування);
пакети (packages) – група зв’язаних за змістом класів та інтерфейсів.
Для того, щоб використовувати класи та інтерфейси, які містяться у пакетах, необхідно зробити їх доступними у програмі. Для цього використовується оператор чи оператори import з назвою пакету та назвою класу пакету, який буде використовуватись, наприклад:
import java.util.Date;
виконує імпорт класу Date з пакету java.util.
Якщо необхідно використовувати декілька класів чи інтерфейсів з пакету, звичайно замість назви класу чи інтерфейсу ставиться символ "*", що вказує на те, що у даній програмі доступні всі класи та інтерфейси даного пакету, наприклад:
import java.awt.*;
виконує імпорт всіх класів з пакету java.awt.
Варто зауважити, що імпорт пакету java.lang задавати не потрібно, оскільки цей пакет імпортується у програми на мові Java по замовчуванню.
Також неоюхідно зробити важливе зауваження. Мова Java розрізняє великі і малі літери, назви main, Main, MAIN є різними з "точки зору" компілятора Java. У прикладі важливо писати String, System з великої літери, a main з маленької. У середині текстової константи не має значення чи писати World чи world. Компілятор не "дивиться" на неї і різниця буде помітна лише на екрані.
Свої назви можна записувати як завгодно, але між Java-програмістами заключено договір під назвою "Code Conventions for the Java Programming Language", з яким можна ознайомитися за адресою http://java.sun.com/docs/codeconv/index.html. Наведемо декілька пунктів з цього договору:
назви класів починаються з великої літери; якщо назва містить декілька слів, то кожне слово починається з великої літери;
назви методів і змінних починаються з малої літери; якщо назва містить декілька слів, то кожне наступне слово також починається з малої літери;
назви констант записуються повністю великими літерами; якщо назва містить декілька слів, то між ними ставиться знак підкреслювання.
Звичайно, ці правила є необов’язковими, але значно полегшують розуміння кода і надають програмі характерний для Java стиль.
2.2. ВСТАНОВЛЕННЯ SDK І СКЛАД SDK
Встановлення здійснюється автоматично і єдині параметри, які необхідно вказати –це місце розміщення та назва пакету, а також компоненти, що будуть встановлюватись.
При встановленні створюються наступні підкаталоги:
bin – виконувані модулі та утиліти SDK;
demo – демонстраційні приклади;
include – файли заголовків C та C++, які використовуються для побудови середовища Java;
lib – бібліотеки та архіви (в форматах .lib, .zip, та .jar), які використовуються SDK;
src – вихідний код бібліотек Java (якщо цей компонент включений).
Для того, щоб виконувані модулі та утиліти пакету SDK могли запускатися з будь-якого каталога без вказання шляху до них, необхідно додати в параметр команди PATH в autoexec.bat шлях до каталогу bin, наприклад: c:\jdk1.3\bin\ (або додати її вручну у змінні середовища);
Крім того, Java використовує змінну середовища CLASSPATH для вказання шляху до класів Java. Якщо SDK встановлений у каталог за замовчуванням, тоді змінну СLASSPATH можно не встановлювати, інакше її необхідно встановити в autoexec.bat за допомогою команди SET CLASSPATH=назва-каталога
2.3. ТЕХНОЛОГІЯ ПРОГРАМУВАННЯ НА МОВІ JAVA З ВИКОРИСТАННЯМ SDK
Текст програми на мові Java перетворюється у спеціальні команди (байт-коди) віртуальної машини Java, які не залежать від конкретної комп’ютерної платформи та операційної системи. У свою чергу, при виконанні програми, байт-коди перетворюються у команди процесора та одразу ж виконуються (режим інтерпретації).
Рис.2.3. Забезпечення багатоплатформенності мови Java
Необхідно звернути увагу на те, що під час компіляції вказується повна назва файлу з текстом програми (з розширенням .java), а при запуску інтерпретатора – назва файлу, який містить байт-коди.
Файли компілятора javac.exe та інтерпретатора java.exe знаходяться у підкаталозі bin каталогу, який містить SDK, і є програмами, які виконуються в режимі командного інтерпретатора (Windows NT/2000/XP/2003) чи MS DOS (Windows 95/98).
Команда запуску програми javac має насутпний вигляд:
javac [опції] [вихідні файли] [@файли]
Вказані аргументи можуть йти у довільному порядку.
Якщо виконується компіляція одного чи декількох вихідних файлів, їх можна задати в командній стрічці, відокремивши один від одного пробілами. Іншим рішенням є запис назв файлів, які будуть компілюватися, в окремому файлі і вказати назву цього файлу в параметрі @файли.
Основні опції програми javac наведені нижче:
classpath – встановлення шляху до каталогів, де розміщуються класи користувача;
sourcepath – встановлення шляху до каталогів, де розміщуються вихідні файли користувача;
d каталог – вказування каталогу, в якому будуть міститися відкомпільовані програми;
g – виведення всієї відлагоджувальної інформації про файли, включаючи локальні змінні;
verbose – виведення інформації про кожний завантажений клас та кожний відкомпільований вихідний файл.
Команда запуску програми java має такий вигляд:
java [опції] клас [параметри ...]
java [опції] -jar назва-jar-файлу [параметри ...]
Клас – це назва класу (без розширення .class), який має бути виконаний.
Назва-jar-файлу – назва архіву, де знаходиться клас, який має бути виконаний (використовується тільки разом із опцією -jar).
Параметри – параметри командної стрічки, які передаються у метод main (відділяються один від одного пробілами).
Основні опції програми java наведені нижче:
classpath або cp – встановлення шляху до каталогів, де розміщуються класи користувача;
showversion – виведення повідомлення про версію та продовження роботи;
verbose або (verboseclass) – виведення інформації про кожний завантажений клас.
2.4. КОМЕНТАРІ У ПРОГРАМІ
У тексті програми можна вставляти коментарі, які компілятор не буде враховувати. У період налаштування можна виключати з програми один або декілька операторів, помітивши їх символами коментаря (“закоментувати). Коментарі вводяться наступним чином:
за двома похилими рисками //, без пробілу між ними, починається коментар, що продовжується до кінця рядка;
за похилою рискою і зірочкою /* починається коментар, котрий може займати декілька рядків, до зірочки і похилої риски */ (без пробілів між цими знаками).
Коментарі дуже зручні для читання і розуміння коду, вони перетворюють програму в документ, що описує її дії. Програму з хорошими коментарями називають самодокументованою. Тому в Java введені коментарі третього типу, а в склад JDK — програму javadoc, яка поміщає ці коментарі в окремі файли формату HTML і створює гіперпосилання між ними: за похилою рискою і двома зірочками підряд, без пробілів, /** починається коментар, який може займати декілька рядків до зірочки з однією похилою рискою */ і опрацьовується програмою javadoc. У такий коментар можна вставити вказівки програмі javadoc, які починаються символом @. Таким чином створюється документація в JDK. Додамо коментарі до нашого прикладу (лістинг 2.2).
Лістинг 2.2. Перша програма з коментарями
class HelloWorld{
/**
*Пояснення змісту і особливостей програми...
* @author Ім’я Прізвище (автора)
* @version 1.0 (версія програми)
*/
// HelloWorld — це лише назва
// Наступний метод починає виконання програми
public static void main(String[] args){ // args не використовується
/* Наступний метод просто виводить свій аргумент на екран дисплея */
System.out.println("Hello, 21st Century World!");
// наступний виклик закоментований, метод не буде виконуватися
// System.out.println("Farewell, 20th Century!");
}
}
Зірочки на початку стрічки не відіграють жодної ролі, вони лише допомагають слідкувати за коментарем. Приклад 2.2. звичайно перевантажений поясненнями (це поганий стиль), тут просто показані різні форми коментарів.
2.5. КОНСТАНТИ
У мові Java можна записувати константи різних типів у різних виглядах. Перерахуємо їх.
2.5.1. ЦІЛІ КОНСТАНТИ
Цілі константи можна записувати у трьох системах числення:
у десятковій формі: +5, -7, 12345678;
у вісімковій формі, починаючи з нуля: 027, -0326, 0777; в записі таких констант неприпустимими є цифри 8 і 9;
у шістнадцятковій формі, починаючи з нуля і латинської літери х або X: 0xff0a, 0xFC2D, 0x45a8, 0X77FF; тут великі і малі літери не розрізняються.
Цілі константи зберігаються у форматі типу int (див. нижче).
У кінці цілої константи можна записати велику літеру L або малу l (рекомендують не використовувати, тому що її легко сплутати з одиницею), тоді константа буде зберігатися у довгому форматі типу long (див. нижче): +25L, -0371, 0xffL, 0xDFDF1.
2.5.2. Дійсні константи
Дійсні константи записуються лише в десятковій системі числення в двох формах:
з фіксованою крапкою: 37.25, -128.678967, +27.035;
з плаваючою крапкою: 2.5е34, -0.345е-25, 37.2Е+4; можна писати велику або малу латинську літеру Е; пробіли і дужки неприпустимі.
У кінці дійсної константи можна поставити літеру F або f, тоді константа буде зберігатися у форматі типу float (див. нижче): 3.5f, -45.67F, 4.7e-5f. Можна вказувати і літеру D (або d): 0.045D, -456.77889d, що означає тип double, але це зайве, оскільки дійсні константи і так зберігаються у форматі типу double.
2.5.3. Символьні константи
Для запису одиничних символів використовуються наступні форми:
Друковані символи можна записувати в апострофах: 'а', 'N', '?'. Чкщо замініть у програмі HelloWorld команду System.out.println("Hello, World!") на System.out.println('H'), тоді буде надрукована літера Н. Якщо ж написатиSystem.out.println('Hello, World!'), тоді компілятор відмовиться працювати з такою програмою.
Керуючі символи записуються в апострофах з оберненою похилою рискою:
'\n' — символ переведення рядка newline з кодом ASCII 10;
'\r' — символ повернення каретки CR з кодом 13;
'\f' — символ переведення сторінки FF з кодом 12;
'\b' — символ повернення на крок BS з кодом 8;
'\t' — символ горизонтальної табуляції НТ з кодом 9;
'\\' — обернена похила риска;
'\"' — лапка;
'\'' — апостроф.
Код будь-якого символу з десятковим кодуванням від 0 до 255 можна задати, записавши його не більше ніж трьома цифрами у вісімковій системі числення в апострофах після оберненої похилої риски: '\123' — буква S, '\346' — буква “ц”. Не рекомендується використовувати цю форму запису для друкованих і керуючих символів, перерахованих у попередньому пункті, оскільки компілятор переведе вісімковий запис у вказану вище форму. Найбільший код '\377' — десяткове число 255.
Код будь-якого символу у кодуванні Unicode набирається в апострофах після оберненої похилої риски, латинської літери u і чотирма шістнадцятковими цифрами: '\u0053' — буква S, '\u0416' — знак питання ?.
Спробуйте програму з командами System.out.println('\123'); System.out.println('\346'); System.out.println('\u0053'); System.out.println('\u0416');
Символи зберігаються у форматі типу char (див. нижче).
Великі кириличні літери у кодуванні Unicode займають діапазон від '\u0410' — велика літера А, до '\u042F' — велика літера Я, малі літери '\u0430' — а, до '\044F' — я.
У якій би формі не записувалися символи, компілятор переводить їх в Unicode, включаючи і вихідний текст програми, оскільки і компілятор, і виконуюча система Java працюють тільки з кодуванням Unicode.
2.5.4. Рядкові константи
Рядки символів поміщаються у лапки. Керуючі символи і коди записуються в рядках точно так само, з оберненою похилою рискою, але без апострофів, і викликають ті самі дії. Рядки можуть розташовуватися лише в одному рядку вихідного кода. Заборонено відкриваючі лапки ставити в одному рядку, а закриваючі — у наступному.
Приклади:
"Цей рядок\nз переносом"
"\"Карпати\" — Чемпіон!"
Для рядкових констант визначена операція з’єднання і позначається плюсом.
" Зєднання " + "рядків" дає в результаті рядок "Зєднання рядків".
2.6. ІМЕНА (НАЗВИ)
Імена (names) змінних, класів, методів і інших об’єктів можуть бути простими (загальна назва — ідентифікатори (idenifiers)) і складними (qualified names). Ідентифікатори в Java складаються з так званих літер Java (Java letters) і цифр 0 - 9, причому першим символом ідентифікатора не може бути цифра. У число літер Java обов’язково входять великі і малі латинські літери, знак долара $ і знак підкреслювання _, а також символи національних алфавітів.
Рекомендується не вживти в назвах знак долара. Компілятор Java використовує його для запису назв вкладених класів.
Приклади правильних ідентифікаторів: a1 , my_var, var3_5, _var, veryLongVarName, aName, theName, a2Vh36kBnMt456dX
У назвах краще не вживати малу літеру l, яку легко сплутати з одиницею, і літеру О, котру легко прийняти за нуль.
У класі Character, що входить до складу Java API, є два методи, які перевіряють, чи придатний даний символ для використання в ідентифікаторі: isJavaIdentifierStart() перевіряє чи є символ літерою Java придатною для першої літери ідентифікатора та isJavaldentifierPart(), який виясняє, чи можна взагалі вживати цей символ в ідентифікаторі. Спробуйте наступні дві програми щоби побачити який із ASCII символів на що придатний.
class Test {
public static void main(String[] args) {
for (int i = 0; i < 256; i++)
{ if (Character.isJavaIdentifierStart((char)i))
System.out.println(Integer.toString(i)+ " " + (char)i + " is Java Identifier Start Symbol" );
else
System.out.println(Integer.toString(i)+ " " + (char)i + " isn't Java Identifier Start Symbol" );
}
}
}
і
class Test {
public static void main(String[] args) {
for (int i = 0; i < 256; i++)
{ if (Character.isJavaIdentifierPart((char)i))
System.out.println(Integer.toString(i)+ " " + (char)i + " is Java Identifier Part Symbol" );
else
System.out.println(Integer.toString(i)+ " " + (char)i + " isn't Java Identifier Part Symbol" );
}
}
}
Службові слова Java, такі як class, void, static, є зарезервованими, їх не можна використовувати в якості ідентифікаторів.
Складна назва (qualified name) — це декілька ідентифікаторів, розділених крапками без пробілів, наприклад, System.out.println.
2.7. ПРИМІТИВНІ ТИПИ ДАНИХ І ОПЕРАЦІЇ
2.7.1. Загальна класифікація
Всі типи вихідних даних, вбудованих у мову Java, діляться на дві групи: примітивні типи (primitive types) и ссилочні типи (reference types).
Ссилочні типи діляться на масиви (arrays), класи (classes) та інтерфейси (interfaces).
Примітивних типів є вісім. Їх можна розділити на логічний тип boolean і числові (numeric). До числових типів відносяться цілі (integеr) та дійсні (floating-point) типи. Цілих типів п’ять: byte, short, int, long, char.
Символи можна використовувати всюди, де вживається тип int, тому JLS зараховує їх до цілих типів. Наприклад, їх можна використовувати в арифметичних обчисленнях, скажімо, можна написати 2 + 'b', до двійки буде доданий ASCII код 98 літери 'b' і в результаті додавання одержимо 100. У записі 2 + "b" плюс розуміється як з’єднання рядків, двійка буде перетворена у рядок, в результаті одержимо рядок "2b".
Дійсних типів є два: float і double. Оскільки за назвою змінної неможливо визначити її тип, всі змінні обов’язково повинні бути описані перед їх використанням. Описання полягає у тому, що записується назва типу, потім, через пробіл, список назв змінних, розділених комою. Для всіх або деяких змінних можна вказати початкові значення після знака рівності, якими можуть бути будь-які константні вирази цього ж типу. Опис кожного типу закінчується крапкою з комою. У програмі може бути скільки завгодно описів кожного типу.
Слід пам’ятати, що Java — мова зі строгою типізацією (strongly typed language).
2.7.2. Логічний тип
Значення логічого типу boolean виникають у результаті різних порівнянь, наприклад, 2 > 3, і використовуються, головним чином, в умовних та циклічних операторах. Логічних значень є два: true (вірно) і false (невірно). Це службові слова Java. Описан змінних цього типу виглядає наступним чином:
boolean b = true, bb = false, bool2;
Над логічними даними можна виконувати операції присвоювання, наприклад, bool2 = true, у тому числі й сумісні з логічними операціями; порівняння на рівність b == bb і на нерівність b != bb, а також логічні операції.
2.7.3. Логічні операції
Логічні операції:
заперечення (NOT) ! (позначається знаком оклику);
кон’юнкція (AND) & (амперсанд);
диз’юнкція (OR) | (вертикальна риска);
виключне АБО (XOR) ^ (каре).
Ці операції виконуються над логічними даними, їх результатом буде також логічне значення true або false. Нагадаємо таблицю логічних операцій:
Таблиця 2.1. Логічні операції
b1
b2
!b1
b1&b2
b1|b2
b1^b2
true
true
false
true
true
false
true
false
false
false
true
true
false
true
true
false
true
true
false
false
true
false
false
false
Словами ці правила можна виразити так:
заперечення змінює значення істинності;
кон’юнкція вірна, тільки якщо обидва операнди вірні;
диз’юнкція невірна, тільки якщо обидва операнди невірні;
виключне АБО вірне, тільки якщо значення операндів є різними.
Крім перерахованих чотирьох логічних операцій існує ще дві логічні операції скороченого обчислення:
скорочена кон’юнкція (conditional-AND) &&;
скорочена диз’юнкція (conditional-OR) ||.
Здвоєні знаки амперсанда і вертикальної риски необхідн записувати без пробілів. Правий операнд скорочених операцій обчислюється тільки у тому випадку, якщо від нього залежить результат операції, тобто якщо лівий операнд кон’юнкції має значення true, або лівий операнд диз’юнкції має значення false.
Це правило дуже зручне і часто використовується , наприклад, можна записувати вирази (n != 0) && (m/n > 0.001) або (n == 0) || (m/n > 0.001) не боячись ділення на нуль.
2.7.4. Цілі типи
Специфікація мови Java, JLS, визначає розрядність (кількість байтів, що відводяться для зберігання значень типу в оперативній пам’яті) і діапазон значень кожного типу. Для цілих типів вони наведені у табл. 2.2.
Таблиця 2.2. Цілі типи
Тип
Розрядність (байт)
Діапазон
byte
1
від -128 до 127
short
2
від -32768 до 32767
int
4
від -2147483648 до 2147483647
long
8
від -9223372036854775808 до 9223372036854775807
char
2
від '\u0000' до '\uFFFF', у десятковій формі від 0 до 65535
Для Java розрядність не настільки важлива, оскільки на деяких комп’ютерах вона може відрізнятися від наведеної у таблиці, Проте діапазон значень повинен витримуватись беззастережно.
Хоча тип char займає два байти, в арифметичних обчисленнях він працює як тип int, йому виділяється 4 байти, два старших байти заповнюються нулями.
Приклади визначення змінних цілих типів:
byte b1 = 50, b2 = -99, bЗ;
short det = 0, ind = 1;
int i = -100, j = 100, k = 9999;
long big = 50, veryBig = 2147483648L;
char c1 = 'A', c2 = '?', newLine = '\n';
Цілі типи зберігаються у двійковому вигляді з додатковим кодом. Останнє означає, що для від’ємних чисел зберігається не їх двійкове представлення, а доповняльний код цього двійкового представлення.
Доповнюючий код отримують наступним: у двійковому представленні всі нулі замінюються на одиниці, а одиниці на нулі, після чого до результату додається одиниця.
Наприклад, значення 50 змінної b1, визначеної вище, буде зберігатися в одному байті з вмістом 00110010, а значення -99 змінної b2 — у байті із вмістом, який обчислюється таким чином: число 99 переводиться у двійкову форму, одержується 01100011, одиниці міняються з нулями, одержується 10011100, і додається одиниця. Миодержали байт із вмістом 10011101.
Над цілими типами можна виконувати велику кількість операцій. Їх набір визначився у мові С. Особливості застосування цих операцій у мові Java показані на прикладах.
2.7.5. Операції над цілими типами
Всі операції, які виконуються над цілими числами, можна розділити на наступні групи.
2.7.5.1. Арифметичні операції
До арифметичних операцій відносяться:
додавання + (плюс);
віднімання - (дефіс);
множення * (зірочка);
ділення / (похила риска — слеш);
остача від ділення (ділення по модулю) % (процент);
інкремент (збільшення на одиницю) ++;
декремент (зменьшення на одиницю) - -
Між спареним плюсами і мінусами не можна залишати пробіли. Додавання, віднімання і множення цілих значень виконується як звичайно, а от ділення цілих значень в результаті дає знову ціле (так зване "ціле ділення"), наприклад, 5/2 дасть у результаті 2, а не 2.5, а 5/(-3) дасть -1. Дробова частина відкидається.
Операція ділення за модулем визначається наступним чином: а % b = а - (а / b) * b; наприклад, 5%2 дасть в результаті 1, а 5% (-3) дасть 2, тому що 5 = (-3) * (-1) + 2, але (-5)%3 дасть -2, оскільки -5 = 3 * (-1) - 2.
Операції інкремент і декремент означають збільшення або зменшення значення змінної на одиницю і застосовуються тільки для змінних, а не для констант чи виразів, не можна написати 5++ або (а + b)++. Ці операції можна записати і перед змінною: ++i, - - j. При першій формі запису (постфіксній) у виразі приймає участь старе значення змінної і лише потім відбувається збільшення чи зменшення її значення. При другій формі запису (префіксній) спочатку зміниться змінна і її нове значення буде приймати участь у виразі.
2.7.5.2. Приведення типів
Результат арифметичної операції має тип int, крім того випадку, коли один із операндів є типу long. У цьому випадку результат буде типу long.
Перед виконанням арифметичної операції завжди відбувається підвищення (promotion) типів byte, short, char. Вони перетворюються у тип int, а може бути, і в тип long, якщо інший операнд має тип long. Операнд типу int підвищується до типу long, якщо інший операнд є типу long. Звичайно, числове значення операнда при цьому не змінюється.
Це правило приводить інколи до неочікуваних результатів. Спроба скомпілювати програму, представлену у лістинзі 2.3, призведе до повідомлення компілятора про помилку:
Лістинг 2.3. Невірне визначення змінної
class InvalidDef{
public static void main (String [] args) {
byte b1 = 50, b2 = -99;
short k = b1 + b2; // Невірно!
System.out.println("k=" + k);
}
}
Це повідомлення означає, що у файлі InvalidDef.java, у рядку 4, виявлена можлива втрата точності (possible loss of precision). Потім приводиться виявлений (found) і потрібний (required) типи, виводиться рядок, в якому виявлена (а не зроблена) помилка, і відмічається символ, при аналізі якого знайдена помилка. У кінці вказано загальну кількість виявлених (а не зроблених) помилок (1 error).
У таких випадках потрібно виконувати явне приведення типу. У даному випадку це буде звуження (narrowing) типу int до типу short. Воно здійснюється операцією явного приведення, яка записується перед потрібним значенням у вигляді імені типу в дужках. Визначення short k = (short)(b1 + b2); буде вірним.
Звуження відбувається просто відкиданням старших бітів, що необхідно враховувати для великих значень. Наприклад, визначення byte b = (byte) 300; присвоїть змінній b значення 44. Дійсно, у двійковому представленні числа 300, рівному 100101100, відкидається старший біт і отримується 00101100. Таким чином можна привести і явне розширення (widening) типу, якщо в цьому є необхідність.
Якщо результат цілої операції виходить за діапазон свого типу int або long, то автоматично відбувається приведення за модулем, який рівний довжині цього діапазона, і обчислення продовжуються, переповнення жодним чином не відбувається.
2.7.5.3. Операції порівняння
У мові Java існує шість звичайних операцій порівняння цілих чисел за величиною:
більше >;
менше <;
більше або дорівнює >=;
менше або дорівнює <=;
дорівнює ==;
не дорівнює !=.
Спарені символи записуються без пробілів, їх не можна переставляти місцями, запис => будет невірним. Результат порівняння — логічне значення: true, в результаті, наприклад, порівняння 3 != 5; або false, наприклад, в результаті порівняння 3 == 5.
Для запису складних порівнянь необхідно застосовувати логічні операції. Наприклад, в обчисленнях часто приходиться здійснювати перевірку типу а < х < b. Подібний запис у мові Java призведе до повідомлення про помилку, оскільки перше порівняння, а < х, дасть true або false, a Java не знає, більше це, ніж b, чи менше. У даному випадку необхідно написати вираз (а < х)