650 likes | 819 Views
Програмни езици - Java. Лексическа структура на Java. Структура на Java програма. Програмите на Java се пишат в Unicode. Прави се лексическа транслация , с която Unicode escapes ( uXXXX ) могат да се ползват за да вкл. Произволни Unicode символи, използващи само ASCII символи.
E N D
Структура на Java програма • Програмите на Java се пишат в Unicode. • Прави се лексическа транслация, с която Unicode escapes (\uXXXX) могат да се ползват за да вкл. Произволни Unicode символи, използващи само ASCII символи. • Дефинирани са символи за край на ред (LF, CR) за работа под различни ОС. • Символите Unicode, получени вследствие лексическата транслация се редуцират до набор white space (HT, space, FF, LF, CR) символи, коментари и tokens. • Tokens са: • Идентификатори; • Ключови думи • Литерали • Разделители • Операции.
Литерали • Целочислени • Плаваща запетая • Булеви • true • false • null • Символни • UTF-16 • [U+0000, U+10FFFF] • Низови
Низови литерали - пример package Test; class Other { public static String hello = "Hello"; }; class Test { public static void main(String[] args) { String hello = "Hello", lo = "lo"; System.out.print((hello == "Hello") + " ");//true System.out.print((Other.hello == hello) + " ");//true System.out.print((other.Other.hello == hello) + " ");//true System.out.print((hello == ("Hel"+"lo")) + " ");//true System.out.print((hello == ("Hel"+lo)) + " ");//false System.out.println(("Hel"+lo).equals(hello));//true } } package other; public class Other { public static String hello = "Hello"; }
Типове в Java Примитиви null Рефериращи boolean Числови class interface масив Интегрални float double byte short int long char
Типове в Java • Java е строго типизиран език, което означава, че всяка променлива и стойност трябва да има тип по време на компилация. • Интегрални типове: • byte – знаков 8 бита, клас Byte • short – знаков 16 бита, клас Short • int – знаков 32 бита, клас Integer • long – знаков 64 бита, клас Long • char – символ, 16 бита, клас Character
Типове в Java • Грешки, получавани при операциите върху интегрален тип данни: • NullPointerException – при пробразуване от клас в примитивна данна • ArithmeticException – при делене на нула • OutOfMemoryError – при преобразуване от примитивен тип в съответния клас
Типове в Java • Типове с ПЗ: • float – 32 бита, IEEE 754, клас Float • double – 64 бита, IEEE 754, клас Double • IEEE 754-1985 включва : • (+) и (-) числа, представени с експонента и нормализирана мантиса; • (+) и (-) нула: • Равни са по стойност, ползват се при безкрайност • (+) и (-) безкрайност (infinite): • 1.0/0.0 = +∞ • 1.0/-0.0 = -∞ • NaN – получава се при неправилна операция, напр. делене на нула. • Java 1.3+ дава възможност да се получат различни видове NaN с цел диагностика.
Типове в Java • Грешки, получавани при операциите върху данни ПЗ: • NullPointerException – при пробразуване от клас в примитивна данна • OutOfMemoryError – при преобразуване от примитивен тип в съответния клас • Препълване отгоре при операции дава безкрайност. • Препълване отдолу дава ненормализирана мантиса или знакова нула. • Неправилна операция дава NaN. • Ако в операция участва един NaN резултатът е NaN.
Типове в Java • Булев тип: • boolean, клас Boolean • Участва само в логически операции и конкатенация (+).
Типове в Java • Рефериращи типове: • Клас Object. По-важни методи: • getClass връща обект от тип Class, който представя класа на обекта. Такъв опбект съществува за всички рефериращи типове. • toString преобразува обекта към String. • equals и hashCode се използват в хештаблици като equals връща true когато 2 обекта са еднакви. • clone прави копие на обект. • finalize се извиква преди унищожаване на обекта.
Типове в Java • Клас String: • Работи само с константни стойности. • Поддържа операция конкатенация (+) • 2 рефериращи типа са еднакви по време на компилация, ако имат едно и също име и еднакви типови параметри. • 2 класа или 2 интерфейса са еднакви по време на работа на програмата, ако имат едно и също име и еднакъв class loader. • 2 масива са еднакви, ако имат еднакви типове на елементите.
Типове в Java • Типова променлива: • Променлива, дефинираща родов клас (шаблонен), родов интерфейс, родов метод или родов конструктор. • Пример: <T extends C&I>, Т наследява членове на С и I, където C e клас, а I - интерфейс, които са в същата област на действие.
Типове в Java • Параметризиран тип – състои се от клас или интерфейс и списък от параметри. • Пример: • Vector<String> Vector<int> • Pair<String,Integer> Pair<String> public Method getMethod(Class<?>[] parameterTypes) { ... } boolean addAll(Collection<? Extends C> c) {…}
Типове в Java • Супертип и подтип (S >1T): • double >1 float • float >1 long • long >1 int • int >1 char • int >1 short • short >1 byte • Клас и суперклас, суперинстанция
Променливи и константи в Java • Видове променливи: • Клас-променливи – както static в С • Променливи на обект • Компоненти на масиви • Неименовани променливи, които се създават и инициализират при създаване на масив • Формални параметри • Параметри на конструкторите • Параметри за обработка на изключителни ситуации • Локални – в пределите на
Променливи и константи в Java • Дефиниране на константи: • final static double PI=3.14; • Инициализация на променливи, членове на клас: • boolean – false; • класове – null; • char – ‘\u0000’; • Всички останали примитиви – нула. • Локалните променливи нямат инициализация.
Преобразуване на типове • Преобразуване при присвояване • Няма към булев тип • Генерират се следните грешки: OutOfMemoryError, NullPointerException, ClassCastException • Преобразуване при извикване на методи – изпълнява се за всеки аргумент на метод, както при присвояване. • Смяна на типа: (нов_тип) пром. • Всички типове могат да се преобразуват към String.
Преобразуване на типове • Преобразуване между примитиви: • Към по-голям тип: • 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 • byte към char – става през int
Преобразуване на типове • Между класове: • Тип към супертип • Клас към интерфейс без параметри – ако класа не е final и не реализира интерфейса • Интерфейс към клас без параметри – ако класа не е final • Интерфейс Clonable java.io.Serializable към масив от обекти
Преобразуване на типове • Интерфейс към непараметризиран интерфейс – ако първия не е подтип на втория • Един тип масив към друг тип масив – ако са съвместими рефериращи типове • Всеки примитив може да се преобразува до съответния си клас и обратно.
Достъп до имената • Пакетът винаги е достъпен. • Когато един клас или интерфейс има модификатор за достъп public, той е достъпен за всички пакети. • Когато клас или интерфейс няма модификатор за достъп не може да се ползва извън пакета, в който е дефиниран. • Един масив е достъпен само ако типа на неговите елементи е достъпен. • Данните и методите protected са достъпни е рамките на пакета и извън него само в наследниците на класа.
Пълно квалифицирано име • Примитивните типове не се квалифицират. • Името на пакет, който е на най-високо ниво не се квалифицира. • Името на подпакет се квалифицира пакет.подпакет • Името на клас или интерфейс на най-високо ниво в безименен пакет не се квалифицира. • Името на клас или интерфейс, декларирано в пакет се квалифицира пакет.клас и пакет.интерфейс съответно.
Правила за именоване • Името на пакет започва с малка буква и не трябва да започва с java. • Името на клас трябва да е съществително или съществителна фраза, като всяка дума да започва с главна буква. • Името на интерфейс трябва да е съществително, съществителна фраза или допълнение като всяка дума да започва с главна буква.
Правила за именоване • Типовите имена започват с главна буква. • Името на метод трябва да е глагол или глаголна фраза, като всяка дума, без първата, да започва с главна буква. • Името на данна поле на клас, което не е константа, трябва да е съществително или съществителна фраза, като всяка дума, без първата, да започва с главна буква. • Константата се записва само с главни букви като отделните думи се свързват с подчертавка.
Правила за именоване • Имената на локални променливи и формални параметри трябва да са кратки, да не са само от един символ. Изключения се допускат (за едносимволни имена) само за temp променливи и управляващи цикъл.
Пакети • Програмите на java са организирани в пакети. • В една програма може да има само един пакет без име. Всички останали имат име и могат да бъдат съхранени във файл или БД. • Пакетът съдържа произволен брой компилируеми файлове. Всеки файл има достъп до данните, методите и типовете на своя пакет и тези от java.lang. • Имената на пакетите трябва да са уникални.
Членове на пакети • Всички подпакети, класове и интерфейси, декларирани на външно ниво в пакета са негови членове. • Пример - Java API има следните пакети: • Пакетът java има awt, applet, io, lang, net и util подпакети и няма компилируеми файлове. • Пакетът java.awt има подпакет image и множество компилируеми файлове, съдържащи декларации на класове и интерефейси.
Членове на пакети • Не се разрешава име на пакет да съвпада с име на клас или интерфейс в него. • Не се разрешава име на пакет да съвпада с име на негов подпакет.
Съхранение на пакети • Всички пакети и прилежащите им сорсове се съхраняват в директория и поддиректории. • Всяка поддиректория представя пакет. • В директориите се намират сорс кода .java и двоичния код .class. • За да се намали обема памет директориите се архивират в jar архиви. • За достъп до класовете в пакет се посочва относителния път спрямо пакета на топ ниво като \ се замества с . • Пример: java.awt.image
Компилируеми файлови единици • Компилируема единица е файл, съдържащ: • Декларация на пакет • Импортиране на пакет • Декларация на типове
Декларация на пакет • package име; • Безименният пакет няма подпакети. Той не се декларира. • Всеки пакет и неговите подпакети са видими навсякъде, където са импортирани. • java.lang се импортира автоматично. • Всеки файл съдържа само един public клас, чието име съвпада с името на файла.
Импортиране на пакет • Може да се импортира цял пакет или само конкретен файл. • import java.util.*; • import java.util.Vector; • Импортират се само public типовете на файла. • Съществува и импортиране на статични типове: • import static тип.идентификатор; • import static тип.*; • java.lang се импортира автоматично.
Декларации на топ ниво на пакет • Тук се включват: • Декларация на клас • Декларация на интерфейс • Не се допуска съвпадение между имената на клас и интерефейс. • Декларациите на топ ниво са само public. • Не се допуска импортиране на конкретен клас и деклариране на клас със същото име.
Въведение • Класификация според нивото на декларация: • Декларирани на външно ниво • Вложени в друг клас • Локални класове • Анонимни класове • Видове класове: • Абстрактни • final – не могат да се наследяват • public • Родови • Няма множествено наследяване!
Въведение • Членовете на клас и интерфейс могат да имат модифкатори за достъп: public, private, protected. • Членовете на един клас скриват наследените със същото име. • Полетата могат да бъдат: • final • static • Друг клас
Въведение • Методите могат да бъдат: • final – не могат да се припокриват • abstract – нямат реализация • synchronized – за работа с нишки; заключва обекта • native – код, зависим от реализацията си • Методите могат да се припокриват. • Няма деструктори.
Деклариране на клас [Модификатор]class идент. [т.име][родител] [интерфейси] тяло • Модификатори: • public, protected, private, static, final, strictfp • Един клас има абстрактни методи, ако: • Съдържа декларация на абстрактен метод. • Ако някой от родителските класове има абстрактен метод, който не е дефиниран в текущия. • Класът наследява интерфейси, които имат абстрактни методи, без да ги реализира.
Деклариране на клас • Един клас се декларира final, ако не трябва да се наследява. • Един клас се декларира с strictfp, когато изразите с ПЗ са FP-strict. • Класът е родов, ако има типови параметри. • Вътрешен клас е вложен клас, който не е явно или неявно деклариран static. • Явна декларация – класът има статични членове. • Неявна декларация – класът наследява клас със статични членове.
Деклариране на клас • Вътрешният клас: • Няма право да има статични инициализатори. • Няма членове интерфейси и членове static. • Може да наследява статични членове. • Не може да се позовава към неконстантни членове на обхващащия клас. • Може да съдържа локални класове, анонимни класове и нестатични членове.
Деклариране на клас • Локален клас е клас в пределите на функция. • Не се допуска инициализация на членовете на локален клас, дефиниран в пределите на статичен метод, с неконстанти. Това е възможно само за локален клас, дефиниран в нестатичен метод. • Локален клас не може да бъде статичен.
Деклариране на клас • Суперклас е родителят на даден клас. • Директен суперклас – пряк родител на класа. • Наследеният клас е подклас на своя родител. • Връзката подклас е транзитивна. • Клас С е директно зависим от тип Т, ако Т присъства в extend. • Клас С е зависим от Т, ако е: • директно зависим. • директно зависим от интерфейс, който зависи от Т. • Директно зависим от клас, който зависи от Т.
Деклариране на клас • Директен суперинтерфейс – интерфейс, реализиран от класа. • Интерфейс I е суперинтерфейс на класа С, ако: • I е директен суперинтерфейс. • С има директен суперинтерфейс J, на който I е суперинтерфейс. • I е суперинтерфейс на директен подклас на С. • Интерфейсите могат да се наследяват.
Деклариране на клас • Допуска се създаване реализация на интерфейси, притежаващи методи с еднаква сигнатура в един клас. Задължително е типът на връщаната стойност да съвпада! • Класът не може да бъде подтип на два интерфейса, които са различно уточнение на общ родов интерфейс.
Членове на клас • Членовете на клас са: • Наследени от директния суперклас. • Наследени от директните суперинтерфейси. • Собствени членове. • Членовете private не са достъпни в подкласовете на класа. • Конструктори, статични инициализатори и инициализатори на обекти не се наследяват.