Програмни езици - java

65
ПРОГРАМНИ ЕЗИЦИ - JAVA 1

Upload: yank

Post on 12-Jan-2016

45 views

Category:

Documents


1 download

DESCRIPTION

Програмни езици - Java. Лексическа структура на Java. Структура на Java програма. Програмите на Java се пишат в Unicode. Прави се лексическа транслация , с която Unicode escapes ( \ uXXXX ) могат да се ползват за да вкл. Произволни Unicode символи, използващи само ASCII символи. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Програмни езици  - Java

1

ПРОГРАМНИ ЕЗИЦИ - JAVA

Page 2: Програмни езици  - Java

2

ЛЕКСИЧЕСКА СТРУКТУРА НА JAVA

Page 3: Програмни езици  - Java

3

СТРУКТУРА НА JAVA ПРОГРАМА Програмите на Java се пишат в Unicode. Прави се лексическа транслация, с която

Unicode escapes (\uXXXX) могат да се ползват за да вкл. Произволни Unicode символи, използващи само ASCII символи.

Дефинирани са символи за край на ред (LF, CR) за работа под различни ОС.

Символите Unicode, получени вследствие лексическата транслация се редуцират до набор white space (HT, space, FF, LF, CR) символи, коментари и tokens.

Tokens са: Идентификатори; Ключови думи Литерали Разделители Операции.

Page 4: Програмни езици  - Java

4

ЛИТЕРАЛИ

Целочислени Плаваща запетая Булеви

true false

null Символни

UTF-16[ U+0000, U+10FFFF ]

Низови

Page 5: Програмни езици  - Java

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"; }

Page 6: Програмни езици  - Java

6

ТИПОВЕ, ПРОМЕНЛИВИ И ОПЕРАЦИИ

Page 7: Програмни езици  - Java

7

Типове в Java

Примитиви

Рефериращи

boolean

Числови

Интегрални

float double

byte

short

int long

char

class

interface

масив

null

Page 8: Програмни езици  - Java

8

ТИПОВЕ В JAVA Java е строго типизиран език, което

означава, че всяка променлива и стойност трябва да има тип по време на компилация.

Интегрални типове: byte – знаков 8 бита, клас Byte short – знаков 16 бита, клас Short int – знаков 32 бита, клас Integer long – знаков 64 бита, клас Long char – символ, 16 бита, клас Character

Page 9: Програмни езици  - Java

9

ТИПОВЕ В JAVA

Грешки, получавани при операциите върху интегрален тип данни: NullPointerException – при пробразуване от

клас в примитивна данна ArithmeticException – при делене на нула OutOfMemoryError – при преобразуване от

примитивен тип в съответния клас

Page 10: Програмни езици  - Java

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 с цел диагностика.

Page 11: Програмни езици  - Java

11

ТИПОВЕ В JAVA Грешки, получавани при операциите

върху данни ПЗ:NullPointerException – при пробразуване

от клас в примитивна даннаOutOfMemoryError – при преобразуване

от примитивен тип в съответния клас Препълване отгоре при операции

дава безкрайност. Препълване отдолу дава

ненормализирана мантиса или знакова нула.

Неправилна операция дава NaN. Ако в операция участва един NaN

резултатът е NaN.

Page 12: Програмни езици  - Java

12

ТИПОВЕ В JAVA

Булев тип: boolean, клас Boolean Участва само в логически операции и

конкатенация (+).

Page 13: Програмни езици  - Java

13

ТИПОВЕ В JAVA

Рефериращи типове: Клас Object. По-важни методи:

getClass връща обект от тип Class, който представя класа на обекта. Такъв опбект съществува за всички рефериращи типове.

toString преобразува обекта към String. equals и hashCode се използват в хештаблици като

equals връща true когато 2 обекта са еднакви. clone прави копие на обект. finalize се извиква преди унищожаване на обекта.

Page 14: Програмни езици  - Java

14

ТИПОВЕ В JAVA Клас String:

Работи само с константни стойности. Поддържа операция конкатенация (+)

2 рефериращи типа са еднакви по време на компилация, ако имат едно и също име и еднакви типови параметри.

2 класа или 2 интерфейса са еднакви по време на работа на програмата, ако имат едно и също име и еднакъв class loader.

2 масива са еднакви, ако имат еднакви типове на елементите.

Page 15: Програмни езици  - Java

15

ТИПОВЕ В JAVA

Типова променлива: Променлива, дефинираща родов клас

(шаблонен), родов интерфейс, родов метод или родов конструктор.

Пример: <T extends C&I>, Т наследява членове на С и I, където C e клас, а I - интерфейс, които са в същата област на действие.

Page 16: Програмни езици  - Java

16

ТИПОВЕ В JAVA

Параметризиран тип – състои се от клас или интерфейс и списък от параметри.

Пример: Vector<String> Vector<int> Pair<String,Integer> Pair<String>

public Method getMethod(Class<?>[] parameterTypes) { ... }

boolean addAll(Collection<? Extends C> c) {…}

Page 17: Програмни езици  - Java

17

ТИПОВЕ В JAVA

Супертип и подтип (S >1T): double >1 float float >1 long long >1 int int >1 char int >1 short short >1 byte Клас и суперклас, суперинстанция

Page 18: Програмни езици  - Java

18

ПРОМЕНЛИВИ И КОНСТАНТИ В JAVA

Видове променливи:Клас-променливи – както static в СПроменливи на обектКомпоненти на масиви

Неименовани променливи, които се създават и инициализират при създаване на масив

Формални параметриПараметри на конструкторитеПараметри за обработка на

изключителни ситуацииЛокални – в пределите на

Page 19: Програмни езици  - Java

19

ПРОМЕНЛИВИ И КОНСТАНТИ В JAVA

Дефиниране на константи: final static double PI=3.14;

Инициализация на променливи, членове на клас: boolean – false; класове – null; char – ‘\u0000’;Всички останали примитиви – нула.

Локалните променливи нямат инициализация.

Page 20: Програмни езици  - Java

20

ПРЕОБРАЗУВАНЕ НА ТИПОВЕ

Преобразуване при присвояванеНяма към булев типГенерират се следните грешки:

OutOfMemoryError, NullPointerException, ClassCastException

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

Смяна на типа: (нов_тип) пром. Всички типове могат да се

преобразуват към String.

Page 21: Програмни езици  - Java

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

Page 22: Програмни езици  - Java

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

Page 23: Програмни езици  - Java

23

ПРЕОБРАЗУВАНЕ НА ТИПОВЕ

Между класове: Тип към супертип Клас към интерфейс без параметри – ако

класа не е final и не реализира интерфейса Интерфейс към клас без параметри – ако

класа не е final Интерфейс Clonable java.io.Serializable към

масив от обекти

Page 24: Програмни езици  - Java

24

ПРЕОБРАЗУВАНЕ НА ТИПОВЕ

Интерфейс към непараметризиран интерфейс – ако първия не е подтип на втория

Един тип масив към друг тип масив – ако са съвместими рефериращи типове

Всеки примитив може да се преобразува до съответния си клас и обратно.

Page 25: Програмни езици  - Java

25

ДОСТЪП ДО ИМЕНАТА Пакетът винаги е достъпен. Когато един клас или интерфейс

има модификатор за достъп public, той е достъпен за всички пакети.

Когато клас или интерфейс няма модификатор за достъп не може да се ползва извън пакета, в който е дефиниран.

Един масив е достъпен само ако типа на неговите елементи е достъпен.

Данните и методите protected са достъпни е рамките на пакета и извън него само в наследниците на класа.

Page 26: Програмни езици  - Java

26

ПЪЛНО КВАЛИФИЦИРАНО ИМЕ

Примитивните типове не се квалифицират.

Името на пакет, който е на най-високо ниво не се квалифицира.

Името на подпакет се квалифицира пакет.подпакет

Името на клас или интерфейс на най-високо ниво в безименен пакет не се квалифицира.

Името на клас или интерфейс, декларирано в пакет се квалифицира пакет.клас и пакет.интерфейс съответно.

Page 27: Програмни езици  - Java

27

ПРАВИЛА ЗА ИМЕНОВАНЕ Името на пакет започва с малка буква и

не трябва да започва с java. Името на клас трябва да е съществително

или съществителна фраза, като всяка дума да започва с главна буква.

Името на интерфейс трябва да е съществително, съществителна фраза или допълнение като всяка дума да започва с главна буква.

Page 28: Програмни езици  - Java

28

ПРАВИЛА ЗА ИМЕНОВАНЕ

Типовите имена започват с главна буква.

Името на метод трябва да е глагол или глаголна фраза, като всяка дума, без първата, да започва с главна буква.

Името на данна поле на клас, което не е константа, трябва да е съществително или съществителна фраза, като всяка дума, без първата, да започва с главна буква.

Константата се записва само с главни букви като отделните думи се свързват с подчертавка.

Page 29: Програмни езици  - Java

29

ПРАВИЛА ЗА ИМЕНОВАНЕ

Имената на локални променливи и формални параметри трябва да са кратки, да не са само от един символ. Изключения се допускат (за едносимволни имена) само за temp променливи и управляващи цикъл.

Page 30: Програмни езици  - Java

30

ПАКЕТИ

Page 31: Програмни езици  - Java

31

ПАКЕТИ

Програмите на java са организирани в пакети.

В една програма може да има само един пакет без име. Всички останали имат име и могат да бъдат съхранени във файл или БД.

Пакетът съдържа произволен брой компилируеми файлове. Всеки файл има достъп до данните, методите и типовете на своя пакет и тези от java.lang.

Имената на пакетите трябва да са уникални.

Page 32: Програмни езици  - Java

32

ЧЛЕНОВЕ НА ПАКЕТИ

Всички подпакети, класове и интерфейси, декларирани на външно ниво в пакета са негови членове.

Пример - Java API има следните пакети: Пакетът java има awt, applet, io, lang, net и util

подпакети и няма компилируеми файлове. Пакетът java.awt има подпакет image и

множество компилируеми файлове, съдържащи декларации на класове и интерефейси.

Page 33: Програмни езици  - Java

33

ЧЛЕНОВЕ НА ПАКЕТИ

Не се разрешава име на пакет да съвпада с име на клас или интерфейс в него.

Не се разрешава име на пакет да съвпада с име на негов подпакет.

Page 34: Програмни езици  - Java

34

СЪХРАНЕНИЕ НА ПАКЕТИ Всички пакети и прилежащите им

сорсове се съхраняват в директория и поддиректории.

Всяка поддиректория представя пакет.

В директориите се намират сорс кода .java и двоичния код .class.

За да се намали обема памет директориите се архивират в jar архиви.

За достъп до класовете в пакет се посочва относителния път спрямо пакета на топ ниво като \ се замества с .

Пример: java.awt.image

Page 35: Програмни езици  - Java

35

КОМПИЛИРУЕМИ ФАЙЛОВИ ЕДИНИЦИ Компилируема единица е файл,

съдържащ: Декларация на пакет Импортиране на пакет Декларация на типове

Page 36: Програмни езици  - Java

36

ДЕКЛАРАЦИЯ НА ПАКЕТ

package име; Безименният пакет няма подпакети. Той

не се декларира. Всеки пакет и неговите подпакети са

видими навсякъде, където са импортирани.

java.lang се импортира автоматично. Всеки файл съдържа само един public

клас, чието име съвпада с името на файла.

Page 37: Програмни езици  - Java

37

ИМПОРТИРАНЕ НА ПАКЕТ

Може да се импортира цял пакет или само конкретен файл. import java.util.*; import java.util.Vector;

Импортират се само public типовете на файла.

Съществува и импортиране на статични типове: import static тип.идентификатор; import static тип.*;

java.lang се импортира автоматично.

Page 38: Програмни езици  - Java

38

ДЕКЛАРАЦИИ НА ТОП НИВО НА ПАКЕТ Тук се включват:

Декларация на клас Декларация на интерфейс

Не се допуска съвпадение между имената на клас и интерефейс.

Декларациите на топ ниво са само public. Не се допуска импортиране на конкретен

клас и деклариране на клас със същото име.

Page 39: Програмни езици  - Java

39

КЛАСОВЕ В JAVA

Page 40: Програмни езици  - Java

40

ВЪВЕДЕНИЕ

Класификация според нивото на декларация:Декларирани на външно нивоВложени в друг клас

Локални класове Анонимни класове

Видове класове: Абстрактни final – не могат да се наследяват publicРодови

Няма множествено наследяване!

Page 41: Програмни езици  - Java

41

ВЪВЕДЕНИЕ Членовете на клас и интерфейс могат да

имат модифкатори за достъп: public, private, protected.

Членовете на един клас скриват наследените със същото име.

Полетата могат да бъдат: final static Друг клас

Page 42: Програмни езици  - Java

42

ВЪВЕДЕНИЕ

Методите могат да бъдат: final – не могат да се припокриват abstract – нямат реализация synchronized – за работа с нишки; заключва

обекта native – код, зависим от реализацията си

Методите могат да се припокриват. Няма деструктори.

Page 43: Програмни езици  - Java

43

ДЕКЛАРИРАНЕ НА КЛАС

[Модификатор] class идент. [т.име] [родител] [интерфейси]тяло

Модификатори: public, protected, private, static, final, strictfp

Един клас има абстрактни методи, ако:Съдържа декларация на абстрактен метод.Ако някой от родителските класове има

абстрактен метод, който не е дефиниран в текущия.

Класът наследява интерфейси, които имат абстрактни методи, без да ги реализира.

Page 44: Програмни езици  - Java

44

ДЕКЛАРИРАНЕ НА КЛАС

Един клас се декларира final, ако не трябва да се наследява.

Един клас се декларира с strictfp, когато изразите с ПЗ са FP-strict.

Класът е родов, ако има типови параметри.

Вътрешен клас е вложен клас, който не е явно или неявно деклариран static.Явна декларация – класът има статични

членове.Неявна декларация – класът наследява

клас със статични членове.

Page 45: Програмни езици  - Java

45

ДЕКЛАРИРАНЕ НА КЛАС

Вътрешният клас: Няма право да има статични инициализатори. Няма членове интерфейси и членове static. Може да наследява статични членове. Не може да се позовава към неконстантни

членове на обхващащия клас. Може да съдържа локални класове, анонимни

класове и нестатични членове.

Page 46: Програмни езици  - Java

46

ДЕКЛАРИРАНЕ НА КЛАС

Локален клас е клас в пределите на функция.

Не се допуска инициализация на членовете на локален клас, дефиниран в пределите на статичен метод, с неконстанти. Това е възможно само за локален клас, дефиниран в нестатичен метод.

Локален клас не може да бъде статичен.

Page 47: Програмни езици  - Java

47

ДЕКЛАРИРАНЕ НА КЛАС

Суперклас е родителят на даден клас.Директен суперклас – пряк родител на

класа. Наследеният клас е подклас на своя

родител. Връзката подклас е транзитивна. Клас С е директно зависим от тип Т,

ако Т присъства в extend. Клас С е зависим от Т, ако е:

директно зависим.директно зависим от интерфейс, който

зависи от Т.Директно зависим от клас, който зависи

от Т.

Page 48: Програмни езици  - Java

48

ДЕКЛАРИРАНЕ НА КЛАС Директен суперинтерфейс – интерфейс,

реализиран от класа. Интерфейс I е суперинтерфейс на класа С,

ако: I е директен суперинтерфейс. С има директен суперинтерфейс J, на който I

е суперинтерфейс. I е суперинтерфейс на директен подклас на

С. Интерфейсите могат да се наследяват.

Page 49: Програмни езици  - Java

49

ДЕКЛАРИРАНЕ НА КЛАС

Допуска се създаване реализация на интерфейси, притежаващи методи с еднаква сигнатура в един клас. Задължително е типът на връщаната стойност да съвпада!

Класът не може да бъде подтип на два интерфейса, които са различно уточнение на общ родов интерфейс.

Page 50: Програмни езици  - Java

50

ЧЛЕНОВЕ НА КЛАС

Членовете на клас са: Наследени от директния суперклас. Наследени от директните суперинтерфейси. Собствени членове.

Членовете private не са достъпни в подкласовете на класа.

Конструктори, статични инициализатори и инициализатори на обекти не се наследяват.

Page 51: Програмни езици  - Java

51

ЧЛЕНОВЕ НА КЛАС

Клас, който няма конструктори получава такъв по подразбиране (без параметри): клас() { super(); }

Обръщението към родителския обект става чрез super. Пример: super.move();

Наследяване чрез достъп по подразбиране изисква дефиниране на метод в суперкласа за работа с недостъпните данни.

Page 52: Програмни езици  - Java

52

ЧЛЕНОВЕ НА КЛАС Един клас може да бъде експортиран

дори да не е public, ако има метод public, който връща обект.

Декларацията на членове на клас включва следните модификатори: public, protected, private, static, final, transient, volatile. transient – отбелязва, че полето не е част от

persistent състояние на обекта. volatile – синхронизира данните при

паралелно програмиране.

Page 53: Програмни езици  - Java

53

ЧЛЕНОВЕ НА КЛАС

Инициализация на полетата на клас: Статични полета се инициализират само

веднъж. static final се инициализират първи. Полетата на обект се инициализират всеки

път при създаване на обект. В инициализацията могат да се ползват

други полета на класа с уточнено име.

Page 54: Програмни езици  - Java

54

ЧЛЕНОВЕ НА КЛАС

Членовете на клас могат да се припокриват в подклас.Ако в един клас са наследени > 1

полета с еднакви имена и различна декларация (от суперклас и интерфейс или от 2 интерфейса), достъпът до тях се осъществява чрез уточнено име.

Ако в един клас са наследени > 1 полета с еднакви имена и еднаква декларация, в наследника има само по едно копие на еднаквите данни.

Page 55: Програмни езици  - Java

55

МЕТОДИ Декларация на метод:

[модиф.][т.парам.]тип идент.([сп.парам.])[throws сп.изкл.ситуации]

Модификатори:public, protected, private,

abstract, final, static, synchronized, native, strictfp

private, static, native и final не могат да бъдат abstract.

Един метод, който не е абстрактен, може да бъде предефиниран от такъв.

Page 56: Програмни езици  - Java

56

МЕТОДИ Метод native е платформено зависим

метод и е написан на С/С++, Фортран или Асемблер.

Модификатор synchronized работи като монитор за синхронизация на данни при паралелно програмиране. Възможно е да не се синхронизира целия

метод, а само част от него чрез: synchronized (this) {…} – за обекти synchronized (Class.ForName(“клас”)) {…} – за static

Page 57: Програмни езици  - Java

57

МЕТОДИ

Тип Т1, връщан от метод М1 е съвместим с тип Т2, връщан от метод М2: Ако Т1 и Т2 са примитиви и са идентични. Ако Т1 и Т2 са рефериращи и:

Ако Т1 е подтип на Т2 или може да се преобразува до негов подтип или

Т1=|T2|. Т1 и Т2 са void.

Page 58: Програмни езици  - Java

58

МЕТОДИ

В заглавието на всеки метод трябва да бъдат описани изключителните ситуации, които той може да генерира.

Ако един метод предефинира друг, той също трябва да включва изключителните ситуации на първия.

Overriding – получава се при наследяване, при методи с еднаква сигнатура. Типът на връщаната стойност трябва да съвпада, защото се генерира грешка.

Page 59: Програмни езици  - Java

59

МЕТОДИ

Overloading – получава се при методи в един клас с различна сигнатура.

Hiding – когато един метод се скрие от метод на наследника.В следващото поколение методът на

прародителя е недостъпен, поради което се ползва overload.

Кой метод ще се извика зависи от стойността на променливата обект. Ако методът е статичен в сила е типа на тази променлива.

Page 60: Програмни езици  - Java

60

КОНСТРУКТОРИ Не могат да се ползват модификатори:

final, static, synchronized, strictfp, native, abstract.

Ако няма модификатор се подразбира private.

Ако няма явно дефиниран конструктор, се създава автоматично такъв по подразбиране.

Ако се дефинира явно конструктор с параметри, трябва да се дефинира и такъв по подразбиране явно от програмиста.

Page 61: Програмни езици  - Java

61

КОНСТРУКТОРИ

Допуска се дефиниране на родов конструктор за родовите класове.

Конструкторът може да прихваща изключителни ситуации точно както методите.

Родителският конструктор се извиква със super() от тялото на наследника.

Ако няма явно обръщение към super() се извиква неявно конструкторът по подразбиране на суперкласа.

Page 62: Програмни езици  - Java

62

КОНСТРУКТОРИ Обръщение от един конструктор на текущия клас

към друг става с this(парам.). Обръщение към вложен клас:class Outer { public class Inner { public Inner(){ } } public Outer(){ }}

class InnerChild extends Outer.Inner { public InnerChild() { (new Outer()).super(); }}

Page 63: Програмни езици  - Java

63

КОНСТРУКТОРИ

Конструкторът по подразбиране няма throw клауза.

Видимостта на конструкторът по подразбиране се определя от видимостта на класа.

Създаването на обект може да се контролира ако се модифицира видимостта на конструктора.

Page 64: Програмни езици  - Java

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);

Page 65: Програмни езици  - Java

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);}

}