Лекція 2. Лексична структура мови PDF

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

Use Quizgecko on...
Browser
Browser