НМЦ

ОБ’ЄКТНО ОРІЄНТОВАНЕ ПРОГРАМУВАННЯ

Електронний посібник

 

ВФПО

Модуль 5

 

5. Основні можливості платформи Java

5.1. Нові ідентифікатори, ключові слова та типи даних

5.2. Поглиблене використання виразів, керування виконанням програми

5.3. Поглиблене використання масивів

 

 

Відеозапис лекції:

 

browser does not support the video tag.

 

Частина 1: Identifiers, Keywords and Types

https://drive.google.com/file/d/17QnTZA547ACcGtRsxPWAJcOJeBBBcLvd/view

 

Ідентифікатори використовуються для іменування змінних, методів, класів. В мові Java ідентифікатор складається з будь-якої послідовності:

Ø рядкових і прописних букв латинського алфавіту;

Ø цифр від “0” до “9”;

Ø символу підкреслення “_”;

Ø    символу грошової одиниці (в особливих випадках).

 

Ідентифікатор обов’язково має починатися з літери. Мова Java розрізняє рядкові та прописні літери як різні. Це означає, що ідентифікатор з іменем MAX відрізняється від ідентифікатора з іменем Max – це два різних імені.

Приклади імен:

x

weight

a1

array1

MyClass

Max

a1b2c3

 

Ключові слова – це зарезервовані мовою Java слова. Ключовими словами можуть бути оператори, інструкції, твердження, що складають основу мови Java. Ключові слова не можна використовувати в якості імен ідентифікаторів, змінних, класів, методів тощо

 

У мові Java визначено наступні ключові слова:

abstract    continue         for               new            switch

assert      default           goto             package     synchronized

boolean     do                    if                     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

 

Примітивні типи даних можна використовувати безпосередньо або для створення власних типів класів. Примітивні типи служать основою для всіх інших типів даних.

В Java визначені 8 примітивних (простих) типів даних:

Ø byte

Ø short

Ø int

Ø long

Ø char

Ø float

Ø double

Ø boolean

 

Примітивні типи – це одинарні значення, вони не є складними об’єктами. Примітивні типи є простими типами. На основі примітивних типів можна створювати власні складні типи.

 

Примітивні типи доцільно використовувати в програмах, тому що це суттєво збільшує її продуктивність. Якщо реалізувати примітивні типи у вигляді об’єктів, то це призвело б до суттєвого зниження продуктивності. Примітивні типи мають строго визначений діапазон допустимих значень.

 

Цілочисельні типи даних – це цілі значення, які можуть бути як додатними, так і від’ємними

 

До цілочисельних типів даних належать такі типи:

byte

short

int

long

В Java не існує беззнакових цілочисельних типів даних.

Довжина цілочисельних типів даних наступна:

byte – 8 розрядів (біт);

short – 16 розрядів;

int – 32 розряди;

long – 64 розряди.

 

В Java до типів з плаваючою точкою (дійсних типів) належать типи:

float

double

До типу float належать числові значення одинарної точності. До типу double належать числові значення подвійної точності. Змінна типу float займає 32 біти в пам’яті. Змінна типу double займає 64 біти.

В Java для представлення символів введено тип даних char.

Змінні типу char займають в пам’яті комп’ютера 16 біт. Це пов’язано з тим, що для представлення символів char в Java використовується кодування Юнікод (Unicode). Діапазон допустимих значень цього типу складає від 0 до 65535. Використання кодування Unicode пов’язане з тим, що програми на Java використовуються у всьому світі.

Тип boolean призначений для зберігання логічних значень. Змінні типу boolean можуть приймати тільки два значення: true або false.

 

Між примітивними типами і типами-посиланнями існують наступні відмінності:

Ø змінна примітивного типу не є змінною-посиланням (об’єктом);

Ø змінна примітивного типу є “автоматичною” і зберігається в стеку. Об’єкт (змінна) зберігається в “купі”. Тому продуктивність роботи зі змінними примітивного типу вища;

Ø при оголошенні змінної примітивного типу не потрібно виділяти пам’ять оператором new;

Ø змінна примітивного типу напряму зберігає значення на відміну від змінної-посилання.

 

 

Номер заняття: 27–28

Відеозапис лекції:

 

browser does not support the video tag.

 

Частина 1: Програмування на Java Операції зі змінними і типи змінних

https://youtu.be/NsnisqveUdg

 

browser does not support the video tag.

 

Частина 2: Java Програмування Оператори порівняння

https://youtu.be/B-xdu83f8mY

 

browser does not support the video tag.

 

Частина 3: Відеоурок по Джава Логічні оператори "і" (&&) та "або" (||)

https://youtu.be/Q6z2MO_zsmg

 

browser does not support the video tag.

 

Частина 4: Джава Програмування Інші логічні оператори

https://youtu.be/ikLPx4mFo7M

 

browser does not support the video tag.

 

Частина 5: Інкремент та декремен

https://youtu.be/xHyshvY_lTo

 

browser does not support the video tag.

 

Частина 6: Java для чайників - Оператор "if"

https://youtu.be/xPo1qeLDFXc

 

browser does not support the video tag.

 

Частина 7: Оператор "ifelse if - ... – else"

https://youtu.be/E0ABoPd6lvU

 

browser does not support the video tag.

 

Частина 8: Java Введення в програмування Цикл while

https://youtu.be/T-01-ax4FTI

 

browser does not support the video tag.

 

Частина 9: Java Програмування Цикл do while

https://youtu.be/KdlP8mLarMg

 

browser does not support the video tag.

 

Частина 10: Цикл for

https://youtu.be/bL_KIlKrEV8

 

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

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

Наприклад,

(a * 2) – це вираз.

b + (a * 2); є висловлюванням.

 

Можна сказати, що вираз є реченням, а висловлювання – повним реченням, оскільки воно утворює повну одиницю виконання. Однак вираз не повинен містити кілька виразів. Ви можете перетворити простий вираз на твердження, додавши крапку з комою:

(a * 2);

 

Вираз часто дає результат, але не завжди. У Java існує три типи виразів:

Ø ті, що мають вартість, тобто результат: (1 + 1)

Ø ті, що присвоюють змінну: (v = 10)

Ø ті, які не мають результату, але можуть мати "побічний ефект", оскільки вираз може включати широкий спектр елементів, таких як виклики методів або оператори приросту, які змінюють стан (тобто пам'ять) програми.

 

У виразах часто присутні математичні функції. Для використання математичних функцій слід скористатися бібліотекою Math.

Основні функції і константи класу Math:

 

 

Арифметичні оператори використовуються в математичних виразах так само як і в алгебрі і представлені в таблиці:

 

 

Java визначає ряд порозрядних (побітових) операторів, що можуть застосовуватися до цілочисельних типів, long, int, short, char та byte. Ці оператори виконують дії над окремими розрядами (бітами) їхніх операндів. Наступна таблиця наводить список даних операторів:

 

 

Булеві логічні оператори застосовуються для операндів типу boolean, результатом є булева величина.

 

 

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

Наступна таблиця вказує на першочерговість операцій – зверху донизу.

 

 

Java, як і інші мови програмування, підтримує умовні інструкції та цикли, що визначають порядок виконання інструкцій у програмі. В англійській мові для цього поняття застосовують термін control flow – керування потоком.

Перед тим як знайомитись з керуючими структурами, спочатку необхідно ознайомитися з блоками.

 

Блок або складений оператор – це будь-яка кількість простих інструкцій, які оточені парою фігурних дужок. Блок визначає область видимості ваших змінних. Блоки можуть бути вкладені в середину інших блоків. Ви вже зустрічалися з блоками при створенні найпростіших програм у методі main().

 

Проте не можна визначати однакові змінні в двох вкладених блоках (на відміну від С++, де це можливо).

Умовний оператор в Java має форму:

if (умова) інструкція;

Умова має бути оточена дужками і, якщо, умова задовольняється (true) буде виконана інструкція за умовою, інакше вона не буде виконана, а буде виконана наступна після умовної інструкція.

Зазвичай, необхідно виконати не одну інструкцію, в такому разі інструкції розміщають у блоці:

if (умова){

   iнструкція 1;

   …..

   iнструкція n;

}

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

if (умова) інструкція1; else інструкція2;

Інструкції if можуть йти одна за одною без використання else:

if (x <= 0) if (x == 0) sign = 0; else sign = -1;

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

if (x <= 0) { if (x == 0) sign = 0; else sign = -1; }

Вони нічого не змінюють, але вираз стає зрозумілішим. Інструкція чи блок інструкцій виконується лише за виконання усіх умов.

Щоправда цю інструкцію можна також переписати, ускладнивши умову, використавши булевий оператор і (&&):

if (x <= 0) { if (x == 0) sign = 0; else sign = -1; }

Можна також використовувати повторюваність інструкцій if….else.

Це дає можливість перевірити ряд умов, якщо попередні умови не виконуються.

 

Цикли – це послідовність інструкцій, які можуть повторно виконуватись певну кількість раз залежно від заданої в програмі умови. Розрізняють цикли з передумовою, з післяумовою та з лічильником.

Цикл while (перекладається як «доки») – це цикл з передумовою, тіло якого (тобто інструкція або блок інструкцій) виконується, якщо умова істинна. Якщо умова з самого початку хибна, то цикл не виконається жодного разу.

 

Загальний вигляд:

while (умова) інструкція;

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

while (умова){

   інструкція 1;

   ...

   інструкція N;

}

Якщо необхідно, щоб умова виконувалася хоча б один раз, можна скористатися циклом з післяумовою do/while:

do інструкція while (умова);

 

Цикл for (цикл з лічільником) – доволі часто вживаний цикл. Він застосовується за необхідності виконати інструкції певну кількість разів з одночасним збільшенням або зменшенням певної змінної. Часто використовується для здійснення перебору певних масивів даних, зокрема також для сортування масивів.

 

Приклад використання:

for (int i = 1; i <= 10; i++) {

   System.out.println(i);

}

 

Наведений вище приклад виведе на консолі в стовпчик числа від 1 до 10. Як бачимо, в умові циклу перший слот відводиться для ініціалізації змінної, причому оголосити змінну можна і в іншому місці. Другий слот – для умови, яка перевіряється перед виконанням ітерації, третій слот – вказує як модифікувати змінну-лічильник. Тобто в наведеному прикладі за кожного виконання ітерації, лічильник "і" буде збільшуватися на одиницю, поки не стане рівним десяти.

Найчастіше цей цикл використовується для перебору елементів масиву.

 

Масив – це впорядкований набір даних одного типу. Найпростіший масив можна оголосити та ініціалізувати таким чином: int a[]={1, 5, 6, 1, 3};. Для того, щоб звернутися до певного елементу масиву, використовуються квадратні дужки з відповідним індексом елементу. Наприклад, а[3] – звернення до четвертого елементу масиву (номери елементів відраховуються з нуля).

 

Починаючи з java SE 5.0 в мові з’явився новий цикл – покращений for, призначенням якого є перебір елементів масиву або подібних до масиву типів даних (колекції).

Загальний вигляд циклу наступний:

for (type var : arr) {

    //тіло циклу

}

 

Наприклад, вивести елементи масиву можна таким чином:

for (int element : a)

    System.out.println(element);

 

Використання цього циклу дозволяє уникнути проблем, пов’язаних з помилками при заданні умови в класичному циклі for. В інших мовах програмування цикл такого виду так і називається foreach, проте, щоб уникнути необхідності значних змін в пакетах, в Java пішли простішим шляхом і перевантажили цикл for.

В Java відсутня інструкція goto, яка дозволяла переходити в будь-яке місце в програмі. Її використання давно вважається поганим стилем програмування, оскільки робить текст програми заплутаним. Про це, зокрема, писав ще Дональд Кнут і він же зазначав, що інколи все таки корисно її застосовувати, щоб припинити виконання певного методу, циклу чи блоку і вийти за їхні межі. Для цієї мети в Java існують спеціальні інструкції. Зокрема інструкцію break можна використати для передчасного виходу з циклу. Якщо ми використовуємо вкладені цикли (один цикл в іншому), то інструкція break припинить цикл, в якому вона знаходиться. Якщо вона знаходиться у внутрішньому циклі, то він припинить своє виконання, а зовнішній же цикл буде виконуватись і далі. Якщо потрібно повністю припинити виконання і внутрішнього, і зовнішнього, то використовується інструкція break з міткою.

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

Щоправда завжди можна обійтися без цих інструкцій, змінивши логіку програми. Деякі з програмістів уникають використовувати інструкції break та continue.

Інструкція if/else може бути доволі громіздкою, якщо необхідно здійснити множинний вибір з багатьох альтернатив. Тож як і в С/C++ в Java існує інструкція switch, яка здійснює вибір з багатьох варіантів. Щоправда вона дещо незграбна і деякі програмісти вважають за краще уникати її використання.

До версії Java 7, яка вийшла у 2011 році, case мітка мала бути лише цілим числом або нумерованою константою. Починаючи із Java 7, можна перевіряти таким чином на рівність також рядки.


 

 

Відеозапис лекції:

 

browser does not support the video tag.

 

Частина 1: Arrays class in Java

https://drive.google.com/file/d/1VNq6JWqCLU66gNaXTUg9-n4S-kv6GZY4/view

 

Масив – це впорядкований набір однотипних елементів, на які посилаються за спільним іменем

 

Це доволі зручний засіб групування інформації. Масиви можна створювати з елементів будь-якого типу. До конкретного елементу в масиві звертаються за індексом (номером). Вони можуть бути як одновимірні, так і багатовимірні.

 

Одновимірні масиви це список однотипних елементів.

 

Загальний формат оголошення такого масиву:

 

Наприклад,

int month_days[]; // масив цілих чисел

 

Існує також інша форма оголошення масиву:

int[] month_days;

 

Проте для того, щоб масив почав існувати, необхідно виділити під нього пам'ять за допомогою операції new.

назва-масиву = new тип-елементів [розмір];

 

де розмір – планована кількість елементів у масиві.

month_days = new int[12];

 

або зразу ж:

int month_days[] = new int[12];

 

Таким чином відбувається виділення пам'яті під масив і ініціалізація елементів масиву нулями. В подальшому можна напряму звертатися до елементів масиву, вказуючи індекс у квадратних дужках. Нумерація елементів у масиві в Java відбувається з нуля. Тобто в наведеному прикладі звернення до першого (нульового) елемента – month_days[0], а до останнього – month_days[11]. Java не дозволить програмі звернутися поза межі масиву, щоправда помилка буде вказана лише на етапі виконання програми через викидання винятку (виключення, exception).

month_days[5] = 30;

System.out.println(month_days[5]);

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

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

Максимальне число в масиві: 3.2

В Java масиви є об’єктами (про об’єкти ми вже говорили раніше), що забезпечує деяку додаткову функціональність масивам. Зокрема можна дізнатися довжину масиву наступним чином array.length. Для вищенаведеного прикладу можна замінити рядок з циклом таким чином:

        for (int i =0; i < array.length; i++){

Багатовимірні масиви по суті – це масив масивів. Робота з багатовимірними масивами подібна до роботи з одновимірними. Відмінність лише в тому, що використовуються додаткові квадратні дужки. Переважно використовуються двовимірні масиви, які служать для роботи з табличними даними та тривимірні масиви.

Двовимірний та тривимірний масиви можна оголосити наступним чином:

int twoD[][] = new int [4][5]; //створення масиву 4x5

int threeD[][][] = new int[5][5][5]; //створення масиву 5х5х5

Для двовимірного лівий індекс означає номер рядка, а правий – номер стовпця. Це можна уявити наступним чином:

[0,0][0,1][0,2][0,3][0,4]

[1,0][1,1][1,2][1,3][1,4]

[2,0][2,1][2,2][2,3][2,4]

[3,0][3,1][3,2][3,3][3,4]

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

В Java можна створити двовимірні масиви з різною кількістю елементів в рядках (зазубрені або зубчасті масиви, jagged arrays).

int twoD[][] = new int[5][]; //створюємо двовимірний масив з 5-ма рядками

twoD[0] = new int[5]; // виділяємо пам’ять для 5-ти елементів нульового рядка

twoD[1] = new int[4]; // перший рядок матиме 4-ри елементи

twoD[2] = new int[3]; // другий - 3

twoD[3] = new int[2]; // третій - 2

twoD[4] = new int[1]; // четвертий – 1

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

Також в Java існує спеціальний клас для обробки масивів – java.util.Arrays.

Утилітний клас Arrays містить статичні методи, що реалізують популярні алгоритми обробки масивів. Нижче наведена група методів цього класу для масивів типу double. Такі самі методи є і для інших примітивних типів і є лише один метод для сортування будь-яких об’єктів. Цей клас наочно демонструє переваги об’єктно орієнтованого програмування.

public static double[] copyOf(double[] original, int newLength)

public static int binarySearch(double[] a, double key)

public static void fill(double[] a, double val)

public static void sort(double[] a)

public static String toString(double[] a)

public static void setAll(double[] array, IntToDoubleFunction generator)

Методи setAll та sort мають аналоги для паралельної обробки масивів setParallelAll та parallelSort. Але використання цих методів доцільно тільки для дуже і дуже великих масивів.

 

Додаткові матеріали

1. Основи програмування на Java – безкоштовний відеокурс (Prometheus): https://courses.prometheus.org.ua/courses/EPAM/JAVA101/2016_T2/about

2. Java Professional – авторський відеокурс (Бабич О.В, ITVDN): https://www.youtube.com/watch?v=H77pBuf582M&list=PLvItDmb0sZw9DXLBDs4IBcalvA1Nx56o9

3. Основи програмування на Java – безкоштовний відеокурс (Prometheus): https://courses.prometheus.org.ua/courses/EPAM/JAVA101/2016_T2/about

4. Java Professional – авторський відеокурс (Бабич О.В, ITVDN): https://www.youtube.com/watch?v=H77pBuf582M&list=PLvItDmb0sZw9DXLBDs4IBcalvA1Nx56o9

5. Основи програмування на Java – безкоштовний відеокурс (Prometheus): https://courses.prometheus.org.ua/courses/EPAM/JAVA101/2016_T2/about

6. Java Professional – авторський відеокурс (Бабич О.В, ITVDN): https://www.youtube.com/watch?v=H77pBuf582M&list=PLvItDmb0sZw9DXLBDs4IBcalvA1Nx56o9

 

 

Попередня тема

На початок

Наступна тема