OOP Flashcards
Czym jest abstrakcja ?
Abstrakcja jest modelem rzeczywistego obiektu lub zjawiska, ograniczonego do pewnego kontekstu, przez co dokładnie przedstawia szczegóły związane z tym kontekstem, ale pomija pozostałe.
Obiekty programu nie reprezentują jednak swoich rzeczywistych pierwowzorów w pełni (i rzadko muszą). Zamiast tego, modelują one atrybuty i zachowanie prawdziwych obiektów w pewnym kontekście, ignorując resztę.
Hermetyzacja
Hermetyzacja to zdolność obiektu do ukrywania części swojego stanu i zachowania przed innymi obiektami, eksponując reszcie programu tylko ograniczony interfejs.
Hermetyzować coś oznacza uczynić to coś prywatnym , a tym samym dostępnym wyłącznie w obrębie metod swojej klasy. Istnieje nieco mniej restrykcyjny poziom dostępu zwany chronionym , który czyni składową klasy dostępną także podklasom.
Interfejs ogólnie
- typ abstrakcyjny posiadający jedynie operacje a nie dane.
- nie może być utworzony obiekt tego typu
- referencja może wskazywać na dowolny obiekt klasy implementującej interfejs
- interfejs udostępnia operacje, nie zawiera ich implementacji i danych
- klasy mogą implementować wiele interfejsów, bez problemów wielkrotnego dziedziczenia
- pozwala na hermetyzacje obiektów, utworzonych w oparciu o klasy zawierające implementacje
- kontrakt gwarantujący zestaw zachowań
Dziedziczenie
- możliwość tworzenia nowych klas na bazie istniejących
- możliwość ponownego wykorzystania kodu - jeśli potrzebujesz stowrzyć klasę która rozszerza obecną
- podklasa przejmie metody i pola klasy bazowej (metody które są inne niż private)
- problem z hermetyzacja - przejmuję metody z interfejsu rodzica
Polimorfizm
- zdolność programu do wykrywania faktycznej klasy obiektu i wywoływania jego implementacji nawet gdy typ jest nieznany w danym kontekście.
- zdolności obiektów różnych klas do bycia traktowanymi jako instancje tej samej klasy, najczęściej klasy bazowej lub interfejsu.
Czym jest zależność pomiędzy obiektami ?
- najbardziej podstawowy i najsłabszy związek między klasami
- jeśli pewne zmiany w definicji jednej z nich mogą skutkować modifikacjami drugiej
- gdy ktoś zmieni metodę getKnowledge() klasy Course to kod się popsuje
Asocjacja
- relacja w której jeden obiekt korzysta z innego lub wchodzi w interakcje z innym obiektem
- rodzaj zależności, w której obiekt zawsze ma dostęp do obiektu z którym wchodzi w interakcję
- stosowana do przedstawienia takich elementów jak na przykład pole klasy
- jeśli zmieni się kod remember() w klasie Student to zepsuje klase profesor
- Student jest cześcią klasy Professor
Agregacja
- szczególny rodzaj asocjacji
- reprezentuje relacje one - to many oraz many-to-many
- zazwyczaj obiekt “posiada” zestaw innych obiektów
- jeden obiekt służy za kontener
- komponent może istnieć bez kontenera
Kompozycja
- szczególny rodzaj agregacji
- obiekt składa się z jednej lub więcej instancji innego
- ## obiekt może istnieć tylko jak cześć kontenera
Jakie są rodzaje polimorfizmu ?
- Compile-Time polymorphism
- mehod overloading
- static polymoprhism - Runtime Polymoprhism
- method overriding
-
Polymorphims szczegóły działania
- Java cechuje się silnym typowaniem , kod programu musi zawsze określać typ obiektu podczas deklaracji zmiennych
- możemy również **zadeklarować zmienną której typem jest nadklasa i przypisać jej instancję jednej z podklas **
Dancer breakdancer = new Breakdancer("Mati", 19); // Konwersja rozszerzająca do typu podstawowego Dancer electricBoogieDancer = new ElectricBoogieDancer("Zuzia", 20); // Konwersja rozszerzająca do typu podstawowego List<dancer> disco = Arrays.asList(dancer, breakdancer, electricBoogieDancer); for (Dancer d : disco) { d.dance(); // Wywołanie metody polimorficznej }
- odbywa się tutaj niejawna konwersja rozszerzająca przez kompilator - odwołanie do obiektu jest traktowanie jak odwołanie do klasy bazwoej
- Dancer ma wiele form
- każda z form może mieć własne unikalne zachowanie
Zalety polimorfizmu
- ogólne metody i klasy, które mogą pracować z różnymi typami obiektów, a nie tylko z jednym konkretnym.
- jednen interfejsu do operowania na różnych typach obiektów
- dodawanie nowych klas, które implementują dany interfejs lub dziedziczą po danej klasie bazowej, bez konieczności modyfikowania istniejącego kodu korzystającego z tego interfejsu lub klasy bazowej.
5. Ułatwienie testowania
6. wsparcie SOLID
Wady dziedziczenia
1.** Zbyt złożona hierarchia klas**: Nadmierne korzystanie z dziedziczenia może prowadzić do skomplikowanych hierarchii klas, co może utrudniać zrozumienie i utrzymanie kodu.
- Brak hermetyzacji: Dziedziczenie narusza hermetyzację, ponieważ podklasa może uzyskać dostęp do chronionych członków klasy nadrzędnej. Może to prowadzić do nieprzewidywalnych efektów ubocznych.
3.** Ryzyko nieodpowiedniego dziedziczenia**: Istnieje pokusa, aby wykorzystać dziedziczenie do osiągnięcia ponownego użycia kodu, nawet gdy relacja “jest rodzajem” (is-a) nie jest logiczna lub odpowiednia.
Interfejs vs Klasa Abstrackcyjna
Kiedy użyc klasy abstrakcjnej a kiedy interfejsu
Cechy Interfejsu
Cechy klasy abstrakcyjnej
Interfejs funkcyjny
- posiada jedną metodę abstrakcyjną
- Adnotacja @FunctionalInterface
- Zastosowanie w wyrażeniach lambda:
Interfejs w javie cechy
- **jest typem referencyjnym **( jeśli referencja zmiennej jest interfejs to klasa musi implementować interfejs)
-
kontrakt gwarantujący zestaw zachowań
* mechanizm do osiągania abstrakcji - nie zawiera **zmiennych instancyjnych **ponieważ reprezentuje jakaś abstrakcję
- nie można go utwrzoyć jak klasy
interfejs może dziedziczyć po wielu interfejsach
Co może zawierać interfejs ?
- deklaracje metod (automatycznie public abstract)
stałe (automatycznie public static finał) - metody domyślne (default modifier)
- metody publiczne statyczne (static)
- metody prywatne
- metody statyczne prywate
Co się stanie jeśli nie dostarczymy konstruktora ?
- kompilator automatycznie dostarczy dla niej domyślny konstruktor bezargumentowy
- ten domyślny konstruktor wywoła domyślny konstruktor klasy nadrzędnej (nadklasy) poprzez wywołanie super().
Czy klasa abstrakcyjna musi mieć abstrakcyjne metody ?
- nie
- ale jeśli istnieje jedna metoda abstrakcyjna to klasa musi być abstrakcyjna
Do czego służy this keyword ?
- Odróżnianie pól: “this” używa się do odróżnienia pól klasy od lokalnych zmiennych
- Wywoływanie konstruktorów: W konstruktorze “this” używa się do wywołania innego konstruktora w tej samej klasie
- Przekazywanie bieżącego obiektu do innej metody: Można użyć “this” do przekazania obecnego obiektu do innej metody lub konstruktora
- i odwoływania się do zmiennych instancyjnych w obecnej instancji klasy.
Czym jest obiekt
- instancja klasy
- zawiera stan (zmienne instancyjne)
- zawiera metody (zachowanie)
- tworzone przy pomoca slowa new
Czym jest klasa
- jest to schemat, które definuje jakie, zmienne i metody bedą dostępne dla obiektów tego typu
- określa strukturę obiektu ale sama nie jest obiektem
Co to jest konstruktor
- specjalna metoda w klasie, która jest wywoływana podczas tworzenia nowego obiketu
- używany do inicjalizacji nowego obiektu
- musi być identyczny jak nazwa klasy i nie ma typu zwracanego
Co to są zmienne statyczne ?
- zmienne związane z klasą a nie z konkretnym obiektem
- ## istnieje tylko jedna kopia zmiennej statycznej dla danej klasy
Co to są metody statyczne ?
- metody, które są związane z klasą, anie z konkretnym obiektem
- mogą działać tylko na zmiennych statycznych i nie mają dostępu do zmiennych instancyjnych ani metod instancji
Co może zrobić klasa dziedzicząca ?
- Dziedziczenie pól i metod: Dziedziczenie zmiennych instancyjnych i metod oznaczonych jako protected, dostępu pakietowego oraz public.
- Nadpisywanie metod: Możliwość dostarczenia własnej implementacji metody klasy nadrzędnej. Zalecane użycie adnotacji @Override.
- Używanie konstruktora klasy nadrzędnej: Wywoływanie konstruktorów klasy nadrzędnej przez super.
- Rozszerzanie funkcjonalności: Dodawanie nowych pól i metod, które nie istniały w klasie nadrzędnej.
5.** Dostęp do zmodyfikowanych pól i metod**: Używanie public lub protected akcesorów dla pól oznaczonych jako private w klasie nadrzędnej.
- Implementowanie interfejsów: Możliwość implementowania wielu interfejsów oprócz dziedziczenia po jednej klasie nadrzędnej.
- Rozszerzanie i ograniczanie dostępu: Zmiana poziomu dostępu składników klasy nadrzędnej, bez możliwości ograniczenia go.
- Dziedziczenie atrybutów statycznych: Dziedziczenie metod i zmiennych statycznych, z uwzględnieniem, że nie można ich nadpisać w tradycyjnym sensie, ale można “ukryć”.
Słowo super ?
- Wywołanie konstruktora klasy nadrzędnej
- Odwołanie się do metody klasy nadrzędnej:
- Odwołanie się do zmiennej klasy nadrzędnej
Użzycie słowa final
Jak rozwiazać dodawanie nowych metod do interfejsu
- Metody domyślne (default methods):
* Pozwalają na dodawanie nowych metod z domyślną implementacją do interfejsów, bez wpływu na istniejące klasy implementujące.
* Klasy implementujące mogą nadpisać tę domyślną implementację, jeśli to konieczne. - Metody statyczne
* Pozwalają na dodawanie metod statycznych do interfejsów.
* Te metody są częścią interfejsu i nie mogą być nadpisywane przez klasy implementujące.
Jaka jest zasada modyfikatrów dostępu przy method overriding
- modyfikator musi być taki sam bądź mniej restrykcyjne
- nie może być bardziej restrykcyjny
Jak wygląda przy overrride gdy metoda rzuca wyjątek
- oveeridowana metoda może rzucić ten sam wyjątek albo z lini dziedziczenia
Czym jest kohezja
- w jakim stopniu klasy pracują wspólnie aby osiągnąc określony cen
- wysoka kohezj oznacza, że są mocno związane aby osiągać cel
Covariant
- zdolność subclassy do bycia użytą w miejscu superclass
Protected members
- dostęp tylko w tym samym pakiecie
- albo w hierarchi dziedziczenia
Jak działa HashMapa ?
- w przypadku put() oraz get() mapa wywołuje metode hashcode() na obiekcie klucz a następnie używa własnej funkcji hashującej, by określic bucket Map.Entry
- w przypadku gdy dla dwóch kluczy hashCode() zwraca tą samą wartość - kolizja
- dla takich samych hashcode() mapa wywołuje metode equals()
- jeśli equals() zwróci false to oznacza, że dwa różne klucze - tworzy BinaryTree od Javy
- jest equals() zwróci true to zastępuje wartość
- przy kolizji O (log n)
- array of binary trees