Лекція 2. Лексична структура мови PDF
Document Details
Uploaded by EndearingPegasus2294
KPI
Tags
Summary
This document contains lecture notes on Java programming language. The notes cover topics including lexical structure, operators, data types, arrays and object creation. The language used is Ukrainian
Full Transcript
Мова програмування Java Лекція 2 Лексична структура мови. Основні оператори. Типи. Масиви. Конструювання класів. 1 Зміст заняття Лексична структура мови Unicode Літерали Інтернування рядків (для рядкових літералі...
Мова програмування Java Лекція 2 Лексична структура мови. Основні оператори. Типи. Масиви. Конструювання класів. 1 Зміст заняття Лексична структура мови Unicode Літерали Інтернування рядків (для рядкових літералів) Оператори Типи даних Примітивні типи, типи посилання Виділення пам’яті Boxing/unboxing Основні оператори управління виконанням програми Змінні, константи, функції, параметри функцій Передача параметрів Класи, конструювання об’єктів Пакети 2 Unicode в Java 3 Unicode Java підтримує UTF-16 (Unicode) А що це означає? 4 Unicode Наступні елементи можуть бути Unicode Ідентифікатори (назви класів, змінних та методів) Вміст коментарів Вміст рядків (тип String) Вміст символів (примітивний тип char) Усі інші елементи – ASCII (це перші 128 символів із таблиці Unicode) 5 6 Ідентифікатори Ідентифікатори назви класів, змінних, методів “Java-букви”: Unicode-букви: A-Z, a-z та ішні _ $ - застосовується рідко “Java-цифри”: Цифри: 0-9 Починаються з “Java-букви” Ідентифікатори на “рідній” програмісту мові Чутливість до регістру! 7 Ключові слова 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 – зарезервовані, але не використовуються 8 Test 9 Оголошення та іменування змінних Оголошення змінної : ; int value; Опис: = ; double value1 = -5.7; Ініціалізація: = ; value = 100; В іменах змінних не можуть використовуватися символи арифметичних і логічних операторів, а також символ '#'. Використання символів '$' і '_' допустимо, в тому числі і в першій позиції імені. 10 Літерали 11 Літерали Літерал – це репрезентація значення примітивного типу (наприклад, числа), типу String, типу null Типи літералів Числа (цілі, з плаваючою комою) Логічні значення Null Символи Рядки (String) https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html 12 Числові літерали Примітивні типи: byte, short, int, long, float, double Типи літералів для цілих чисел: 123 – int 123L, 123l – long Системи для цілих чисел >приклад > як записати 0: Десятинна – 123 0 Вісімкова – 0173 00 Шістнадцяткова – 0x007B 0x0 Двійкова - 0b1111011 Літерали для чисел з плаваючою комою 123.45 – double 123.45d, 123.45D – double (d, D – опціонально) 123.45f, 123.45F – float 13 Літерали логічних значень. Літерал для null Логічні значення: Тип boolean Літерали: true, false Null Тип null Літерал: null 14 Test 15 Символьні літерали Символьний літерал Символ чи escape-послідовність в одинарних лапках '' Порожній символ: '' = compilation error Приклади: char c = 'П'; // символ П char c = '\u041F'; // це код символу П в Unicode char c = 0x66; // код символу f в ASCII таблиці char c = 0x0;//порожній символ – аналог Null в ASCII char c = '\''; // це символ ' (escape-послідовність) Вивід у консоль: var order; ППf '... var x = 10; var x; // ! Помилка! order = "first"; Var System.out.println(x); x = 10;... order = 2; 16 Esc-послідовності \b backspace \u0008 \t horizontal tab HT \u0009 \n inefeed LF (символ нового рядка) \u000a \f form feed FF (розрив сторінки) \u000c \r carriage return CR (повернення \u000d каретки) \" double quote " \u0022 \' single quote ' \u0027 \\ backslash \ \u005c \0-\377 вісімкові коди символів, для \u0000-\u00ff сумісності з іншими мовами, які мають 8-бітні символи 17 Рядкові літерали Приклади: String s = ""; // порожній рядок String s = "Привет"; // "Привет" в кодах символів String s = "\u041F\u0440\u0438\u0432\u0435\u0442"; String s = "Привет" + " світ"; //Конкатенація рядків 18 Test 19 Інтернування рядків Рядковий літерал завжди посилається на той самий екземпляр класу String (це забезпечується JVM) String s1="Hello"; String s2="Hello"; s1 == s2; // вірно String s1="Hello"; String s2=new String ("Hello”); s1 == s2; // не вірно Для тих, хто цікавиться, див. http://mindprod.com/jgloss/interned.html 20 String.intern Оператори 21 Оператори Арифметичні односимвольні оператори Знак Операція Пріоритет * Множення 1 / Ділення 1 % Залишок від ділення 1 + Складання 2 - Віднімання 2 = Присвоєння 3 Арифметичні двосимвольні оператори Знак Операція Пріоритет *= Множення з присвоєнням 1 /= Ділення з присвоєнням 1 %= Залишок від ділення з 1 присвоєнням += Складання з присвоєнням 2 -= Віднімання з присвоєнням 2 -- Декремент (зменшення на 1) 1 ++ Інкремент (збільшення на 1) 1 22 Оператори (продовження 1) Оператори порівняння Знак Операція Пріоритет > Більше 2 >= Більше або дорівнює 2 < Менше 2 > op1 >> op2 Побітовий зсув op1 вправо на величину op2 > op1 >>> op2 Побітовий зсув op1 вправо на величину op2 (беззнаковий зсув) >>>: Для додаткових чисел n>>>s = n>>s Для від’ємних чисел n>>>s = (n>>s)+(21); Результат 8 99>>1 Результат 49 (без остачі) System.out.println(17>>2); Результат 4 25 Оператори. Умовний (тернарний) оператор “? :” if (condition) { return x; } return y; return (condition ? x : y); System.out.println(1>0 ? “true” : “false”); true бульова_умова Boolean 26 boolean Типи даних 27 Типи даних Типи даних Примітивні Посилання Спеціальний тип null type (тип без імені) Примітивні типи boolean, char, byte, short, int, long, float, double Типи-посилання Типи-класи Типи-інтерфейси Типи-масиви 28 Виділення пам’яті... JVM Thread JVM Thread JVM Thread Регістр PC Регістр PC Регістр PC (program Counter) (program Counter) (program Counter) Stack Stack Stack Heap Method Area (допоміжні структури для класів, код конструкторів та методів тощо) Виділення пам’яті Примітивні типи - у стеку JVM Thread Типи-посилання - у JVM Heap 29 Примітивні типи Це єдині “не об’єкти” Java Іменуються зарезервованими словами Розмір типу стандартизовано (не залежить від апаратної бази) Мають відповідні класи-оболонки Тип даних Точність Розмір Min Max Клас- По (біт) оболонка замовчанню boolean Boolean false char UTF-16 16 0 216-1 Character ‘\u0000’ byte 8 -27 27-1 Byte (byte) 0 short 16 -215 215-1 Short (short) 0 int 32 -261 231-1 Integer 0 long 64 -263 263-1 Long 0L float одинарна 32 ±1.4*10-45 ±3.4*1038 Float 0.0f double подвійна 64 ±4.9*10-324 ±1.8*10308 Double 0.0d void - - - Void - 30 double, float double, float це числа з плаваючою комою double – подвійна точність float – одинарна точність strictfp – модифікатор для розрахунків над float та double усі проміжні значення зберігаються з одинарною або подвійною точністю У класах Float, Double оголошені константи: NaN – Not a Number NEGATIVE_INFINITY POSITIVE_INFINITY Не використовуйте float, double для точних значень – валют Слід застосувати BigDecimal 31 З Java 7 в літералах можна використовувати символ підкреслення для підвищення читабельності великих чисел. Наприклад, long creditCardNumber = 1234_5678_9012_3456L; long hexBytes = 0xFF_EC_DE_5E; byte nybbles = 0b0010_0101; float pi = 3.14_15F; 32 BigInteger, BigDecimal BigInteger – цілі числа довільної точності BigDecimal – десяткові числа довільної точності з фіксованою комою. BigInteger, BigDecimal Класи Для них не можуть застосовуватись оператори примітивних типів Повільніші, але більш точні 33 Перетворення примітивних типів Перетворення-”розширення” byte -> short, int, long, float, double short -> int, long, float, double char -> int, long, float, double int -> long, float, double long -> float, double float -> double При розширенні не потрібно явно приводити типи Перетворення-”звуження” short -> byte, char char -> byte, short int -> byte, short, char long -> byte, short, char, int float -> byte, short, char, int, long double -> byte, short, char, int, long, float При звуженні необхідно явно приводити типи – інакше помилка компіляції “possible loss of precision” (втрата точності) byte i = 127; // ok byte i = 129; // compile error: possible loss of precision byte i = (byte) 129; // ok – реальне значення і=-127 double a = 1.23; float b = a; // compile error: possible loss of precision float b = (float) a; // ok 34 Boxing/Unboxing Автоматичне перетворення примітивних типів та класів-“оболонок” типів параметрів значень, що повертаються змінних Boxing: примітивні типи у класи-”оболонки” boolean -> Boolean, int -> Integer, … Приклад: void foo (Integer i) {} int i=0; foo (i); Unboxing: класи-“оболонки” у примітивні типи Character -> char, Byte -> byte, … Приклад: void foo (int i) {} Integer i=0; foo (i); 35 ОСОБЛИВОСТІ ОПЕРАТОРІВ 1) Арифметичне ділення Результат залежить від типів операндів: Якщо обидва операнди цілочисельні, то результат - цілочисельне значення; Якщо один з операндів дробовий, то і результат буде дробовим 2) Отримання залишку від ділення Може виконуватися як з цілочисельними значеннями, так і з дробовими. 36 Масиви Масиви в Java це спеціальний тип об’єктів Пам’ять динамічно виділяється у JVM Heap Декларація (правильні обидва варіанти): int[] arr; int arr[]; Способи створення масиву: int arr[] = new int ; int arr[] = {0,1,2,3,4}; // статична ініціалізація Нумерація – з нуля Доступ: arr[i] 37 Масив в Java – це об’єкт. Тому можливе присвоєння змінній типу Object Object arr = new int; 38 Питання Чи можливо динамічно змінювати розмір масиву? 39 Багатовимірні масиви Можуть бути багатовимірними з різною кількістю елементів Приклади багатомірних масивів: double a[][] = { { 1.0, 9.0, 3.1 }, { 0.2, 1.0, 5.8 }, { 3.7, 0.4, 1.0 } }; int i[][] = { {1, 2}, null }; int arr [][] = new int[]; arr = new int; arr = new int; arr = new int; Object[][] o = new Object; o=1; o=“Hello there!”; 40 Об’єкти Об’єкти: Екземпляри класів Масиви Об’єкти необхідно конструювати String s; s.charAt(i); // NullPointerException s = new String (); s = “Hello World”; Об’єкти зберігаються у “купі” String s; // посилання на порожнечу s = “Hello World”; // посилання на тільки що створений String у купі 41 Основні оператори управління виконання програми 42 Команди та блоки Порожня команда: ; Команда з міткою – але оператора goto немає мітка: команда; Блок: { команда1; … командаN; } 43 if-else, switch Умова повинна бути типів: if (умова) - boolean … - Boolean else Увага: якщо вираз умови формується за допомогою … логічних операторів, то застосовується оптимізація. Через це не всі складові умови можуть бути перевірені: if (a < 2 || a > 5) { … } switch (умова) { case X: Умова повинна бути типів: … - char, byte, short, int break; - Character, Byte, Short, Integer default: - або типу enum (це спеціальний тип класів) … - String (починаючи з Java 7) break; } 44 Modern switch (Java 12) Автори пропонують ввести нову форму мітки switch "case L ->" щоб очевидним чином показати, що виконаються буде тільки код праворуч від мітки, якщо ця мітка - підходить. Це дозволить істотно скоротити код: 45 Оператори переходів break - застосовується для виходу з циклу або оператора switch continue - застосовується для переходу до наступної ітерації циклу. У мові Java можливості оператора break і continue, можна використовувати з міткою. Наприклад, 46 Цикли while (бульова_умова) {} do Умова розраховується {} після першої ітерації. while (бульова_умова); Базовий синтаксис for for (ініціалізація; бульова_умова; крок) {} Приклад: for(int i=0, j=1; i < 5; i++, j*=2) {} Вдосконалений синтаксис for Вираз повинен бути типів: - масив for (змінна: вираз) - Iterable {} Приклад: for (int a : new int[] {1,2,3}) {} 47 Task Чому дорівнює i після виконання фрагменту коду? int i=0; for (int j=0; j