JavaRush /Blog Java /Random-PL /Koncepcje programowania obiektowego w języku JAVA
shabnahm
Poziom 18

Koncepcje programowania obiektowego w języku JAVA

Opublikowano w grupie Random-PL
JAVA opiera się na koncepcjach programowania obiektowego, co pozwala przejść na wyższy poziom abstrakcji, aby w realistyczny sposób rozwiązać każdy problem. Podejście obiektowe konceptualizuje rozwiązanie problemu w kategoriach obiektów ze świata rzeczywistego, które łatwiej jest ponownie wykorzystać w aplikacji. Na przykład Chair(krzesło), Fan(wentylator), Dog(pies), Computer(komputer) i tak dalej. W JAVA klasa to układ, szablon lub prototyp, który definiuje ogólne zachowanie obiektu danego typu. Instancja jest odrębną implementacją klasy i wszystkie instancje klasy mają te same właściwości, które są opisane w definicji klasy. Na przykład można zdefiniować klasę o nazwie Dom z liczbą pokoi jako atrybutem i utworzyć instancje tej klasy, takie jak dom dwupokojowy, dom trzypokojowy itd. Koncepcje programowania obiektowego w języku JAVA — 1Zalety: Poniżej wymieniono niektóre zalety tworzenia oprogramowania zorientowanego obiektowo.
  • Obniżone koszty wsparcia oprogramowania, głównie dzięki temu, że jest ono realizowane modułowo.
  • Ulepszone ponowne wykorzystanie kodu dzięki funkcjom takim jak dziedziczenie, co skutkuje szybszym tworzeniem oprogramowania.
  • Zwiększona niezawodność i elastyczność kodu.
  • Łatwość zrozumienia dzięki symulacji świata rzeczywistego.
  • Lepsza abstrakcja na poziomie obiektu.
  • Zmniejszenie złożoności przejścia z jednej fazy rozwoju do drugiej.
Istnieją cztery główne cechy OOP:
  • Kapsułkowanie
  • Dziedzictwo
  • Wielopostaciowość
  • Abstrakcja

Kapsułkowanie

Hermetyzacja działa jak kontrakt dla obiektu, co powinien ukrywać, a co powinien otwierać, aby inne obiekty miały do ​​niego dostęp. W JAVA używamy modyfikatora dostępu private, aby ukryć metodę i ograniczyć dostęp do zmiennej ze świata zewnętrznego. JAVA ma także różne modyfikatory dostępu: public, default, protected, private, które służą do ograniczania widoczności na różnych poziomach. Ostatecznym celem jest jednak ujęcie tych rzeczy, których nie należy zmieniać. Podejście, które sprawdza się najlepiej, polega na tym, że klasa powinna mieć tylko jeden powód do zmiany, a hermetyzacja sprawia, że ​​projekt tego „jednego powodu” staje się rzeczywistością. Prawidłowe podejście do enkapsulacji polega na ukrywaniu rzeczy, które często się zmieniają, aby uniknąć uszkodzenia innych klas. Korzyści: Poniżej znajdują się niektóre zalety enkapsulacji:
  • Możemy chronić stan wewnętrzny obiektu ukrywając jego atrybuty.
  • Poprawia to modułowość kodu, ponieważ zapobiega interakcji obiektów w nieoczekiwany sposób.
  • Poprawia użyteczność kodu.
  • Wspiera to stosunek umowny konkretnego podmiotu.
  • Hermetyzacja sprawia, że ​​oprogramowanie jest łatwiejsze w utrzymaniu.
  • Zmiany w kodzie można wprowadzać niezależnie od siebie.

Wielopostaciowość

Polimorfizm w programowaniu to możliwość zapewnienia tego samego interfejsu dla różnych podstawowych formularzy (typów danych). Oznacza to, że klasy o różnej funkcjonalności korzystają z tego samego interfejsu i można je wywoływać dynamicznie, przekazując parametry przez referencję. Klasycznym przykładem jest klasa Shape(kształt) i wszystkie klasy, które po niej dziedziczą: square(kwadrat), circle(okrąg), dodecahedron(dwunastościan), irregular polygon(wielokąt nieregularny), splat(kropla) i tak dalej. W tym przykładzie każda klasa będzie miała własną metodę, Draw()a kod klienta może po prostu:
Shape shape = new Shape();
Shape.area()uzyskać poprawne zachowanie dowolnego kształtu Piękno polimorfizmu polega na tym, że kod pracujący z różnymi klasami nie musi wiedzieć, której klasy używa, ponieważ wszystkie działają na tej samej zasadzie. Proces stosowany przez języki programowania obiektowego do implementacji dynamicznego polimorfizmu nazywany jest wiązaniem dynamicznym. Uwaga: Polimorfizm to możliwość wyboru bardziej szczegółowych metod do wykonania w zależności od obiektu. Polimorfizm występuje, gdy nie są zaangażowane klasy abstrakcyjne. Zalety:
  • Tworzenie kodu wielokrotnego użytku. Oznacza to, że gdy klasa zostanie utworzona, zaimplementowana i przetestowana, można z niej swobodnie korzystać, nie martwiąc się o to, co dokładnie jest w niej napisane.
  • Pozwala to na bardziej ogólny i luźno powiązany kod.
  • Czas kompilacji jest skrócony, co przyspiesza rozwój.
  • Linkowanie dynamiczne.
  • Ten sam interfejs może służyć do tworzenia metod z różnymi implementacjami.
  • Całą implementację można zastąpić stosując te same sygnatury metod.
Zastępowanie metody jako część polimorfizmu. Przesłonięcie oddziałuje z dwiema metodami: metodą w klasie nadrzędnej i metodą w klasie pochodnej. Metody te mają tę samą nazwę i podpisy. Zastępowanie umożliwia wykonanie tej samej operacji na różne sposoby dla różnych typów obiektów. Na przykład:
while(it.hasNext()) {
Shape s = (Shape) it.next();
totalArea += s.area(dim); //будет применен полиморфизм и вызван нужный метод для каждого obiektа.
}
Koncepcje programowania obiektowego w języku JAVA — 2Przeciążanie metod lub polimorfizm ad hoc lub polimorfizm statyczny Przeciążanie oddziałuje na wiele metod tej samej klasy, które mają identyczne nazwy, ale mają różne sygnatury metod. Przeładowanie pozwala opisać tę samą operację na różne sposoby dla różnych danych. Czasami nazywa się to polimorfizmem statycznym, ale w rzeczywistości nie jest to polimorfizm. To nic innego jak po prostu posiadanie dwóch metod o tych samych nazwach, ale innej liście argumentów. Ponowne uruchomienie nie ma nic wspólnego z dziedziczeniem i polimorfizmem. A przeciążona metoda to wcale nie to samo, co metoda przesłonięta. Polimorfizm parametryczny poprzez generowanie w JAVA Podczas deklarowania klasy pole nazwy można powiązać z różnymi typami, a nazwę metody można powiązać z różnymi parametrami i typami zwracanych wartości. JAVA obsługuje polimorfizm parametryczny przy użyciu typów generycznych.
List<String> list = new ArrayList<String>();
Dlaczego nie możemy zastąpić metody statycznej w JAVA? Przesłonięcie zależy od istnienia instancji klasy. Ideą polimorfizmu jest to, że można utworzyć podklasę, a obiekty zaimplementowane przez te podklasy będą zachowywać się inaczej przy tych samych metodach klasy nadrzędnej (przesłonięte w podklasach). Metoda statyczna nie jest powiązana z żadną instancją klasy, dlatego nie można zastosować koncepcji samego przesłaniania. Twórcy JAVA kierowali się dwoma względami, które wpłynęły na to podejście. Po pierwsze, istnieją problemy z wykonaniem kodu: było wiele krytyki Smalltalka za powolność (częścią tego problemu było wyrzucanie śmieci i polimorfizm), a JAVA została zaprojektowana, aby tego uniknąć. Drugą kwestią była decyzja, że ​​docelową grupą odbiorców JAVA będą programiści C++. Działające w ten sposób metody statyczne były dobrze znane programistom C++, a także przyspieszały pracę, ponieważ nie było potrzeby przechodzenia w górę hierarchii klas, aby dowiedzieć się, którą metodę wywołać. Idziesz prosto do klasy i wywołujesz konkretną metodę.

Dziedzictwo

Dziedziczenie to akt włączania zachowania (tj. metod) i stanu (tj. zmiennych) klasy bazowej do klasy pochodnej, tak aby stały się one dostępne w tej klasie pochodnej. Główną zaletą dziedziczenia jest to, że zapewnia formalny mechanizm ponownego wykorzystania kodu i pozwala uniknąć powielania. Klasa dziedziczona rozszerza funkcjonalność aplikacji kopiując zachowanie klasy nadrzędnej i dodając nową funkcjonalność. To sprawia, że ​​kod jest wysoce sprzężony. Jeśli chcesz zmienić nadklasę, będziesz musiał znać wszystkie szczegóły podklas, aby nie złamać kodu. Dziedziczenie to forma ponownego wykorzystania oprogramowania, polegająca na utworzeniu nowej klasy (podklasy) z istniejącej klasy (nadklasy), która rozszerza jej funkcjonalność i wykorzystuje niektóre właściwości nadklasy. Jeśli więc masz klasę nadrzędną, a następnie pojawi się klasa podrzędna, dziecko dziedziczy wszystkie rzeczy, które posiada rodzic. Zalety:
  • Ulepszone ponowne wykorzystanie kodu.
  • Ustalona zostaje logiczna relacja „jest a” (jest kimś, czymś). Na przykład : Pies jest zwierzęciem . (Pies to zwierzę).
  • Modularyzacja kodu.
  • Powtórzenia są wykluczone.
Wada:
  • Ściśle powiązana: Podklasa zależy od implementacji klasy nadrzędnej, dzięki czemu kod jest ściśle powiązany.
Co jeszcze warto przeczytać:

Grupa programistów Java:

Abstrakcja

Abstrakcja oznacza projektowanie klas w oparciu o ich interfejsy i funkcjonalność, bez uwzględnienia szczegółów implementacji. Klasa abstrakcyjna reprezentuje interfejsy bez uwzględniania rzeczywistej implementacji. Odróżnia realizację obiektu od jego zachowania. Abstrakcja upraszcza kod, ukrywając nieistotne szczegóły. Zalety:
  • Stosując abstrakcję, możemy wyodrębnić to, co można pogrupować w jakiś typ.
  • Często modyfikowane właściwości i metody można pogrupować w osobny typ, dzięki czemu typ główny nie będzie podlegał zmianom. Wzmacnia to zasadę OOP: „Kod powinien być otwarty na rozszerzenie, ale zamknięty na zmiany ” .
  • Abstrakcja upraszcza reprezentację modeli dziedzin.
Różnica między abstrakcją a enkapsulacją Hermetyzacja jest strategią stosowaną jako część abstrakcji. Hermetyzacja odnosi się do struktury obiektu: obiekty hermetyzują swoje właściwości i ukrywają je przed dostępem z zewnątrz. Użytkownicy klasy wchodzą w interakcję z nią za pomocą jej metod, ale nie mają bezpośredniego dostępu do struktury klasy. W ten sposób klasa abstrahuje szczegóły implementacji związane z jej projektem. Abstrakcja jest terminem bardziej ogólnym. Można to osiągnąć także m.in. za pomocą podklas. Na przykład klasa List(lista) w bibliotece standardowej jest abstrakcją ciągu elementów, indeksowanych według ich miejsca na liście. Konkretnymi przykładami list ListArrayListlub LinkedList. Kod, który wchodzi w interakcję z listą, Listabstrahuje szczegóły listy, której używa. Często abstrakcja nie jest możliwa bez ukrycia stanu podstawowego za pomocą enkapsulacji. Jeśli klasa ujawnia swoją wewnętrzną strukturę, nie może zmienić swoich wewnętrznych operacji, a zatem nie może być abstrahowana. Co to jest klasa abstrakcyjna i metoda abstrakcyjna? Zdarza się, że podczas programowania chcesz, aby klasa bazowa udostępniała jedynie interfejs swoim klasom pochodnym. Oznacza to, że nie chcesz, aby ktokolwiek tworzył instancje klasy bazowej. Musisz używać interfejsu w taki sposób, aby rzutować na niego tylko obiekty (jest to ukryte rzutowanie, które pozwala na zachowanie polimorficzne). Osiąga się to poprzez uczynienie tej klasy abstrakcyjną za pomocą słowa kluczowego abstract. Narzuca to pewne ograniczenia, takie jak brak możliwości tworzenia instancji klasy abstrakcyjnej; w przypadku korzystania z klasy abstrakcyjnej konieczne jest zaimplementowanie metod abstrakcyjnych. Zapewnia to polimorfizm. Klasa abstrakcyjna może zawierać zarówno metody abstrakcyjne, jak i konkretne. Jeśli przynajmniej jedna metoda w klasie jest zadeklarowana jako abstrakcyjna, cała klasa również musi zostać zadeklarowana jako abstrakcyjna. Nie trzeba jednak przestrzegać zasady odwrotnej. Jeśli klasa jest zadeklarowana jako abstrakcyjna, nie może zawierać metod abstrakcyjnych. Metodę, która jedynie definiuje swoje sygnatury i nie zapewnia implementacji, nazywa się abstrakcyjną. Jego rzeczywistą implementację pozostawiono jego podklasom, które rozszerzają klasę abstrakcyjną. Obiekt nie może używać metody abstrakcyjnej, jedynie inna klasa może ją rozszerzyć. Kiedy należy używać klasy abstrakcyjnej? Klasy abstrakcyjne pozwalają zdefiniować pewne domyślne zachowanie, a ich podklasy zapewniają dowolne określone zachowanie. Na przykład: List(lista) jest interfejsem, z kolei AbstractListdefiniuje podstawowe zachowanie Listy, które można wykorzystać w niezmienionej postaci lub udoskonalić w podklasie, na przykład w ArrayList(tablica list). Co to jest interfejs? Koncepcja interfejsu jest klasą abstrakcyjną, ale interfejs (zdefiniowany przez słowo kluczowe interface) idzie o krok dalej. Uniemożliwia to w ogóle jakąkolwiek implementację metody lub funkcji. Można jedynie zadeklarować metodę lub funkcję, ale nie można zapewnić jej implementacji. Klasa implementująca interfejs musi zadbać o faktyczną implementację. Interfejsy są bardzo przydatne i są szeroko stosowane w OOP. Ponieważ dzielą sam interfejs i implementację, zapewniają wiele korzyści z ich stosowania:
  1. Dziedziczenie wielokrotne .
  2. Luźne powiązanie . Istnieje abstrakcja operacji, taka jak nakładanie warstw, a konkretną implementacją może być dowolna: JDBC, JPA, JTA itp.
  3. Program interfejsu nie jest zaimplementowany .
  4. Dynamiczny polimorfizm wiązania : interfejs programistyczny obiektu jest ujawniany bez ujawniania jego rzeczywistej implementacji.
  5. Poziomy abstrakcyjne , separacja funkcjonalności.
Różnica między interfejsem a klasą abstrakcyjną.
  • Interfejs to relacja umowna z klasami, które implementują ten interfejs, stwierdzająca, że ​​implementacja następuje w sposób wyznaczony przez interfejs. To jest pusta powłoka z zadeklarowanymi metodami.
  • Klasa abstrakcyjna definiuje pewne ogólne zachowanie i prosi swoje podklasy o zdefiniowanie nietypowego lub specyficznego zachowania dla swojej klasy.
  • Metody i elementy klasy abstrakcyjnej można oznaczyć dowolnym modyfikatorem dostępu, z kolei wszystkie metody interfejsu muszą być publiczne.
  • Podczas dziedziczenia klasy abstrakcyjnej klasa potomna musi definiować metody abstrakcyjne, podczas gdy interfejs może dziedziczyć inny interfejs bez konieczności definiowania jego metod.
  • Klasa potomna może rozszerzać tylko jedną klasę abstrakcyjną, ale interfejs może rozszerzać lub klasa może implementować wiele innych interfejsów.
  • Klasa potomna może definiować metody abstrakcyjne z tym samym lub mniej restrykcyjnym modyfikatorem dostępu, ale klasa implementująca interfejs musi definiować metody o tym samym poziomie widoczności.
  • Interfejs nie zawiera konstruktorów, podczas gdy klasa abstrakcyjna tak.
  • Zmienne zadeklarowane w interfejsie Java są domyślnie ostateczne. Klasa abstrakcyjna może zawierać zmienne, które nie są ostateczne.
  • Wszyscy członkowie interfejsu Java to public. Członkowie klasy abstrakcyjnej mogą sobie pozwolić na bycie itd public.protected

Kompozycja

Ponowne wykorzystanie kodu można osiągnąć zarówno za pomocą dziedziczenia, jak i kompozycji. Jednak użycie kompozycji zapewnia wyższy poziom enkapsulacji niż dziedziczenie, ponieważ zmiany w klasie zaplecza niekoniecznie wpłyną na kod należący do klasy frontonu. Kompozycja to technika projektowania wykorzystująca relacje „has-a” (ma, zawiera) w klasach. Do ponownego użycia kodu można wykorzystać zarówno dziedziczenie Java, jak i kompozycję obiektów. Istotą kompozycji jest wyrażenie relacji „ma” pomiędzy obiektami. Pomyśl o krześle. Krzesło posiada siedzisko. Krzesło posiada oparcie. Krzesło ma określoną liczbę nóg. Wyrażenie „ma” sugeruje relację, w której krzesło ma inny przedmiot lub przynajmniej go używa. To właśnie relacja „ma” jest podstawą kompozycji. Zalety:
  • Kontrola widoczności
  • Implementację można zastąpić w czasie wykonywania
  • Luźne połączenie, ponieważ klasa interfejsu nie zależy od implementacji.
Różnice między kompozycją a dziedziczeniem
NIE. Skład (ma / ma) Dziedziczenie (jest a/jest)
1 Obsługuje polimorfizm i ponowne wykorzystanie kodu. Obsługuje polimorfizm i ponowne wykorzystanie kodu.
2 Obiekt wykonawczy został już utworzony. Obiekt jest tworzony dynamicznie w czasie kompilacji.
3 Implementację można zastąpić w czasie wykonywania. Implementację można zmienić w czasie kompilacji.
4 Podklasa jest niezależna od swojej klasy nadrzędnej, co sprzyja luźnemu powiązaniu (szczególnie pod kontrolą interfejsu). Podklasa jest zależna od implementacji klasy nadrzędnej, dlatego powiązanie uważa się za silne.
5 Zastosowanie: W domu znajduje się łazienka. Błędem jest twierdzenie, że dom to łazienka. Dziedziczenie jest jednokierunkowe: dom jest budynkiem. Ale budynek to nie dom.
Uwaga: nie używaj dziedziczenia tylko po to, aby zapewnić ponowne użycie kodu. Jeśli nie ma relacji „jest a” (jest), do tych celów używana jest kompozycja. Różnica między kompozycją a agregacją polega na relacjach między obiektami. Agregacja to relacja, w której jedna klasa pasuje do kolekcji. Jest częścią całego związku, w którym część może istnieć bez całości. Takie relacje są znacznie słabsze. Nie ma zależności cyklicznej. Na przykład: zamówienie i produkt. Kompozycja to relacja, w której jedna klasa pasuje do kolekcji. Jest to część związku, w którym część nie może istnieć bez całości. Jeśli zniszczona zostanie całość, zniszczone zostaną także wszystkie jej elementy. To silniejsza relacja. Na przykład: wielokąt i jego wierzchołki, rząd i jego składnik.
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION