|
|
ОБ’ЄКТНО ОРІЄНТОВАНЕ ПРОГРАМУВАННЯ Електронний посібник |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Модуль 5 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
5. Основні можливості платформи Java 5.1. Нові ідентифікатори, ключові слова та типи
даних 5.2. Поглиблене використання виразів, керування
виконанням програми 5.3. Поглиблене використання масивів
Ідентифікатор
обов’язково має починатися з літери. Мова Java
розрізняє рядкові та прописні літери як різні. Це означає, що ідентифікатор з
іменем MAX відрізняється від ідентифікатора з іменем Max
– це два різних імені. Приклади імен:
Примітивні типи
даних можна використовувати
безпосередньо або для створення власних типів класів. Примітивні типи служать
основою для всіх інших типів даних. В Java
визначені 8 примітивних (простих) типів даних:
Примітивні типи
доцільно використовувати в програмах, тому що це суттєво збільшує її
продуктивність. Якщо реалізувати примітивні типи у вигляді об’єктів, то
це призвело б до суттєвого зниження продуктивності. Примітивні типи мають
строго визначений діапазон допустимих значень.
До цілочисельних типів даних належать такі типи:
В Java не існує беззнакових цілочисельних типів даних. Довжина цілочисельних типів даних наступна:
В Java до типів з плаваючою точкою (дійсних типів)
належать типи:
До типу float
належать числові значення одинарної точності. До типу double
належать числові значення подвійної точності. Змінна типу float займає 32 біти в пам’яті. Змінна типу double
займає 64 біти. В Java для представлення символів введено тип даних char. Змінні типу char
займають в пам’яті комп’ютера 16 біт. Це пов’язано з тим, що для
представлення символів char в Java використовується кодування Юнікод
(Unicode). Діапазон допустимих значень цього типу
складає від 0 до 65535. Використання кодування Unicode
пов’язане з тим, що програми на Java
використовуються у всьому світі. Тип boolean
призначений для зберігання логічних значень. Змінні типу boolean
можуть приймати тільки два значення: true або false.
Номер заняття: 27–28
Вирази є важливими
будівельними блоками будь-якої програми Java, яка зазвичай створюється для створення нового
значення, хоча іноді вираз присвоює значення змінній. Вирази будуються з
використанням значень, змінних, операторів та викликів методів. З точки зору
синтаксису мови Java, вираз є подібним до
речення в англійській мові, яке відображає конкретне значення. За
правильної пунктуації воно іноді може стояти самостійно, хоча це може бути і
частиною речення. Деякі вирази прирівнюються до висловлювань самі по собі
(додаючи крапку з комою в кінці), але частіше вони складають частину
висловлювання. Наприклад,
Можна сказати, що
вираз є реченням, а висловлювання – повним реченням, оскільки воно утворює
повну одиницю виконання. Однак вираз не повинен містити кілька виразів. Ви
можете перетворити простий вираз на твердження, додавши крапку з комою:
У виразах часто
присутні математичні функції. Для використання математичних функцій слід
скористатися бібліотекою Math. Основні функції і
константи класу Math:
Арифметичні оператори використовуються в математичних виразах так само як
і в алгебрі і представлені в таблиці:
Java визначає ряд порозрядних (побітових) операторів,
що можуть застосовуватися до цілочисельних типів, long,
int, short, char та byte.
Ці оператори виконують дії над окремими розрядами (бітами) їхніх операндів.
Наступна таблиця наводить список даних операторів:
Булеві логічні оператори застосовуються для операндів типу boolean, результатом є булева
величина.
В операторів
програмування, як і в математичних операторів, є своя першочерговість (пріоритет).
Наприклад, операція множення виконується раніше за додавання. І як і в
математиці для зміни першочерговості операцій використовуються дужки. Якщо ви
невпевнені в якій послідовності будуть виконуватися дії, то використайте їх
для прямого вказання порядку виконання операцій у виразі. Крім того,
використання дужок не впливає на ефективність виконання трансльованої
програми і покращує читабельність програми. Наступна таблиця
вказує на першочерговість операцій – зверху донизу.
Java, як і інші мови програмування, підтримує умовні
інструкції та цикли, що визначають порядок виконання інструкцій у програмі. В
англійській мові для цього поняття застосовують термін control flow – керування потоком. Перед тим як
знайомитись з керуючими структурами, спочатку необхідно ознайомитися з
блоками.
Проте не можна визначати
однакові змінні в двох вкладених блоках (на відміну від С++, де це
можливо). Умовний оператор в Java має форму:
Умова має бути
оточена дужками і, якщо, умова задовольняється (true)
буде виконана інструкція за умовою, інакше вона не буде виконана, а буде
виконана наступна після умовної інструкція. Зазвичай, необхідно
виконати не одну інструкцію, в такому разі інструкції розміщають у блоці:
В такому разі за
істинності умови, виконуються всі інструкції у блоці, якщо умова невірна, то
виконується наступна інструкція після закриваючої дужки блоку. Якщо ж
необхідно здійснити певну дію в разі невиконання умови, то застосовують
умовну інструкцію наступного виду:
Інструкції if можуть йти одна за одною без використання else:
Для того, щоб
програма була читабельнішою, бажано застосовувати
фігурні дужки:
Вони нічого не
змінюють, але вираз стає зрозумілішим. Інструкція чи блок інструкцій
виконується лише за виконання усіх умов. Щоправда цю інструкцію
можна також переписати, ускладнивши умову, використавши булевий оператор і
(&&):
Можна також
використовувати повторюваність інструкцій if….else. Це дає можливість
перевірити ряд умов, якщо попередні умови не виконуються.
Загальний вигляд:
Якщо немає фігурних
дужок, то перша інструкція, яка йде після оголошення циклу, вважається тілом циклу. Всі інші
інструкції знаходяться поза циклом. Якщо в циклі повинні виконуватись кілька
інструкцій, то необхідно використати фігурні дужки. Вони також можуть
використовуватись у одній інструкції заради кращого візуального розуміння
коду.
Якщо необхідно, щоб
умова виконувалася хоча б один раз, можна скористатися циклом з післяумовою do/while:
Приклад використання:
Наведений вище
приклад виведе на консолі в стовпчик числа від 1 до 10. Як бачимо, в умові
циклу перший слот відводиться для ініціалізації
змінної, причому оголосити змінну можна і в іншому місці. Другий слот – для умови, яка перевіряється перед виконанням ітерації,
третій слот – вказує як модифікувати
змінну-лічильник. Тобто в наведеному прикладі за кожного виконання ітерації,
лічильник "і" буде збільшуватися на одиницю, поки не стане рівним
десяти. Найчастіше цей цикл
використовується для перебору елементів масиву.
Починаючи з java SE 5.0 в мові з’явився новий цикл – покращений for, призначенням якого є перебір елементів масиву
або подібних до масиву типів даних (колекції). Загальний вигляд
циклу наступний:
Наприклад, вивести
елементи масиву можна таким чином:
Використання цього
циклу дозволяє уникнути проблем, пов’язаних з помилками при заданні умови в
класичному циклі for. В інших мовах програмування цикл такого виду так і
називається foreach, проте, щоб
уникнути необхідності значних змін в пакетах, в Java
пішли простішим шляхом і перевантажили цикл for. В Java
відсутня інструкція goto, яка дозволяла переходити в будь-яке місце в
програмі. Її використання давно вважається поганим стилем програмування,
оскільки робить текст програми заплутаним. Про це, зокрема, писав ще Дональд
Кнут і він же зазначав, що інколи все таки
корисно її застосовувати, щоб припинити виконання певного методу, циклу чи
блоку і вийти за їхні межі. Для цієї мети в Java
існують спеціальні інструкції. Зокрема інструкцію break можна використати
для передчасного виходу з циклу. Якщо ми використовуємо вкладені цикли
(один цикл в іншому), то інструкція break припинить
цикл, в якому вона знаходиться. Якщо вона знаходиться у внутрішньому циклі,
то він припинить своє виконання, а зовнішній же цикл буде виконуватись і
далі. Якщо потрібно повністю припинити виконання і внутрішнього, і
зовнішнього, то використовується інструкція break з міткою. Якщо ж нам не
потрібно виходити з циклу, а лише припинити певну його ітерацію, то
для цього використовується інструкція continue,
яка переносить порядок виконання до заголовку
інструкції. Щоправда завжди
можна обійтися без цих інструкцій, змінивши логіку програми. Деякі з
програмістів уникають використовувати інструкції break
та continue. Інструкція if/else може бути доволі громіздкою, якщо необхідно
здійснити множинний вибір з багатьох альтернатив. Тож як і в С/C++ в Java
існує інструкція switch, яка здійснює вибір з багатьох варіантів. Щоправда
вона дещо незграбна і деякі програмісти вважають за краще уникати її
використання. До версії Java 7, яка вийшла у 2011 році, case
мітка мала бути лише цілим числом або нумерованою константою. Починаючи із
Java 7, можна перевіряти таким чином на рівність
також рядки.
Це доволі зручний
засіб групування інформації. Масиви можна створювати з елементів будь-якого
типу. До конкретного елементу в масиві звертаються за індексом (номером).
Вони можуть бути як одновимірні, так і багатовимірні.
Загальний формат
оголошення такого масиву: Наприклад,
Існує також інша
форма оголошення масиву:
Проте для того, щоб
масив почав існувати, необхідно виділити під нього пам'ять за допомогою
операції new.
де розмір – планована
кількість елементів у масиві.
або зразу ж:
Таким чином
відбувається виділення пам'яті під масив і ініціалізація елементів масиву
нулями. В подальшому можна напряму звертатися до елементів масиву, вказуючи
індекс у квадратних дужках. Нумерація елементів у масиві в Java
відбувається з нуля. Тобто в наведеному прикладі звернення до першого
(нульового) елемента – month_days[0], а до останнього – month_days[11]. Java не
дозволить програмі звернутися поза межі масиву, щоправда помилка буде вказана
лише на етапі виконання програми через викидання винятку (виключення, exception).
Масиви також можна ініціалізувати зразу ж при їхньому оголошенні, не
використовуючи операції new, аналогічно як це
відбувається при роботі з простими типами даних. Як бачимо, спочатку
змінній max присвоюється
значення нульового елементу масиву, після чого в циклі іде послідовне
порівняння з кожним наступним числом до останнього. Якщо при порівнянні
чергове значення в масиві більше за максимальне в змінній max, то змінній max присвоюється це
значення. Як ви уже зрозуміли, після закінчення циклу у змінній max міститиметься
максимальне значення, яке і буде виведене на консоль: Максимальне число в масиві: 3.2 В Java масиви є об’єктами (про об’єкти ми вже
говорили раніше), що забезпечує деяку додаткову функціональність масивам.
Зокрема можна дізнатися довжину масиву наступним чином array.length. Для вищенаведеного прикладу можна замінити рядок з
циклом таким чином:
Багатовимірні
масиви по суті – це масив масивів. Робота з
багатовимірними масивами подібна до роботи з одновимірними. Відмінність лише
в тому, що використовуються додаткові квадратні дужки. Переважно
використовуються двовимірні масиви, які служать для роботи з табличними
даними та тривимірні масиви. Двовимірний та тривимірний масиви
можна оголосити наступним чином:
Для двовимірного
лівий індекс означає номер рядка, а правий – номер стовпця. Це можна уявити
наступним чином:
Тривимірний масив
можна уявити у вигляді куба. Крім номера рядка і номера стовпця, додається ще
індекс елемента вглибину. В Java можна створити двовимірні масиви з різною кількістю
елементів в рядках (зазубрені або зубчасті масиви, jagged arrays).
Використання таких нерівних (нерегулярних)
масивів не рекомендується, оскільки з
ними важче працювати і можна припуститися низки помилок, але в деяких
ситуаціях вони можуть бути доволі корисними. Також в Java існує спеціальний клас для обробки масивів – java.util.Arrays. Утилітний клас Arrays містить
статичні методи, що реалізують популярні алгоритми обробки масивів. Нижче
наведена група методів цього класу для масивів типу double.
Такі самі методи є і для інших примітивних типів і є лише один метод для
сортування будь-яких об’єктів. Цей клас наочно демонструє переваги об’єктно
орієнтованого програмування.
Методи setAll та sort мають
аналоги для паралельної обробки масивів setParallelAll
та parallelSort. Але використання
цих методів доцільно тільки для дуже і дуже великих масивів.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||