Програмни езици - java
DESCRIPTION
Програмни езици - Java. Лексическа структура на Java. Структура на Java програма. Програмите на Java се пишат в Unicode. Прави се лексическа транслация , с която Unicode escapes ( \ uXXXX ) могат да се ползват за да вкл. Произволни Unicode символи, използващи само ASCII символи. - PowerPoint PPT PresentationTRANSCRIPT
1
ПРОГРАМНИ ЕЗИЦИ - JAVA
2
ЛЕКСИЧЕСКА СТРУКТУРА НА JAVA
3
СТРУКТУРА НА JAVA ПРОГРАМА Програмите на Java се пишат в Unicode. Прави се лексическа транслация, с която
Unicode escapes (\uXXXX) могат да се ползват за да вкл. Произволни Unicode символи, използващи само ASCII символи.
Дефинирани са символи за край на ред (LF, CR) за работа под различни ОС.
Символите Unicode, получени вследствие лексическата транслация се редуцират до набор white space (HT, space, FF, LF, CR) символи, коментари и tokens.
Tokens са: Идентификатори; Ключови думи Литерали Разделители Операции.
4
ЛИТЕРАЛИ
Целочислени Плаваща запетая Булеви
true false
null Символни
UTF-16[ U+0000, U+10FFFF ]
Низови
5
НИЗОВИ ЛИТЕРАЛИ - ПРИМЕР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") + " "); //trueSystem.out.print((Other.hello == hello) + " "); //trueSystem.out.print((other.Other.hello == hello) + " "); //trueSystem.out.print((hello == ("Hel"+"lo")) + " "); //trueSystem.out.print((hello == ("Hel"+lo)) + " "); //falseSystem.out.println(("Hel"+lo).equals(hello)); //true }
}package other;public class Other { public static String hello = "Hello"; }
6
ТИПОВЕ, ПРОМЕНЛИВИ И ОПЕРАЦИИ
7
Типове в Java
Примитиви
Рефериращи
boolean
Числови
Интегрални
float double
byte
short
int long
char
class
interface
масив
null
8
ТИПОВЕ В JAVA Java е строго типизиран език, което
означава, че всяка променлива и стойност трябва да има тип по време на компилация.
Интегрални типове: byte – знаков 8 бита, клас Byte short – знаков 16 бита, клас Short int – знаков 32 бита, клас Integer long – знаков 64 бита, клас Long char – символ, 16 бита, клас Character
9
ТИПОВЕ В JAVA
Грешки, получавани при операциите върху интегрален тип данни: NullPointerException – при пробразуване от
клас в примитивна данна ArithmeticException – при делене на нула OutOfMemoryError – при преобразуване от
примитивен тип в съответния клас
10
ТИПОВЕ В 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 с цел диагностика.
11
ТИПОВЕ В JAVA Грешки, получавани при операциите
върху данни ПЗ:NullPointerException – при пробразуване
от клас в примитивна даннаOutOfMemoryError – при преобразуване
от примитивен тип в съответния клас Препълване отгоре при операции
дава безкрайност. Препълване отдолу дава
ненормализирана мантиса или знакова нула.
Неправилна операция дава NaN. Ако в операция участва един NaN
резултатът е NaN.
12
ТИПОВЕ В JAVA
Булев тип: boolean, клас Boolean Участва само в логически операции и
конкатенация (+).
13
ТИПОВЕ В JAVA
Рефериращи типове: Клас Object. По-важни методи:
getClass връща обект от тип Class, който представя класа на обекта. Такъв опбект съществува за всички рефериращи типове.
toString преобразува обекта към String. equals и hashCode се използват в хештаблици като
equals връща true когато 2 обекта са еднакви. clone прави копие на обект. finalize се извиква преди унищожаване на обекта.
14
ТИПОВЕ В JAVA Клас String:
Работи само с константни стойности. Поддържа операция конкатенация (+)
2 рефериращи типа са еднакви по време на компилация, ако имат едно и също име и еднакви типови параметри.
2 класа или 2 интерфейса са еднакви по време на работа на програмата, ако имат едно и също име и еднакъв class loader.
2 масива са еднакви, ако имат еднакви типове на елементите.
15
ТИПОВЕ В JAVA
Типова променлива: Променлива, дефинираща родов клас
(шаблонен), родов интерфейс, родов метод или родов конструктор.
Пример: <T extends C&I>, Т наследява членове на С и I, където C e клас, а I - интерфейс, които са в същата област на действие.
16
ТИПОВЕ В JAVA
Параметризиран тип – състои се от клас или интерфейс и списък от параметри.
Пример: Vector<String> Vector<int> Pair<String,Integer> Pair<String>
public Method getMethod(Class<?>[] parameterTypes) { ... }
boolean addAll(Collection<? Extends C> c) {…}
17
ТИПОВЕ В JAVA
Супертип и подтип (S >1T): double >1 float float >1 long long >1 int int >1 char int >1 short short >1 byte Клас и суперклас, суперинстанция
18
ПРОМЕНЛИВИ И КОНСТАНТИ В JAVA
Видове променливи:Клас-променливи – както static в СПроменливи на обектКомпоненти на масиви
Неименовани променливи, които се създават и инициализират при създаване на масив
Формални параметриПараметри на конструкторитеПараметри за обработка на
изключителни ситуацииЛокални – в пределите на
19
ПРОМЕНЛИВИ И КОНСТАНТИ В JAVA
Дефиниране на константи: final static double PI=3.14;
Инициализация на променливи, членове на клас: boolean – false; класове – null; char – ‘\u0000’;Всички останали примитиви – нула.
Локалните променливи нямат инициализация.
20
ПРЕОБРАЗУВАНЕ НА ТИПОВЕ
Преобразуване при присвояванеНяма към булев типГенерират се следните грешки:
OutOfMemoryError, NullPointerException, ClassCastException
Преобразуване при извикване на методи – изпълнява се за всеки аргумент на метод, както при присвояване.
Смяна на типа: (нов_тип) пром. Всички типове могат да се
преобразуват към String.
21
ПРЕОБРАЗУВАНЕ НА ТИПОВЕ
Преобразуване между примитиви: Към по-голям тип:
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
22
ПРЕОБРАЗУВАНЕ НА ТИПОВЕ
Към по-малък тип: 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
23
ПРЕОБРАЗУВАНЕ НА ТИПОВЕ
Между класове: Тип към супертип Клас към интерфейс без параметри – ако
класа не е final и не реализира интерфейса Интерфейс към клас без параметри – ако
класа не е final Интерфейс Clonable java.io.Serializable към
масив от обекти
24
ПРЕОБРАЗУВАНЕ НА ТИПОВЕ
Интерфейс към непараметризиран интерфейс – ако първия не е подтип на втория
Един тип масив към друг тип масив – ако са съвместими рефериращи типове
Всеки примитив може да се преобразува до съответния си клас и обратно.
25
ДОСТЪП ДО ИМЕНАТА Пакетът винаги е достъпен. Когато един клас или интерфейс
има модификатор за достъп public, той е достъпен за всички пакети.
Когато клас или интерфейс няма модификатор за достъп не може да се ползва извън пакета, в който е дефиниран.
Един масив е достъпен само ако типа на неговите елементи е достъпен.
Данните и методите protected са достъпни е рамките на пакета и извън него само в наследниците на класа.
26
ПЪЛНО КВАЛИФИЦИРАНО ИМЕ
Примитивните типове не се квалифицират.
Името на пакет, който е на най-високо ниво не се квалифицира.
Името на подпакет се квалифицира пакет.подпакет
Името на клас или интерфейс на най-високо ниво в безименен пакет не се квалифицира.
Името на клас или интерфейс, декларирано в пакет се квалифицира пакет.клас и пакет.интерфейс съответно.
27
ПРАВИЛА ЗА ИМЕНОВАНЕ Името на пакет започва с малка буква и
не трябва да започва с java. Името на клас трябва да е съществително
или съществителна фраза, като всяка дума да започва с главна буква.
Името на интерфейс трябва да е съществително, съществителна фраза или допълнение като всяка дума да започва с главна буква.
28
ПРАВИЛА ЗА ИМЕНОВАНЕ
Типовите имена започват с главна буква.
Името на метод трябва да е глагол или глаголна фраза, като всяка дума, без първата, да започва с главна буква.
Името на данна поле на клас, което не е константа, трябва да е съществително или съществителна фраза, като всяка дума, без първата, да започва с главна буква.
Константата се записва само с главни букви като отделните думи се свързват с подчертавка.
29
ПРАВИЛА ЗА ИМЕНОВАНЕ
Имената на локални променливи и формални параметри трябва да са кратки, да не са само от един символ. Изключения се допускат (за едносимволни имена) само за temp променливи и управляващи цикъл.
30
ПАКЕТИ
31
ПАКЕТИ
Програмите на java са организирани в пакети.
В една програма може да има само един пакет без име. Всички останали имат име и могат да бъдат съхранени във файл или БД.
Пакетът съдържа произволен брой компилируеми файлове. Всеки файл има достъп до данните, методите и типовете на своя пакет и тези от java.lang.
Имената на пакетите трябва да са уникални.
32
ЧЛЕНОВЕ НА ПАКЕТИ
Всички подпакети, класове и интерфейси, декларирани на външно ниво в пакета са негови членове.
Пример - Java API има следните пакети: Пакетът java има awt, applet, io, lang, net и util
подпакети и няма компилируеми файлове. Пакетът java.awt има подпакет image и
множество компилируеми файлове, съдържащи декларации на класове и интерефейси.
33
ЧЛЕНОВЕ НА ПАКЕТИ
Не се разрешава име на пакет да съвпада с име на клас или интерфейс в него.
Не се разрешава име на пакет да съвпада с име на негов подпакет.
34
СЪХРАНЕНИЕ НА ПАКЕТИ Всички пакети и прилежащите им
сорсове се съхраняват в директория и поддиректории.
Всяка поддиректория представя пакет.
В директориите се намират сорс кода .java и двоичния код .class.
За да се намали обема памет директориите се архивират в jar архиви.
За достъп до класовете в пакет се посочва относителния път спрямо пакета на топ ниво като \ се замества с .
Пример: java.awt.image
35
КОМПИЛИРУЕМИ ФАЙЛОВИ ЕДИНИЦИ Компилируема единица е файл,
съдържащ: Декларация на пакет Импортиране на пакет Декларация на типове
36
ДЕКЛАРАЦИЯ НА ПАКЕТ
package име; Безименният пакет няма подпакети. Той
не се декларира. Всеки пакет и неговите подпакети са
видими навсякъде, където са импортирани.
java.lang се импортира автоматично. Всеки файл съдържа само един public
клас, чието име съвпада с името на файла.
37
ИМПОРТИРАНЕ НА ПАКЕТ
Може да се импортира цял пакет или само конкретен файл. import java.util.*; import java.util.Vector;
Импортират се само public типовете на файла.
Съществува и импортиране на статични типове: import static тип.идентификатор; import static тип.*;
java.lang се импортира автоматично.
38
ДЕКЛАРАЦИИ НА ТОП НИВО НА ПАКЕТ Тук се включват:
Декларация на клас Декларация на интерфейс
Не се допуска съвпадение между имената на клас и интерефейс.
Декларациите на топ ниво са само public. Не се допуска импортиране на конкретен
клас и деклариране на клас със същото име.
39
КЛАСОВЕ В JAVA
40
ВЪВЕДЕНИЕ
Класификация според нивото на декларация:Декларирани на външно нивоВложени в друг клас
Локални класове Анонимни класове
Видове класове: Абстрактни final – не могат да се наследяват publicРодови
Няма множествено наследяване!
41
ВЪВЕДЕНИЕ Членовете на клас и интерфейс могат да
имат модифкатори за достъп: public, private, protected.
Членовете на един клас скриват наследените със същото име.
Полетата могат да бъдат: final static Друг клас
42
ВЪВЕДЕНИЕ
Методите могат да бъдат: final – не могат да се припокриват abstract – нямат реализация synchronized – за работа с нишки; заключва
обекта native – код, зависим от реализацията си
Методите могат да се припокриват. Няма деструктори.
43
ДЕКЛАРИРАНЕ НА КЛАС
[Модификатор] class идент. [т.име] [родител] [интерфейси]тяло
Модификатори: public, protected, private, static, final, strictfp
Един клас има абстрактни методи, ако:Съдържа декларация на абстрактен метод.Ако някой от родителските класове има
абстрактен метод, който не е дефиниран в текущия.
Класът наследява интерфейси, които имат абстрактни методи, без да ги реализира.
44
ДЕКЛАРИРАНЕ НА КЛАС
Един клас се декларира final, ако не трябва да се наследява.
Един клас се декларира с strictfp, когато изразите с ПЗ са FP-strict.
Класът е родов, ако има типови параметри.
Вътрешен клас е вложен клас, който не е явно или неявно деклариран static.Явна декларация – класът има статични
членове.Неявна декларация – класът наследява
клас със статични членове.
45
ДЕКЛАРИРАНЕ НА КЛАС
Вътрешният клас: Няма право да има статични инициализатори. Няма членове интерфейси и членове static. Може да наследява статични членове. Не може да се позовава към неконстантни
членове на обхващащия клас. Може да съдържа локални класове, анонимни
класове и нестатични членове.
46
ДЕКЛАРИРАНЕ НА КЛАС
Локален клас е клас в пределите на функция.
Не се допуска инициализация на членовете на локален клас, дефиниран в пределите на статичен метод, с неконстанти. Това е възможно само за локален клас, дефиниран в нестатичен метод.
Локален клас не може да бъде статичен.
47
ДЕКЛАРИРАНЕ НА КЛАС
Суперклас е родителят на даден клас.Директен суперклас – пряк родител на
класа. Наследеният клас е подклас на своя
родител. Връзката подклас е транзитивна. Клас С е директно зависим от тип Т,
ако Т присъства в extend. Клас С е зависим от Т, ако е:
директно зависим.директно зависим от интерфейс, който
зависи от Т.Директно зависим от клас, който зависи
от Т.
48
ДЕКЛАРИРАНЕ НА КЛАС Директен суперинтерфейс – интерфейс,
реализиран от класа. Интерфейс I е суперинтерфейс на класа С,
ако: I е директен суперинтерфейс. С има директен суперинтерфейс J, на който I
е суперинтерфейс. I е суперинтерфейс на директен подклас на
С. Интерфейсите могат да се наследяват.
49
ДЕКЛАРИРАНЕ НА КЛАС
Допуска се създаване реализация на интерфейси, притежаващи методи с еднаква сигнатура в един клас. Задължително е типът на връщаната стойност да съвпада!
Класът не може да бъде подтип на два интерфейса, които са различно уточнение на общ родов интерфейс.
50
ЧЛЕНОВЕ НА КЛАС
Членовете на клас са: Наследени от директния суперклас. Наследени от директните суперинтерфейси. Собствени членове.
Членовете private не са достъпни в подкласовете на класа.
Конструктори, статични инициализатори и инициализатори на обекти не се наследяват.
51
ЧЛЕНОВЕ НА КЛАС
Клас, който няма конструктори получава такъв по подразбиране (без параметри): клас() { super(); }
Обръщението към родителския обект става чрез super. Пример: super.move();
Наследяване чрез достъп по подразбиране изисква дефиниране на метод в суперкласа за работа с недостъпните данни.
52
ЧЛЕНОВЕ НА КЛАС Един клас може да бъде експортиран
дори да не е public, ако има метод public, който връща обект.
Декларацията на членове на клас включва следните модификатори: public, protected, private, static, final, transient, volatile. transient – отбелязва, че полето не е част от
persistent състояние на обекта. volatile – синхронизира данните при
паралелно програмиране.
53
ЧЛЕНОВЕ НА КЛАС
Инициализация на полетата на клас: Статични полета се инициализират само
веднъж. static final се инициализират първи. Полетата на обект се инициализират всеки
път при създаване на обект. В инициализацията могат да се ползват
други полета на класа с уточнено име.
54
ЧЛЕНОВЕ НА КЛАС
Членовете на клас могат да се припокриват в подклас.Ако в един клас са наследени > 1
полета с еднакви имена и различна декларация (от суперклас и интерфейс или от 2 интерфейса), достъпът до тях се осъществява чрез уточнено име.
Ако в един клас са наследени > 1 полета с еднакви имена и еднаква декларация, в наследника има само по едно копие на еднаквите данни.
55
МЕТОДИ Декларация на метод:
[модиф.][т.парам.]тип идент.([сп.парам.])[throws сп.изкл.ситуации]
Модификатори:public, protected, private,
abstract, final, static, synchronized, native, strictfp
private, static, native и final не могат да бъдат abstract.
Един метод, който не е абстрактен, може да бъде предефиниран от такъв.
56
МЕТОДИ Метод native е платформено зависим
метод и е написан на С/С++, Фортран или Асемблер.
Модификатор synchronized работи като монитор за синхронизация на данни при паралелно програмиране. Възможно е да не се синхронизира целия
метод, а само част от него чрез: synchronized (this) {…} – за обекти synchronized (Class.ForName(“клас”)) {…} – за static
57
МЕТОДИ
Тип Т1, връщан от метод М1 е съвместим с тип Т2, връщан от метод М2: Ако Т1 и Т2 са примитиви и са идентични. Ако Т1 и Т2 са рефериращи и:
Ако Т1 е подтип на Т2 или може да се преобразува до негов подтип или
Т1=|T2|. Т1 и Т2 са void.
58
МЕТОДИ
В заглавието на всеки метод трябва да бъдат описани изключителните ситуации, които той може да генерира.
Ако един метод предефинира друг, той също трябва да включва изключителните ситуации на първия.
Overriding – получава се при наследяване, при методи с еднаква сигнатура. Типът на връщаната стойност трябва да съвпада, защото се генерира грешка.
59
МЕТОДИ
Overloading – получава се при методи в един клас с различна сигнатура.
Hiding – когато един метод се скрие от метод на наследника.В следващото поколение методът на
прародителя е недостъпен, поради което се ползва overload.
Кой метод ще се извика зависи от стойността на променливата обект. Ако методът е статичен в сила е типа на тази променлива.
60
КОНСТРУКТОРИ Не могат да се ползват модификатори:
final, static, synchronized, strictfp, native, abstract.
Ако няма модификатор се подразбира private.
Ако няма явно дефиниран конструктор, се създава автоматично такъв по подразбиране.
Ако се дефинира явно конструктор с параметри, трябва да се дефинира и такъв по подразбиране явно от програмиста.
61
КОНСТРУКТОРИ
Допуска се дефиниране на родов конструктор за родовите класове.
Конструкторът може да прихваща изключителни ситуации точно както методите.
Родителският конструктор се извиква със super() от тялото на наследника.
Ако няма явно обръщение към super() се извиква неявно конструкторът по подразбиране на суперкласа.
62
КОНСТРУКТОРИ Обръщение от един конструктор на текущия клас
към друг става с this(парам.). Обръщение към вложен клас:class Outer { public class Inner { public Inner(){ } } public Outer(){ }}
class InnerChild extends Outer.Inner { public InnerChild() { (new Outer()).super(); }}
63
КОНСТРУКТОРИ
Конструкторът по подразбиране няма throw клауза.
Видимостта на конструкторът по подразбиране се определя от видимостта на класа.
Създаването на обект може да се контролира ако се модифицира видимостта на конструктора.
64
ENUMS Декларация:[модиф.]enum идент.[интерфейси]{[конст.][,конст.] код} Пример:
enum Color { RED,BLUE,GREEN; static final Map<String,Color> clrMap = new
HashMap<String,Color>(); static { for (Color c:Color.values()) clrMap.put(c.toString(),c); }}
Печат: System.out.println(Color.clrMap);
65
ENUMS
Допуска се влагане enum:public class Example1 { public enum Season { WINTER,
SPRING, SUMMER, FALL } public static void main(String[] args) {
for (Season s : EnumSet.range(Season.WINTER,Season.SUMMER))
System.out.println(s);}
}