From 23c91016dd07dbc13ec092a42e8c08417be4e05c Mon Sep 17 00:00:00 2001 From: 100yo Date: Thu, 17 Oct 2024 01:12:09 +0300 Subject: [PATCH] Add OOP in Java (part I) lecture slides --- 02-oop-in-java-i/README.md | 1 + 02-oop-in-java-i/lecture/images/02.1-oop.jpg | Bin 0 -> 26233 bytes 02-oop-in-java-i/lecture/slides.html | 29 + 02-oop-in-java-i/lecture/slides.md | 976 +++++++++++++++++++ README.md | 1 + 5 files changed, 1007 insertions(+) create mode 100644 02-oop-in-java-i/README.md create mode 100644 02-oop-in-java-i/lecture/images/02.1-oop.jpg create mode 100644 02-oop-in-java-i/lecture/slides.html create mode 100644 02-oop-in-java-i/lecture/slides.md diff --git a/02-oop-in-java-i/README.md b/02-oop-in-java-i/README.md new file mode 100644 index 00000000..8c38cd0f --- /dev/null +++ b/02-oop-in-java-i/README.md @@ -0,0 +1 @@ +# Обектно-ориентирано програмиране с Java (част I) diff --git a/02-oop-in-java-i/lecture/images/02.1-oop.jpg b/02-oop-in-java-i/lecture/images/02.1-oop.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b63051a02df43333da7e0a3e2b4b906effbc2063 GIT binary patch literal 26233 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 HXZ(Kv5?JO5 literal 0 HcmV?d00001 diff --git a/02-oop-in-java-i/lecture/slides.html b/02-oop-in-java-i/lecture/slides.html new file mode 100644 index 00000000..7e553acb --- /dev/null +++ b/02-oop-in-java-i/lecture/slides.html @@ -0,0 +1,29 @@ + + + + [MJT2025] Modern Java Technologies Lecture + + + + + + + + + + + + + diff --git a/02-oop-in-java-i/lecture/slides.md b/02-oop-in-java-i/lecture/slides.md new file mode 100644 index 00000000..da82d1ef --- /dev/null +++ b/02-oop-in-java-i/lecture/slides.md @@ -0,0 +1,976 @@ +class: center, middle + +# Обектно-ориентирано програмиране с Java + +![Java OOP](images/02.1-oop.jpg) + +18.10.2023 + +--- + +### Предната лекция говорихме за: + +- Tиповете данни +- Оператори, изрази, statements +- Условия и разклонения +- Итерация / Цикли +- Низове и операции с тях +- Масиви +- Функции + +--- + +### Днес ще разгледаме: + +- Класове и обекти +- Абстрактни класове и интерфейси +- Фундаменталните ООП принципи + - Енкапсулация + - Наследяване + - Полиморфизъм + - Абстракция + +--- + +### Обектно-ориентирано програмиране + +- Родено е от необходимостта за по-добър контрол над едновременната модификация на споделени данни +- Основната идея е, да няма директен достъп до данните, а те да се достъпват през нарочен за целта слой код +- Понеже данните трябва да се предават и модифицират, се ражда концепцията за обект + +--- + +### Обект + +- Обект в най-общ смисъл е множество данни, които могат да се предават и достъпват само чрез множество методи, които се подават заедно с данните +- Данните съставляват *състоянието* на обекта, а методите съставляват *поведението* на обекта +- Състоянието на обекта е скрито (*енкапсулирано*) от директен достъп +- Обектът е инстанция (представител) на даден клас. Обекти се създават явно чрез оператора `new` или неявно, и живеят в heap паметта + +--- + +### Създаване на обекти + +```java +String message = new String("Operation completed."); // explicit +Integer studentsCount = Integer.valueOf(60); // implicit +int[] intArr = new int[100]; // explicit +String[] stringArr = {"Some", "example"}; // implicit +stringArr = new String[]{"Changed", "my", "mind"}; // explicit +``` + +--- + +### Клас + +- Клас – дефиниция на (клас от) обекти + - описва състояние чрез член-данни (член-променливи) + - описва поведение чрез методи +- Конструктор(и) +- Метод(и) +- Възможно е даден клас да няма състояние или да няма поведение +- Всеки клас има определен *интерфейс* - формално описание на начина, по който други обекти могат да взаимодействат с него + +--- + +### Метод на клас + +- Функция за манипулиране на състоянието на класа + - име и списък от параметри (*сигнатура*) + - броят на параметрите се нарича *арност* + - два метода имат еднаква сигнатура, ако имат еднакви имена, еднаква арност и еднаква последователност от типове в списъка от параметри + - модификатори, тип на връщаната стойност, сигнатура и тяло, оградено с {} + - тялото може да съдържа декларации на локални променливи и statements + - може да има странични ефекти + +--- + +### Метод на клас + +```java +public class AdmissionTestProblems { + + public static int getMissingNo(int a[]) { + int i, total, n = a.length; + total = n * (n + 1) / 2; + + for (i = 0; i < n; i++) { + total -= a[i]; + } + + return total; + } + +} +``` + +--- + +### Методи с променлив брой аргументи + +- специален вид параметър на метод: редица от нула или повече аргументи от един и същи тип +- Нарича се *varargs*, от *variable arguments* +- Синтаксис: име на тип, следван от три точки (многоточие) +- Ако метод има varargs параметър, той трябва да е един и да е последен в списъка +- При достигане до varargs параметър, компилаторът създава масив от останалите аргументи и ги подава на метода като масив +- В тялото на метода се достъпва като масив + +--- + +### Методи с променлив брой аргументи + +```java +// A method that takes variable number of integer arguments +static void funWithVarargs(int... a) { + System.out.println("Number of arguments: " + a.length); + + // using for-each loop to display contents of a + for (int i : a) { + System.out.print(i + " "); + } +} + +public static void main(String[] args) { + // standard syntax +} + +public static void main(String... args) { + // varargs syntax - equivalent to the above +} +``` + +--- + +### Статични член-променливи и статични методи + +- Те са част от класа, а не от конкретна негова инстанция (обект) +- Могат да се достъпват, без да е създаден обект: само с името на класа, точка, името на статичната член-променлива или метод + +
+ +```java +System.out.println(Math.PI); // 3.141592653589793 +System.out.println(Math.pow(3, 2)); // 9.0 +``` + +--- + +### Статични член-променливи + +- Статичните член-променливи имат едно-единствено копие, което се споделя от всички инстанции на класа + - ако са константи, пестим памет (няма смисъл да се мултиплицират във всяка инстанция) + - ако са променливи, всяка инстанция "вижда" и променя една и съща стойност, което е механизъм за комуникация между всички инстанции на дадения клас + +--- + +### Статични методи + +- Статичните методи имат достъп само до статичните член-променливи и други статични методи на класа +- Нестатичните методи имат достъп както до статичните, така и до нестатичните членове на класа + +--- + +### Статични методи + +```java +public class Utils { + public static final double PI = 3.14; // constant + private static int radius = 10; // static member + private String fact5 = "5!"; // non-static member + + // static method + public static long fact(int n) { + if (n == 1) { return 1; } else { return n * fact(n - 1); } + } + + // non-static method + public String getFact() { + return fact5; + } + + public static void main(String[] args) { + System.out.println("Perimeter is " + 2 * Utils.PI * radius); + System.out.println(new Utils().getFact() + "=" + Utils.fact(5)); + Utils.getFact(); // won't compile + } +} +``` + +--- + +### Ключовата дума `this` + +- Референция към конкретния обект +- Неявно се подава като параметър на всеки конструктор и нестатичен метод на класа +- Употребява се за: + - достъпване на член-променливи, "скрити" от едноименни параметри на метод или локални променливи + - извикване от конструктор на друг overloaded конструктор в същия клас + - извикване на произволен метод на класа + +--- + +### Ключовата дума `this` + +```java +public class Human { + + private String name; + + public Human() { + // Извикване на overload-натия конструктор със String параметър + this("Unknown"); + } + + public Human(String name) { + // Достъпване на член-променлива, скрита от едноименен параметър + this.name = name; + } + + public void whoAmI() { + System.out.println("My name is " + name); + } + +} +``` + +--- + +### Обект - конкретна инстанция на даден клас + +```java +public class MainApp { + + public static void main(String[] args) { + Human ivan = new Human("Ivan"); + ivan.whoAmI(); + Human petar = new Human("Petar"); + petar.whoAmI(); + } + +} +``` + +--- + +### Пакети + +- Именувани групи от семантично свързани класове +- Служат за йерархично организиране на кода +- Съответстват на директорно дърво на файловата система +- Конвенция за именуване: + - само малки букви, точка за разделител + - компаниите използват обърнат домейн адрес + - `mail.google.com` → `com.google.mail` + +--- + +### Пакети + +- всеки Java клас се намира в някакъв пакет +- пакетът се указва в началото на сорс файла (преди дефиницията на класа) с ключовата дума `package` +- ако липсва `package` декларация, класът е в пакета по подразбиране (който няма име) - което е лоша практика + +
+ +```java +package bg.sofia.uni.fmi.mjt.example; + +public class Example { + // class Example is in package bg.sofia.uni.fmi.mjt.example +} +``` + +--- + +### Достъп до клас от друг пакет + +- Всеки клас има достъп по подразбиране (имплицитно) до: + - класовете от собствения си пакет + - класовете в пакета `java.lang` +- Ако искаме клас да има достъп до клас в някой друг пакет, трябва или експлицитно да го заявим с `import` декларация, която поставяме над декларацията на класа, или да се позоваваме до него с пълното му име, което включва и пакета му (не се препоръчва). +- `import` декларацията може да е за конкретен клас с пълното му име: име на пакет + `.` + име на клас, или на всички класове в даден пакет (т.нар. *wildcard import*: име на пакет + `.*`, което обаче е лоша практика откъм clean code) + +--- + +### Достъп до клас от друг пакет + +```java +package bg.sofia.uni.fmi.mjt.example; + +import java.util.Arrays; +import java.util.Scanner; + +public class StringUtils { + + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + char[] tokens = scanner.nextLine().toCharArray(); + Arrays.sort(tokens); + // java.util.Arrays.sort(tokens); // the ugly alternative + System.out.println(tokens); + } + +} +``` + +--- + +### Достъп до клас от друг пакет + +- Статичните член-данни и методи се достъпват с префикс: името на класа, който ги съдържа и точка +
+`double r = Math.cos(Math.PI * 10.0);` +- `import static` конструкцията позволява статичните членове да се ползват директно по името си + +
+ +```java +import static java.lang.Math.cos; +import static java.lang.Math.PI; + +... + +double r = cos(PI * 10.0); + +``` + +--- + +### Достъп до клас от друг пакет + +- Прието е `import`-ите да се подреждат в сортиран лексикографски ред по `.` +- По-чисто е да се изброят конкретните класове от пакета, вместо wildcard import (тип `import java.util.*;`) + - IDE-тата обаче автоматично "collapse"-ват `import`-ите от един и същи пакет над някаква бройка - изключете тази "екстра" + +--- + +### Модификатори за достъп + +за top-level клас, т.е. невложен в друг + +
+ +| Модификатор | Видимост | +| :--------------- |:------------------------------------------------ | +| `public` | Достъпен за всеки клас във всеки пакет | +| без модификатор* | Достъпен само за класовете в собствения си пакет | + +
+ + +\* казваме също "package-private", "default" + + +--- + +### Модификатори за достъп + +За член-променливи и методи на клас + +
+ +| Модификатор | Клас | Пакет | Подклас | Всички други | +| :------------ |:----:|:-----:|:-------:|:------------:| +| `public` | да | да | да | да | +| `protected` | да | да | да | не | +| no modifier | да | да | не | не | +| `private` | да | не | не | не | + +--- + +### Енкапсулация + +Енкапсулацията адресира основния проблем, мотивирал създаването на ООП: по-добро управление на достъпа до споделени данни. + +--- + +### Енкапсулация + +- Множеството текущи стойности на член-данните на даден обект се наричат негово *състояние* +- Само вътрешните методи на даден обект имат достъп до неговото състояние, като правят невъзможни неочакваните промени на състоянието от външния свят +- В Java се постига чрез модификаторите за достъп + +--- + +### Енкапсулация – пример за нарушаване + +```java +public class Human { + + public String name; // no encapsulation! + + public Human(String name) { + this.name = name; + } + +} + +public class Main { + + public static void main(String[] args) { + Human ivan = new Human("Ivan"); + ivan.name = "Faked Ivan"; // Hm... + } + +} +``` + +--- + +### Енкапсулация – пример за спазване + +```java +public class Human { + + private String name; // stays hidden + + public Human(String name) { + this.name = name; + } + +} + +public class Main { + + public static void main(String[] args) { + Human ivan = new Human("Ivan"); + ivan.name = "Faked Ivan"; // won't compile + } + +} +``` + +--- + +### Наследяване + +- Позволява преизползване и разширяване на състояние и поведение на вече съществуващи класове +- Когато клас наследява друг клас, за него казваме, че е *наследник*, или *дете*, или *подклас*, а втория клас наричаме *родител*, или *базов клас*, или *суперклас* +- В Java се реализира с ключовата дума `extends` +- Класът-наследник получава достъп до всички `public` и `protected` член-променливи и методи на родителския клас +- Java не поддържа множествено наследяване + +--- + +### Наследяване и method overriding + +- Класът-наследник може да предостави собствена дефиниция на (т.е. да предефинира) методи на родителския клас (*method overriding*) + +--- + +### Наследяване и method overriding + + - Сигнатурата на метода в класа-родител и класа-наследник трябва да е идентична + - Модификаторът за достъп на метод в класа–наследник трябва да съвпада или да разширява модификатора за достъп на метода в родителския клас (но не може да го свива/ограничава) + - Типът на връщаната стойност трябва да е *съвместим* с този на override-вания метод. Съвместим означава идентичен или наследник (за референтните типове) - *return type covariance* + - Методът в класа-наследник е препоръчително да се анотира с опционалната анотация `@Override`. Така компилаторът ще ни помага да не нарушаваме горните правила + +--- + +### Ключовата дума `super` + +- Употребява се за: + - достъпване на член-променливи на родителя + - извикване от конструктор в текущия клас на конструктор в родителския клас + - извикване на произволен метод на родителския клас +- Не нарушава енкапсулацията - през `super` може да достъпим само `public` и `protected` членове на родителския клас +- За разлика от `this`, не се предава като имплицитен параметър на нестатичните методи и конструкторите. JVM-ът знае йерархията от класове по време на изпълнение и може да достъпи елементите на родителския клас директно, без да му трябва референция + +--- + +### Ключовата дума `super` + +```java +public class Student extends Human { + + private int facultyNumber; + + public Student(String name, int facultyNumber) { + super(name); // извикване на родителския конструктор + this.facultyNumber = facultyNumber; + } + + public static void main(String[] args) { + Student ivan = new Student("Ivan", 61786); + ivan.whoAmI(); // наследен от родителя метод + } + +} +``` + +--- + +### Йерархията от класове в Java + +- Всички класове в Java са (преки или косвени) наследници на класа `java.lang.Object` +- Липсата на множествено наследяване означава, че всеки клас има точно един родител (с изключение на един-единствен клас, `java.lang.Object`, който няма родител). +- Следователно, йерархията от класове е дърво, с `java.lang.Object` в корена + +--- + +### `java.lang.Object` + +```java +boolean equals(Object obj) +int hashCode() +String toString() +Object clone() +``` + +--- + +### `equals()` + +- Трябва да го предефинираме, ако сравняваме два обекта за семантична (т.е. смислова) еднаквост, а не по референциите им (т.е. адреса им в паметта) +- Например, две инстанции на клас `Student` смислово са еднакви (отговарят на един и същи студент), ако факултетните им номера са еднакви – без значение дали референциите са еднакви или не + +--- + +### `hashCode()` + +- Трябва да го предефинираме, ако сме предефинирали `equals()` +- При предефинирането на `hashCode()`, ако `equals()` връща `true`, `hashCode`-ът на съответните обекти трябва да е равен +- Ако `hashCode`-ът на два обекта е равен, не е задължително `equals()` да връща `true` + +--- + +### Операторът `instanceof` + +- Използва се за type checking на референтните типове - дали даден обект е инстанция на даден клас + +--- + +### Операторът `instanceof` + +```java +Student ivan = new Student("Ivan", 61786); +Human petar = new Human("Petar"); + +System.out.println(ivan instanceof Student); // true +System.out.println(ivan instanceof Human); // true +System.out.println(petar instanceof Student); // false +System.out.println(petar instanceof Human); // true + +// arrays are reference types +int[] intArr = new int[2]; +System.out.println(intArr instanceof int[]); // true + +// null is not an instance of anything: false for any class +System.out.println(null instanceof AnyClass); + +// true for any non-null ref, because any class extends java.lang.Object +System.out.println(ref instanceof Object); +``` + +--- + +### Pattern matching for `instanceof` (since Java 16) + +```java +// until now +if (obj instanceof String) { + int stringLength = ((String) obj).length(); +} + +// since Java 16 (preview feature in Java 14 & 15) +if (obj instanceof String s) { + int stringLength = s.length(); +} +``` + +--- + +### Ключовата дума `final` + +- в декларация на променлива → прави я константа +- в декларация на метод → методът не може да се override-ва +- в декларация на клас → класът не може да се наследява + +--- + +### Полиморфизъм + +- От гръцки: poly (много) + morphe (форма) +- Дефиниция от биологията - съществуване на морфологично различни индивиди в границите на един вид +- В контекста на ООП, *полиморфизъм* е способността на даден обект да се държи като инстанция на друг клас или като имплементация на друг интерфейс + +--- + +### Полиморфизъм + +- ООП - наследниците на даден клас споделят поведение от родителския клас, но могат да дефинират и собствено поведение +- Всички Java обекти са полиморфични, понеже всеки обект наследява `java.lang.Object` класа + +--- + +### Method overriding vs method overloading + +- *Overriding* - класът-наследник предефинира поведението на класа-родител +- *Overloading* - класът декларира методи с едно и също име и различен брой и/или тип параметри + +--- + +### Runtime полиморфизъм чрез method overriding + +```java +public class Human { + + private String name; + + public Human(String name) { + this.name = name; + } + + public void whoAmI() { + System.out.println("My name is " + name); + } + +} +``` + +--- + +### Runtime полиморфизъм чрез method overriding + +```java +public class Student extends Human { + + private int facultyNumber; + + public Student(String name, int facultyNumber) { + super(name); + this.facultyNumber = facultyNumber; + } + + @Override + public void whoAmI() { + super.whoAmI(); + System.out.println("My faculty number is " + + this.facultyNumber); + } + +} +``` + +--- + +### Compile-time полиморфизъм чрез method overloading + +```java +public class Human { + + public void move() { + System.out.println("I am walking using two legs."); + } + + public void move(String vehicle) { + System.out.println("I move using a " + vehicle); + } + +} + +public class Main { + + public static void main(String[] args) { + Human ivan = new Human(); + ivan.move(); + ivan.move("Car"); + } + +} +``` + +--- + +### Method overriding vs method overloading + +
+ +| | __Overloading__ | __Overriding__ | +| :------------------------------------ | :-------------------- | :----------------------- | +| Кога | Compile-time | Runtime | +| Къде | В същия клас | В класовете - наследници | +| Списък от аргументи | Различен | Идентичен | +| Return type | Може да бъде различен | Съвместим | +| `static`, `private` и `final` методи | Да | Не | +| Свързване (binding) | Статично | Динамично | +| Runtime performance | Better | | + +--- + +### Non-polymorphic code + +```java +Student ivan = new Student("Ivan", 61786); +Human petar = new Student("Petar", 74451); + +Object[] objs = {ivan, petar}; + +for (Object obj : objs) { + + if (obj instanceof Student) { + ((Student) obj).whoAmI(); + } else if (obj instanceof Human) { + ((Human) obj).whoAmI(); + } + +} +``` + +--- + +### Non-polymorphic code + +```java +Student ivan = new Student("Ivan", 61786); +Human petar = new Student("Petar", 74451); + +Object[] objs = {ivan, petar}; + +for (Object obj : objs) { + // instanceof and explicit casts are the "red lights" +* if (obj instanceof Student) { +* ((Student) obj).whoAmI(); +* } else if (obj instanceof Human) { +* ((Human) obj).whoAmI(); +* } + +} +``` + +--- + +### Polymorphic code + +```java +Human[] humans = {ivan, petar}; + +for (Human human : humans) { + human.whoAmI(); +} +``` + +--- + +### Polymorphic code + +```java +Human[] humans = {ivan, petar}; + +for (Human human : humans) { + human.whoAmI(); +} +``` +
+Полиморфният код е не само по-кратък и четим. Помислете, как трябва да се променят двата фрагмента код, ако в бъдеще се появят нови класове – наследници на `Human` + +--- + +### Абстрактни класове + +- Дефинират се с модификатора `abstract` +- Могат да имат методи без имплементация, които се декларират с модификатора `abstract` +- Не са напълно дефинирани (оставят на наследниците си да ги конкретизират/допълнят) + - не могат да се създават обекти от тях +- Един клас не може да бъде едновременно `abstract` и `final` – защо? + +--- + +### Абстрактни класове - пример + +```java +public abstract class Cat { + public void move() { + System.out.println("I am walking on 4 toes."); + } + public void communicate() { + System.out.println("I mew."); + } + public abstract void eat(); +} + +public class DomesticCat extends Cat { + public void eat() { + System.out.println("I eat Whiskas."); + } +} + +public class Leopard extends Cat { + public void eat() { + System.out.println("I eat any prey."); + } +} +``` + +--- + +### Интерфейси + +- Съвкупност от декларации на методи без имплементация +- Описват формално поведение, без да го имплементират +- Може да съдържат `static` `final` член-променливи == константи + +--- + +```java +public interface Animal { + void move(); + void communicate(); +} +public class Human implements Animal { + private String name; + public Human(String name) { + this.name = name; + } + public void move() { + System.out.println("I am walking using two legs"); + } + public void communicate() { + System.out.println("I speak"); + } +} +public class Cat implements Animal { + public void move() { + System.out.println("I am walking using 4 toes"); + } + public void communicate() { + System.out.println("I mew"); + } +} +``` + +--- + +### Методи на интерфейсите + +- Методите на интерфейсите са `public` и `abstract` по подразбиране +- Модификаторите `public` и `abstract` (заедно или поотделно) могат да бъдат указани и експлицитно + - дали да бъдат експлицитно указани, е въпрос на стил - но е добре да сме консистентни +- Тъй като методите са абстрактни, не могат да бъдат декларирани като `final` + +--- + +### Интерфейси и наследяване + +- Интерфейсите могат да се наследяват +- Един интерфейс може да наследява множество интерфейси + +--- + +### Интерфейсите и имплементаците им + +- Интерфейсите не могат да се инстанцират +- Можем да инстанцираме (конкретни) класове, които ги имплементират +- Можем да присвояваме инстанция на клас на променлива от тип интерфейс, който класът имплементира +- Можем да проверяваме с `instanceof` дали клас имплементира даден интерфейс +- Един клас може да имплементира множество интерфейси + +--- + +### Интерфейси и имплементациите им + +- Ако даден клас декларира, че имплементира интерфейс, той трябва или + - да даде дефиниции на *всичките* му методи, или + - да бъде деклариран като абстрактен +- Като следствие, ако променим сигнатурата на метод(и) на интерфейса, или ако добавим нов(и) метод(и), трябва да променим и всички имплементиращи интерфейса класове +- Това често е проблем, а понякога е и невъзможно (нямаме контрол върху всички имплементации) + +--- + +### Default методи в интерфейсите (от Java 8) + +- Default-ен метод в интерфейс е метод, който + - има имплементация + - има модификатора `default` в декларацията си +- Имплементиращите класове имплицитно ползват default-ната имплементация на методите, но могат и да я предефинират + +--- + +### Default методи в интерфейсите (от Java 8) + +- Клас може да имплементира произволен брой интерфейси +- Ако два или повече от тях съдържат `default` метод с еднаква сигнатура, класът трябва задължително да предефинира този метод +- В предефинирания метод може експлицитно да се укаже, default-ната имплементация от кой родителски интерфейс да се ползва. В този случай, синтаксисът е, `<имеНаИнтерфейс>.super.<имеНаDefaultМетод>()` + +--- + +### Default методи в интерфейсите (от Java 8) + + +```java +public interface OptimisticLockable { + default boolean isLocked() { + return false; + } +} +public interface PessimisticLockable { + default boolean isLocked() { + return true; + } +} +public class Door implements OptimisticLockable, PessimisticLockable { + + // We will get a compile-time error, if we don't override the isLocked() method here: + // - "Door inherits unrelated defaults for isLocked() from types + // OptimisticLockable and PessimisticOldLockable" + @Override + public boolean isLocked() { + return OptimisticLockable.super.isLocked(); + } +} +``` + +--- + +### Статични методи в интерфейсите (от Java 8) + +- От Java 8, интерфейсите могат да съдържат и статични методи с имплементация +- Една класическа употреба е, за *factory* методи (ще говорим за тях в лекцията за design patterns) + +--- + +### Private методи в интерфейсите (от Java 9) + +- От Java 9, интерфейсите могат да съдържат и `private` методи с имплементация +- Изполват се, когато в интерфейса има два ли повече default-ни или статични метода, чиято имплементация частично се дублира + - тогава изнасяме повтарящия се код в `private` метод, за да предотвратим code duplication + +--- + +### Интерфейсите - обобщение + +- Интерфейсите могат да съдържат + - Публични, абстрактни методи без имплементация + - `static` `final` член-променливи == константи + - `default` и `static` методи с имплементация (от Java 8) + - `private` методи (от Java 9) + +--- + +### Интересни частни случаи на интерфейси + +- Интерфейс, който + - не съдържа нито един метод, се нарича *маркерен* + - има точно един публичен абстрактен метод, се нарича *функционален* + +--- + +### Абстракция + +- Абстракция означава, моделирайки в обектно-ориентиран език за програмиране обекти от реалния или виртуалния свят, да се ограничим само до съществените им за конкретната задача характеристики и да се абстрахираме (пропуснем) в модела несъществените или нерелевантни за задачата + - Пример: моделирайки студент, да го характеризираме само с име и факултетен номер, абстрахирайки се от всички други характеристики на студента в реалния свят (напр. цвят на очите) + +--- + +### Абстракция + +- Абстракция също означава да работим с нещо, което знаем как да използваме, без да знаем как работи вътрешно. Всяка конкретна имплементация на поведение е скрита в своя обект, за външния свят е видимо само поведението (т.е. интерфейсът) +- Принципът за абстракция се постига в Java чрез интерфейси и абстрактни класове + +--- + +## Въпроси? + +.font-xl[.ri-github-fill.icon-inline[[fmi/java-course](https://github.com/fmi/java-course)]] + +.font-xl[.ri-youtube-fill.icon-inline[[MJT2024](https://www.youtube.com/playlist?list=PLew34f6r0Pxyldqe31Txob2V3M3m1MKCn)]] diff --git a/README.md b/README.md index e0f0b3cc..c121bc77 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ | # | Тема | Лекция | Видео | Дата | Упражение | Видео | Дата | | - | :--- | :----- | :---- | :--- | :-------- | :---- | :--- | | 1 | Въведение в Java | [слайдове](https://fmi.github.io/java-course/01-intro-to-java/lecture/slides.html) | [![Video](web/images/mjt-on-youtube.png)](https://youtu.be/X1bh5oAggsQ) | 09.10 | [задача](https://github.com/fmi/java-course/tree/master/01-intro-to-java/lab) | [![Video](web/images/mjt-on-youtube.png)](https://youtu.be/Bs3v6fr_qHk) | 12.10 | +| 2 | ООП с Java (част I) | [слайдове](https://fmi.github.io/java-course/02-oop-in-java-i/lecture/slides.html) | | 16.10 | | | 19.10 | ### Материали от предходни издания