{"id":1920,"date":"2023-01-19T08:59:15","date_gmt":"2023-01-19T08:59:15","guid":{"rendered":"https:\/\/www.juniorjavadeveloper.pl\/?p=1920"},"modified":"2023-01-19T08:59:17","modified_gmt":"2023-01-19T08:59:17","slug":"trzy-trojce-programistyczne-jak-ulatwic-poczatki-programowania","status":"publish","type":"post","link":"https:\/\/www.juniorjavadeveloper.pl\/en\/2023\/01\/19\/trzy-trojce-programistyczne-jak-ulatwic-poczatki-programowania\/","title":{"rendered":"Trzy tr\u00f3jce programistyczne &#8211; jak u\u0142atwi\u0107 pocz\u0105tki programowania"},"content":{"rendered":"<p class=\"wp-block-paragraph\">W tym artykule przybli\u017c\u0119 trzy elementy, kt\u00f3re z mojego do\u015bwiadczenia s\u0105 bardzo istotne dla os\u00f3b ucz\u0105cych si\u0119 j\u0119zyka Java, aby dobrze zrozumie\u0107 programowanie obiektowe. Osoby \u015bredniozaawansowane oraz zaawansowane te\u017c mog\u0105 z tego skorzysta\u0107, traktuj\u0105c t\u0119 wiedz\u0119 jako powt\u00f3rk\u0119. W sk\u0142ad ka\u017cdego z trzech g\u0142\u00f3wnych punkt\u00f3w wchodz\u0105 pomniejsze trzy elementy, st\u0105d trzy tr\u00f3jce programistyczne. Poni\u017csze tr\u00f3jce pozwol\u0105 stworzy\u0107 zestaw narz\u0119dzi, kt\u00f3rymi b\u0119dziemy pos\u0142ugiwa\u0107 si\u0119 przy programowaniu obiektowym.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W tym artykule um\u00f3wi\u0119 poni\u017csze tr\u00f3jce programistyczne:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"#trzy-elementy-skladowe-klasy\" data-type=\"internal\" data-id=\"#trzy-elementy-skladowe-klasy\">Trzy elementy sk\u0142adowe klasy<\/a>:\n<ul class=\"wp-block-list\">\n<li>atrybut, konstruktor, metoda.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><a href=\"#trzy-paradygmaty-programowania-obiektowego\" data-type=\"internal\" data-id=\"#trzy-paradygmaty-programowania-obiektowego\">Trzy paradygmaty programowania obiektowego<\/a>:\n<ul class=\"wp-block-list\">\n<li>hermetyzacja, dziedziczenie, polimorfizm.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><a href=\"#trzy-elementy-wspierajace-programowanie-obiektowe\" data-type=\"internal\" data-id=\"#trzy-elementy-wspierajace-programowanie-obiektowe\">Trzy elementy wspieraj\u0105ce programowanie obiektowe<\/a>:\n<ul class=\"wp-block-list\">\n<li>zale\u017cno\u015b\u0107, wstrzykiwanie zale\u017cno\u015bci, delegacja.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Powy\u017csze punkty m\u00f3g\u0142bym opisa\u0107 w formie oddzielnego artyku\u0142u &#8211; ka\u017cdy z temat\u00f3w jest bardzo obszerny &#8211; niemniej moim celem by\u0142o zgrupowanie wszystkich element\u00f3w w jednym miejscu tak, aby mo\u017cna by\u0142o spojrze\u0107 &#8211; z &#8220;lotu ptaka&#8221;, szerszej perspektywy &#8211; na zestaw narz\u0119dzi dost\u0119pnych dla programowania obiektowego.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ka\u017cdy z powy\u017cszych punkt\u00f3w jest opisany za pomoc\u0105 poni\u017cszych sekcji:<br>&#8211; wyja\u015bnienie danego zagadnienia,<br>&#8211; kod \u017ar\u00f3d\u0142owy zagadnienia,<br>&#8211; odpowied\u017a na pytanie &#8220;Co, to oznacza, \u017ce&#8230;&#8221;,<br>&#8211; kod \u017ar\u00f3d\u0142owy z &#8220;aplikacj\u0105&#8221; u\u017cywaj\u0105c\u0105 dane zagadnienie,<br>&#8211; wynik dzia\u0142ania &#8220;aplikacji&#8221;.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Do czego mo\u017cna by wykorzysta\u0107 taki zestaw narz\u0119dzi? Na przyk\u0142ad w codziennej pracy programistycznej, tworz\u0105c nowy kod, rozwijaj\u0105c istniej\u0105cy lub testuj\u0105c go. Kod stworzony w oparciu o regu\u0142y programowania obiektowego jest elastyczny na zmiany, rozszerzalny i nadaje si\u0119 do testowania &#8211; nie zawsze tak jest. Mo\u017cna przepisa\u0107 od nowa istniej\u0105cy kod, ale wymaga, to ogromnego nak\u0142adu pracy i sporego bud\u017cetu na taki projekt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zaczn\u0119 od wst\u0119pu zwi\u0105zanego z programowaniem obiektowym. Do czego u\u017cywamy programowania obiektowego? W du\u017cym uproszczeniu i bez wnikania w szczeg\u00f3\u0142y techniczne, u\u017cywamy go do odwzorowania rzeczy, poj\u0119\u0107, obiekt\u00f3w otaczaj\u0105cego nas \u015bwiata na j\u0119zyk &#8220;zrozumia\u0142y dla komputera&#8221;. Na szcz\u0119\u015bcie <a rel=\"noreferrer noopener\" href=\"https:\/\/en.wikipedia.org\/wiki\/Java_(programming_language)\" data-type=\"URL\" data-id=\"https:\/\/en.wikipedia.org\/wiki\/Java_(programming_language)\" target=\"_blank\">Java<\/a> jest <a rel=\"noreferrer noopener\" href=\"https:\/\/en.wikipedia.org\/wiki\/High-level_programming_language\" data-type=\"URL\" data-id=\"https:\/\/en.wikipedia.org\/wiki\/High-level_programming_language\" target=\"_blank\">j\u0119zykiem programowania wysokiego poziomu<\/a> w odr\u00f3\u017cnieniu od np.: <a rel=\"noreferrer noopener\" href=\"https:\/\/en.wikipedia.org\/wiki\/Assembly_language\" data-type=\"URL\" data-id=\"https:\/\/en.wikipedia.org\/wiki\/Assembly_language\" target=\"_blank\">Assemblera<\/a>, kt\u00f3ry jest <a rel=\"noreferrer noopener\" href=\"https:\/\/en.wikipedia.org\/wiki\/Low-level_programming_language\" data-type=\"URL\" data-id=\"https:\/\/en.wikipedia.org\/wiki\/Low-level_programming_language\" target=\"_blank\">j\u0119zykiem programowania niskiego poziomu<\/a> &#8211; tym samym nie musimy programowa\u0107 instrukcji procesora, skupiamy si\u0119 na &#8220;otaczaj\u0105cym nas \u015bwiecie&#8221;. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ady element\u00f3w otaczaj\u0105cego nas \u015bwiata , kt\u00f3re mo\u017cemy odwzorowa\u0107 w j\u0119zyku Java; rzeczy, np.: notatnik, faktura; poj\u0119cia, np.: przesy\u0142ka, przelew; obiekty: samoch\u00f3d, dom. W Asemblerze &#8220;jedno polecenie odpowiada zasadniczo jednemu rozkazowi procesora&#8221;, nie ma tu mowy o odwzorowaniu otaczaj\u0105cego nas \u015bwiata. Pod koniec artyku\u0142u umieszcz\u0119 <a href=\"#assembler-vs-java\" data-type=\"internal\" data-id=\"#assembler-vs-java\">por\u00f3wnanie kodu \u017ar\u00f3d\u0142owego j\u0119zyka Java i Assemblera<\/a>, to por\u00f3wnanie nie stanowi istoty, tego artyku\u0142u &#8211; po prostu, z do\u015bwiadczenia wiem, \u017ce lepiej pokaza\u0107 na przyk\u0142adzie, ni\u017c t\u0142umaczy\u0107 teori\u0119.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Skoro ju\u017c wiemy, \u017ce j\u0119zyk Java pozwala odwzorowa\u0107 otaczaj\u0105ce nas rzeczy, poj\u0119cia i obiekty, to czas na om\u00f3wienie element\u00f3w j\u0119zyka, kt\u00f3re pozwalaj\u0105 na wykonanie takiego odwzorowania. Podstawow\u0105 jednostk\u0105, poj\u0119ciem w programowaniu obiektowym jest klasa, kt\u00f3ra jest szablonem do tworzenia konkretnych reprezentacji, czyli obiekt\u00f3w, np.: klasa mo\u017ce by\u0107 szablonem dla r\u00f3\u017cnych notatnik\u00f3w, a obiektem mo\u017ce by\u0107, np.: notatnik w lini\u0119, kratk\u0119, posiadaj\u0105cy 60 kartek.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Parafrazuj\u0105c wy\u017cej opisane tr\u00f3jce programistyczne, dodaj\u0105c informacj\u0119, \u017ce opieraj\u0105 si\u0119 one na klasach j\u0119zyka Java, mog\u0119 napisa\u0107, \u017ce klasa w j\u0119zyku Java:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"#trzy-elementy-skladowe-klasy\" data-type=\"internal\" data-id=\"#trzy-elementy-skladowe-klasy\">sk\u0142ada si\u0119 z trzech element\u00f3w<\/a>:\n<ul class=\"wp-block-list\">\n<li>atrybut, konstruktor, metoda.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><a href=\"#trzy-paradygmaty-programowania-obiektowego\">bazuje na trzech podstawowych konwencjach, paradygmatach<\/a>:\n<ul class=\"wp-block-list\">\n<li>hermetyzacja, dziedziczenie, polimorfizm.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><a href=\"#trzy-elementy-wspierajace-programowanie-obiektowe\">wsp\u00f3\u0142dzia\u0142a z innymi klasami poprzez tworzenie relacji<\/a>:\n<ul class=\"wp-block-list\">\n<li>zale\u017cno\u015b\u0107, wstrzykiwanie zale\u017cno\u015bci, delegacja.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Elementy klasy<\/em> pozwalaj\u0105 stworzy\u0107 szablon wed\u0142ug naszego pomys\u0142u; <em>konwencje, paradygmaty<\/em> nak\u0142adaj\u0105 wsp\u00f3lne regu\u0142y na klasy oraz poszczeg\u00f3lne elementy sk\u0142adowe; <em>tworzenie relacji<\/em> pozwala na interakcje pomi\u0119dzy klasami. Klasa tworzy nowy typ w j\u0119zyku Java, taki sam jak istniej\u0105ce w j\u0119zyku Java np.: String, LocalDateTime.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Brzmi skomplikowanie, ale nie musi tak by\u0107, dlatego napisa\u0142em ten artyku\u0142, \u017ceby u\u0142atwi\u0107 osobom pocz\u0105tkuj\u0105cym zrozumienie powy\u017cszych element\u00f3w.<\/p>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\"><strong>Wa\u017cne! Wszystkie elementy kodu powinny by\u0107 samo opisuj\u0105ce si\u0119.<\/strong><\/p>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\">Poni\u017cszy kod \u017ar\u00f3d\u0142owy prezentuje tworzenie komentarzy w j\u0119zyku Java.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ tak tworzy si\u0119 komentarz dla jednej linii w j\u0119zyku Java<\/pre>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\">Poni\u017cszy kod \u017ar\u00f3d\u0142owy prezentuje w najprostszej postaci klas\u0119 j\u0119zyka Java  &#8211; Notebook.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ klasa w j\u0119zyku Java\npublic class Notebook {\n    \/\/ cia\u0142o klasy\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Klasa jest zwyk\u0142ym plikiem tekstowym, kt\u00f3ry mo\u017cemy znale\u017a\u0107 za pomoc\u0105 eksploratora plik\u00f3w i wy\u015bwietli\u0107 jego zawarto\u015b\u0107 za pomoc\u0105 dowolnego edytora tekstu. Programi\u015bci i programistki do tego celu u\u017cywaj\u0105 zintegrowanego \u015brodowiska programistycznego (<a rel=\"noreferrer noopener\" href=\"https:\/\/en.wikipedia.org\/wiki\/Integrated_development_environment\" data-type=\"URL\" data-id=\"https:\/\/en.wikipedia.org\/wiki\/Integrated_development_environment\" target=\"_blank\">IDE<\/a>), np.: <a rel=\"noreferrer noopener\" href=\"https:\/\/www.jetbrains.com\/idea\/download\/\" data-type=\"URL\" data-id=\"https:\/\/www.jetbrains.com\/idea\/download\/\" target=\"_blank\">IntelliJ IDEA Community<\/a>. Wi\u0119cej na temat klas i obiekt\u00f3w w j\u0119zyku Java mo\u017cna przeczyta\u0107 w oficjalnej dokumentacji na stronie <a rel=\"noreferrer noopener\" href=\"https:\/\/docs.oracle.com\/javase\/tutorial\/java\/javaOO\/index.html\" data-type=\"URL\" data-id=\"https:\/\/docs.oracle.com\/javase\/tutorial\/java\/javaOO\/index.html\" target=\"_blank\">The Java\u2122 Tutorials &#8211; Lesson: Classes and Objects<\/a> lub <a rel=\"noreferrer noopener\" href=\"https:\/\/docs.oracle.com\/javase\/tutorial\/java\/javaOO\/classdecl.html\" data-type=\"URL\" data-id=\"https:\/\/docs.oracle.com\/javase\/tutorial\/java\/javaOO\/classdecl.html\" target=\"_blank\">The Java\u2122 Tutorials &#8211; Declaring Classes<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>W wielu miejscach dla maksymalnego uproszczenia przyk\u0142ad\u00f3w pomijam pewne elementy w klasach, np.: metody getters\/setters i odwo\u0142uj\u0119 si\u0119 bezpo\u015brednio do atrybut\u00f3w i\/lub metod klasy, nie zmniejsza, to jako\u015bci przekazywanych informacji, ale moim zdaniem u\u0142atwia zrozumienie konkretnego zagadnienia. Nie tworz\u0119 te\u017c sztucznie klas typu <a href=\"https:\/\/en.wikipedia.org\/wiki\/Plain_old_Java_object\" data-type=\"URL\" data-id=\"https:\/\/en.wikipedia.org\/wiki\/Plain_old_Java_object\" target=\"_blank\" rel=\"noreferrer noopener\">POJO<\/a>, \u017ceby nie zaciemnia\u0107 obrazu i skupi\u0107 si\u0119 na konkretach.<\/strong><\/p>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\">Poni\u017cszy kod \u017ar\u00f3d\u0142owy prezentuje r\u00f3\u017cnic\u0119 pomi\u0119dzy klas\u0105 &#8216;Notebook&#8217;, a jej obiektem &#8216;simpleNotebook&#8217;.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ utworzenie obiektu 'simpleNotebook' klasy 'Notebook'\nNotebook simpleNotebook = new Notebook();<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-dots\"\/>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"trzy-elementy-skladowe-klasy\">Trzy elementy sk\u0142adowe klasy<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Atrybut \/ Pole \/ Zmienna<\/strong> &#8211; <em>pozwalaj\u0105 na przechowywanie stanu, cech, danych dla obiektu.<\/em> Dla u\u0142atwienia b\u0119d\u0119 pos\u0142ugiwa\u0142 si\u0119 tylko jednym okre\u015bleniem atrybut. Pierwszy element klasy jak na z\u0142o\u015b\u0107 mo\u017cna okre\u015bla\u0107, nazywa\u0107 za pomoc\u0105 trzech poj\u0119\u0107, kt\u00f3re wskazuj\u0105 na to samo. Warto o tym pami\u0119ta\u0107, pomo\u017ce, to w wyszukiwaniu informacji w internecie. Klasa mo\u017ce posiada\u0107 zero lub wi\u0119cej atrybut\u00f3w r\u00f3\u017cnego typu. Wi\u0119cej na ten temat mo\u017cna przeczyta\u0107 w oficjalnej dokumentacji j\u0119zyka Java na stronie <a rel=\"noreferrer noopener\" href=\"https:\/\/docs.oracle.com\/javase\/tutorial\/java\/javaOO\/variables.html\" data-type=\"URL\" data-id=\"https:\/\/docs.oracle.com\/javase\/tutorial\/java\/javaOO\/variables.html\" target=\"_blank\">The Java\u2122 Tutorials &#8211; Declaring Member Variables<\/a>.<\/li>\n<\/ol>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\">Poni\u017cszy kod \u017ar\u00f3d\u0142owy prezentuje klas\u0119 j\u0119zyka Java posiadaj\u0105c\u0105 jedn\u0105 z trzech sk\u0142adowych &#8211; atrybut.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class Notebook {\n    \/\/ atrybuty klasy\n    int pages;\n    int currentPage;\n    Map&lt;Integer, String> contents = new HashMap&lt;>();\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Co, to oznacza, \u017ce atrybuty przechowuj\u0105 stanu, cech dla obiektu?<\/strong> Na przyk\u0142adzie notatnika (klasa Notebook), kupuj\u0105c notatnik w sklepie posiada on cechy, takie jak rozmiar, <em>ilo\u015b\u0107 stron (int pages)<\/em>. U\u017cywaj\u0105c notatnik mo\u017cemy wype\u0142ni\u0107 <em>zawarto\u015bci\u0105 ka\u017cd\u0105 ze stron (Map&lt;Integer, String&gt; contents)<\/em> i zaznaczy\u0107 <em>&#8220;bie\u017c\u0105c\u0105\/ostatni\u0105&#8221; stron\u0119 (int currentPage)<\/em>. <strong>Obrazuje, to poni\u017cszy kod \u017ar\u00f3d\u0142owy.<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class ApplicationMain {\n    public static void main(String[] args) {\n        Notebook historyNotebook = new Notebook();\n        historyNotebook.pages = 60;\n        historyNotebook.contents.put(33, \"Historia powszechna.\");\n        historyNotebook.currentPage = 33;\n        System.out.println(\"Notatnik do historii: \"\n                + historyNotebook);\n    }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Poni\u017cej wynik programu prezentuj\u0105cego wykorzystanie atrybut\u00f3w.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Notatnik do historii: Notebook{pages=60, currentPage=33, contents={33=Historia powszechna.}}\n\nProcess finished with exit code 0<\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li><strong>Konstruktor<\/strong> &#8211; <em>umo\u017cliwia tworzenie obiekt\u00f3w danej klasy wed\u0142ug wyznaczonego wzoru, schematu.<\/em> Klasa mo\u017ce posiada\u0107 zero lub wi\u0119cej konstruktor\u00f3w, ka\u017cdy z nich dla innego wzoru, schematu. Wi\u0119cej na ten temat mo\u017cna przeczyta\u0107 w oficjalnej dokumentacji j\u0119zyka Java na stronie <a rel=\"noreferrer noopener\" href=\"https:\/\/docs.oracle.com\/javase\/tutorial\/java\/javaOO\/constructors.html\" data-type=\"URL\" data-id=\"https:\/\/docs.oracle.com\/javase\/tutorial\/java\/javaOO\/constructors.html\" target=\"_blank\">The Java\u2122 Tutorials &#8211; Providing Constructors for Your Classes<\/a>.<\/li>\n<\/ol>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\">Poni\u017cszy kod \u017ar\u00f3d\u0142owy prezentuje klas\u0119 j\u0119zyka Java posiadaj\u0105c\u0105 jedn\u0105 z trzech sk\u0142adowych &#8211; konstruktor.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class Notebook {\n    \/\/ pomijam atrybuty klasy z punktu 1.\n\n    \/\/ konstruktor klasy\n    public Notebook() {\n    }\n\n    \/\/ konstruktor klasy\n    public Notebook(int pages) {\n        \/\/ cia\u0142o konstruktora, instrukcje do wykonania\n        this.pages = pages;\n    }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Co, to oznacza, \u017ce umo\u017cliwia tworzenie obiekt\u00f3w danej klasy wed\u0142ug wyznaczonego wzoru, schematu?<\/strong> Podobnie jak dla atrybut\u00f3w, na przyk\u0142adzie notatnika (klasa Notebook), kupuj\u0105c notatnik w sklepie posiada on cechy, takie jak rozmiar, <em>ilo\u015b\u0107 stron (int pages)<\/em>. Z t\u0105 r\u00f3\u017cnic\u0105, \u017ce konstruktory &#8220;wymuszaj\u0105&#8221; podanie konkretnych danych w momencie tworzenia obiektu. Pozwala, to unikn\u0105\u0107 sytuacji, w kt\u00f3rej wyprodukowany notatnik nie ma okre\u015blonej liczby stron i musimy samemu policzy\u0107 sobie ile faktycznie jest stron. <strong>Obrazuje, to poni\u017cszy kod \u017ar\u00f3d\u0142owy.<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class ApplicationMain {\n    public static void main(String[] args) {\n        Notebook mathNotebook = new Notebook(90);\n        System.out.println(\"Ilo\u015b\u0107 stron: \" + mathNotebook.pages);\n    }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Poni\u017cej wynik programu prezentuj\u0105cego dzia\u0142anie konstruktora.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Ilo\u015b\u0107 stron: 90\n\nProcess finished with exit code 0<\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li><strong>Metoda<\/strong> &#8211; <em>umo\u017cliwia wykonywanie czynno\u015bci, interakcj\u0119 z klas\u0105, obiektem.<\/em> Klasa mo\u017ce posiada\u0107 zero lub wi\u0119cej metod. Wi\u0119cej na ten temat mo\u017cna przeczyta\u0107 w oficjalnej dokumentacji j\u0119zyka Java na stronie <a rel=\"noreferrer noopener\" href=\"https:\/\/docs.oracle.com\/javase\/tutorial\/java\/javaOO\/methods.html\" data-type=\"URL\" data-id=\"https:\/\/docs.oracle.com\/javase\/tutorial\/java\/javaOO\/methods.html\" target=\"_blank\">The Java\u2122 Tutorials &#8211; Defining Methods<\/a>.<\/li>\n<\/ol>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\">Poni\u017cszy kod \u017ar\u00f3d\u0142owy prezentuje klas\u0119 j\u0119zyka Java posiadaj\u0105c\u0105 jedn\u0105 z trzech sk\u0142adowych &#8211; metoda.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class Notebook {\n    \/\/ pomijam atrybuty klasy z punktu 1.\n    \/\/ pomijam konstruktory klasy z punktu 2.\n\n    \/\/ metoda klasy\n    void writeNoteContent(String noteContent) {\n        \/\/ cia\u0142o metody, instrukcje do wykonania\n        contents.merge(currentPage, noteContent,\n                (oldContent, newContent) \n                        -> oldContent + \" \" + newContent);\n    }\n\n    \/\/ metoda klasy\n    void goToPage(int page) {\n        \/\/ cia\u0142o metody, instrukcje do wykonania\n        currentPage = page;\n    }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Co, to oznacza, \u017ce metody umo\u017cliwiaj\u0105 wykonywanie czynno\u015bci, interakcj\u0119 z klas\u0105, obiektem?<\/strong> Na przyk\u0142adzie notatnika (klasa Notebook), skoro wiemy, \u017ce ka\u017cdy notatnik ma stan, cechy opisuj\u0105ce liczb\u0119 stron (int pages), to dzi\u0119ki metodzie mo\u017cemy <em>&#8220;otworzy\u0107\/p\u00f3j\u015b\u0107&#8221; do wybranej przez nas strony &#8211; void goToPage(int page)<\/em> &#8211; nast\u0119pnie <em>wpisa\u0107 tre\u015b\u0107 &#8211; void writeNoteContent(String noteContent)<\/em> &#8211; kt\u00f3ra ma by\u0107 na wybranej stronie. <strong>Obrazuje, to poni\u017cszy kod \u017ar\u00f3d\u0142owy.<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class ApplicationMain {\n    public static void main(String[] args) {\n        Notebook smallNotebook = new Notebook(60);\n        smallNotebook.goToPage(22);\n        smallNotebook.writeNoteContent(\"Pierwsza notatka.\");\n        System.out.println(\"Tre\u015b\u0107 notatki na bie\u017c\u0105cej stronie: \"\n                + smallNotebook);\n    }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Poni\u017cej wynik programu prezentuj\u0105cego dzia\u0142anie metody.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Notebook - append note content to the current page: Pierwsza notatka.\nTre\u015b\u0107 notatki na bie\u017c\u0105cej stronie: Notebook{pages=60, currentPage=22, contents={22=Pierwsza notatka.}}<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-default\"\/>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\">Poni\u017cszy kod \u017ar\u00f3d\u0142owy prezentuje klas\u0119 j\u0119zyka Java posiadaj\u0105c\u0105 wszystkie trzy sk\u0142adowe klasy &#8211; atrybuty, konstruktory i metody.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class Notebook {\n    \/\/ atrybuty klasy\n    int pages;\n    int currentPage;\n    Map&lt;Integer, String> contents = new HashMap&lt;>();\n\n    \/\/ konstruktor klasy\n    public Notebook() {\n    }\n\n    \/\/ konstruktor klasy\n    public Notebook(int pages) {\n        \/\/ cia\u0142o konstruktora, instrukcje do wykonania\n        this.pages = pages;\n    }\n\n    \/\/ metoda klasy\n    void writeNoteContent(String noteContent) {\n        \/\/ cia\u0142o metody, instrukcje do wykonania\n        contents.merge(currentPage, noteContent,\n                (oldContent, newContent) \n                        -> oldContent + \" \" + newContent);\n    }\n\n    \/\/ metoda klasy\n    void goToPage(int page) {\n        \/\/ cia\u0142o metody, instrukcje do wykonania\n        currentPage = page;\n    }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Wi\u0119kszo\u015b\u0107 klas tworzonych przez programist\u00f3w, programistki wygl\u0105da podobnie jak prezentowany wy\u017cej kod. Obiekt klasy Notebook b\u0119dzie: posiada\u0142, przechowywa\u0142 sw\u00f3j stan; tworzy\u0142 si\u0119 wed\u0142ug okre\u015blonego schematu; wykonywa\u0142 czynno\u015bci, wchodzi\u0142 w interakcj\u0119.<\/p>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\">Poni\u017cszy kod \u017ar\u00f3d\u0142owy prezentuje dzia\u0142anie wszystkich trzech sk\u0142adowych klasy &#8211; atrybuty, konstruktory i metody.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class ApplicationMain {\n    public static void main(String[] args) {\n        \/\/ utworzenie obiektu 'simpleNotebook' klasy 'Notebook'\n        Notebook simpleNotebook = new Notebook(9);\n\n        System.out.println(\"Bie\u017c\u0105ca strona notatnika: \"\n                + simpleNotebook.currentPage);\n        simpleNotebook.goToPage(3);\n        System.out.println(\"Bie\u017c\u0105ca strona notatnika,\" +\n                \" po zmianie strony: \" \n                + simpleNotebook.currentPage);\n\n        System.out.println(\"Bie\u017c\u0105ca zawarto\u015b\u0107 notatnika: \"\n                + simpleNotebook.contents);\n        simpleNotebook.writeNoteContent(\"Wpis w notatniku\");\n        System.out.println(\"Bie\u017c\u0105ca zawarto\u015b\u0107 notatnika,\" +\n                \" po dodaniu tre\u015bci: \" + simpleNotebook.contents);\n    }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Poni\u017cej wynik programu prezentuj\u0105cego atrybuty, konstruktory i metody.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Bie\u017c\u0105ca strona notatnika: 0\nBie\u017c\u0105ca strona notatnika, po zmianie strony: 3\nBie\u017c\u0105ca zawarto\u015b\u0107 notatnika: {}\nNotebook - append note content to the current page: Wpis w notatniku\nBie\u017c\u0105ca zawarto\u015b\u0107 notatnika, po dodaniu tre\u015bci: {3=Wpis w notatniku}\n\nProcess finished with exit code 0<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-dots\"\/>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"trzy-paradygmaty-programowania-obiektowego\">Trzy paradygmaty programowania obiektowego<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Hermetyzacja<\/strong> &#8211; <em>pozwala &#8220;ukry\u0107&#8221; elementy klasy przed &#8220;niechcianym&#8221; dost\u0119pem z poziomu innej klasy<\/em> &#8211; u\u017cywamy do tego modyfikatory dost\u0119pu, np.: <strong>public, protected, private<\/strong>. Hermetyzacja czasem nazywa si\u0119 enkapsulacj\u0105. Wi\u0119cej na ten temat mo\u017cna przeczyta\u0107 w oficjalnej dokumentacji j\u0119zyka Java na stronie <a rel=\"noreferrer noopener\" href=\"https:\/\/docs.oracle.com\/javase\/tutorial\/java\/javaOO\/accesscontrol.html\" data-type=\"URL\" data-id=\"https:\/\/docs.oracle.com\/javase\/tutorial\/java\/javaOO\/accesscontrol.html\" target=\"_blank\">The Java\u2122 Tutorials &#8211; Controlling Access to Members of a Class<\/a>.<\/li>\n<\/ol>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\">Poni\u017cszy kod \u017ar\u00f3d\u0142owy prezentuje jedn\u0105 z konwencji, paradygmat\u00f3w programowania obiektowego &#8211; hermetyzacja.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class Notebook {\n    \/\/ atrybuty klasy\n    private int pages;\n    private int currentPage;\n    private Map&lt;Integer, String> contents = new HashMap&lt;>();\n\n    \/\/ metoda klasy\n    void goToPage(int page) {\n        \/\/ cia\u0142o metody, instrukcje do wykonania\n        if (page &lt; pages) {\n            currentPage = page;\n        }\n    }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Co, to oznacza, \u017ce hermetyzujemy elementy klasy?<\/strong> Hermetyzacja, enkapsulacja chroni atrybuty, konstruktory i metody przed niew\u0142a\u015bciwym u\u017cyciem, m\u00f3wi\u0105c inaczej, to tw\u00f3rcy danej klasy decyduj\u0105 o tym jak ona b\u0119dzie si\u0119 zachowywa\u0142a. Na przyk\u0142adzie notatnika (klasa Notebook) atrybuty s\u0105 <em>&#8220;ukryte&#8221;, maj\u0105 oznaczenie private<\/em>, <em>wyb\u00f3r\/przej\u015bcie do bie\u017c\u0105cej strony (int currentPage)<\/em> mo\u017cliwy jest tylko za pomoc\u0105 <em>metody void goToPage(int page)<\/em>. Metoda <em>goToPage<\/em> sprawdza czy numer podanej strona jest mniejszy ni\u017c ilo\u015b\u0107 wszystkich stron <em>if (page &lt; pages)<\/em>. Bez tego warunku &#8220;zabezpieczaj\u0105cego&#8221; program &#8220;na \u015blepo&#8221; wykona\u0142 by przej\u015bcie do nieistniej\u0105cej strony, co zako\u0144czy\u0142oby si\u0119 zg\u0142oszeniem b\u0142\u0119du i\/lub zako\u0144czeniem programu. <strong>Obrazuje, to poni\u017cszy kod \u017ar\u00f3d\u0142owy.<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class ApplicationMain {\n    public static void main(String[] args) {\n        Notebook hermeticNotebook = new Notebook();\n        \/\/ nie mo\u017cna nada\u0107 warto\u015bci dla poni\u017cszych atrybut\u00f3w\n\n        \/\/ 'pages' has private access in 'Notebook'\n        \/\/ hermeticNotebook.pages = 30;\n        \/\/ 'currentPage' has private access in 'Notebook'\n        \/\/ hermeticNotebook.currentPage = 3;\n    }\n}<\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li><strong>Dziedziczenie<\/strong> &#8211; <em>pozwala wydzieli\u0107 wsp\u00f3lne elementy klasy &#8211; <em><em>stan, cechy, dan<\/em><\/em><\/em>e &#8211;<em> do innej klasy tzw. nad klasy<\/em>, kt\u00f3ra b\u0119dzie rodzicem dla innych klas &#8211; u\u017cywamy do tego s\u0142owa kluczowego <strong>extends<\/strong>. Wi\u0119cej na ten temat mo\u017cna przeczyta\u0107 w oficjalnej dokumentacji j\u0119zyka Java na stronie <a rel=\"noreferrer noopener\" href=\"https:\/\/docs.oracle.com\/javase\/tutorial\/java\/IandI\/subclasses.html\" data-type=\"URL\" data-id=\"https:\/\/docs.oracle.com\/javase\/tutorial\/java\/IandI\/subclasses.html\" target=\"_blank\">The Java\u2122 Tutorials &#8211; Inheritance<\/a>.<\/li>\n<\/ol>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\">Poni\u017cszy kod \u017ar\u00f3d\u0142owy prezentuje jedn\u0105 z konwencji, paradygmat\u00f3w programowania obiektowego &#8211; dziedziczenie.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class Notebook {\n    \/\/ atrybuty klasy\n    protected int pages;\n    protected int currentPage;\n    protected Map&lt;Integer, String> contents = new HashMap&lt;>();\n}<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ dziedziczenie - s\u0142owo kluczowe 'extends'\npublic class SpiralNotebook extends Notebook {\n    \/\/ atrybuty klasy\n    protected String spiralMaterial;\n    protected boolean perforated;\n\n    \/\/ metoda klasy\n    void removePage(int pageNumber) {\n        if (perforated) {\n            pages = pages - 1;\n        }\n    }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Co, to oznacza, \u017ce dziedziczymy elementy nad klasy?<\/strong> Na przyk\u0142adzie notatnik\u00f3w (klasa Notebook oraz SpiralNotebook), posiadaj\u0105 one <em>wsp\u00f3lne cechy takie jak ilo\u015b\u0107 stron (int pages)<\/em>, ale mog\u0105 by\u0107 notatniki, kt\u00f3re r\u00f3\u017cni\u0105 si\u0119 pewnymi cechami. Ko\u0142onotatnik (klasa SpiralNotebook) posiada <em>spiral\u0119 \u0142\u0105cz\u0105c\u0105 kartki, kt\u00f3ra mo\u017ce by\u0107 z r\u00f3\u017cnego materia\u0142u (String spiralMaterial)<\/em>, jego kartki <em>mog\u0105 mie\u0107 lub nie mie\u0107 perforacji (boolean perforated)<\/em>, kt\u00f3ra <em>umo\u017cliwia wyrwanie strony (void removePage(int pageNumber)<\/em>. To samo dotyczy metod i konstruktor\u00f3w w klasach. Dziedziczenie pozwala zmniejszy\u0107 ilo\u015b\u0107 powtarzalnego kodu oraz ujednolici\u0107, zgrupowa\u0107 wiele klas w jeden typ. <strong>Obrazuje, to poni\u017cszy kod \u017ar\u00f3d\u0142owy.<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class ApplicationMain {\n    public static void main(String[] args) {\n        SpiralNotebook spiralNotebook = new SpiralNotebook();\n        spiralNotebook.pages = 30;\n        System.out.println(\"Ilo\u015b\u0107 stron: \"\n                + spiralNotebook.pages);\n\n        spiralNotebook.spiralMaterial = \"Metal\";\n        System.out.println(\"Materia\u0142 spirali: \"\n                + spiralNotebook.spiralMaterial);\n\n        spiralNotebook.perforated = true;\n        spiralNotebook.removePage(2);\n        System.out.println(\"Ilo\u015b\u0107 stron: \"\n                + spiralNotebook.pages);\n    }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Poni\u017cej wynik programu prezentuj\u0105cego dziedziczenie.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Ilo\u015b\u0107 stron: 30\nMateria\u0142 spirali: Metal\nIlo\u015b\u0107 stron: 29\n\nProcess finished with exit code 0<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Praktyczna uwaga:<\/em> nale\u017cy ostro\u017cnie u\u017cywa\u0107 dziedziczenia, je\u017celi to mo\u017cliwe nale\u017cy je zast\u0105pi\u0107 zale\u017cno\u015bci\u0105, kompozycj\u0105. Zamiast relacji IS-A (jest czym\u015b) warto u\u017cywa\u0107 relacji HAS-A (ma co\u015b). Wi\u0119cej o tym pisa\u0142em w artykule <a href=\"https:\/\/www.juniorjavadeveloper.pl\/en\/2020\/11\/17\/stop-zanim-zaczniesz-pisac-kod-zastanow-sie-co-chcesz-kodowac-analiza-projekt-i-implementacja\/\" data-type=\"post\" data-id=\"1238\">Stop! Zanim zaczniesz pisa\u0107 kod zastan\u00f3w si\u0119, co chcesz kodowa\u0107? Analiza, projekt i implementacja<\/a> w sekcji &#8220;Analiza \u2013 Karty CRC \u2013 Class Responsibility Collaborators&#8221;.<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li><strong>Polimorfizm<\/strong> &#8211; <em>pozwala tej samej metodzie zachowywa\u0107 si\u0119, wykonywa\u0107 kod programu w r\u00f3\u017cny spos\u00f3b<\/em> w ramach dziedziczenia klas i\/lub implementacji interfejs\u00f3w &#8211; polimorfizm mo\u017cna wskaza\u0107 za pomoc\u0105 adnotacji <strong>@Override<\/strong>. Polimorfizm w wolnym t\u0142umaczeniu, to wielopostaciowo\u015b\u0107. Wi\u0119cej na ten temat mo\u017cna przeczyta\u0107 w oficjalnej dokumentacji j\u0119zyka Java na stronie <a rel=\"noreferrer noopener\" href=\"https:\/\/docs.oracle.com\/javase\/tutorial\/java\/IandI\/polymorphism.html\" data-type=\"URL\" data-id=\"https:\/\/docs.oracle.com\/javase\/tutorial\/java\/IandI\/polymorphism.html\" target=\"_blank\">The Java\u2122 Tutorials &#8211; Polymorphism<\/a>.<\/li>\n<\/ol>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\">Poni\u017cszy kod \u017ar\u00f3d\u0142owy prezentuje jedn\u0105 z konwencji, paradygmat\u00f3w programowania obiektowego &#8211; polimorfizm.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class Notebook {\n    \/\/ pomijam atrybuty klasy\n    \/\/ pomijam konstruktory klasy\n    \/\/ pomijam metody klasy\n\n    \/\/ metoda klasy\n    void writeNoteContent(String noteContent) {\n        \/\/ cia\u0142o metody, instrukcje do wykonania\n        contents.merge(currentPage, noteContent,\n                (oldContent, newContent)\n                        -> oldContent + \" \" + newContent);\n\n        System.out.println(\"Notebook - append note content\" +\n                \" to the current page: \" + noteContent);\n    }\n}<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class SpiralNotebook extends Notebook {\n    private String spiralMaterial;\n    private boolean perforated;\n\n    void removePage(int pageNumber) {\n        if (perforated) {\n            pages = pages - 1;\n        }\n    }\n\n    \/\/ metoda klasy u\u017cywaj\u0105ca polimorfizmu\n    \/\/ nadpisuj\u0105ca metod\u0119 z nad klasy\n    @Override\n    void writeNoteContent(String noteContent) {\n        \/\/ cia\u0142o metody, instrukcje do wykonania\n        contents.put(currentPage, noteContent);\n        removePage(currentPage);\n\n        System.out.println(\"SpiralNotebook - write note content\" +\n                \" and remove page: \" + noteContent);\n    }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Co, to oznacza, \u017ce metody klasy maj\u0105 wiele form, postaci &#8211; polimorfizm?<\/strong> Daje, to mo\u017cliwo\u015b\u0107 dostosowania dzia\u0142ania metody dla klas, kt\u00f3re <em>dziedzicz\u0105 wsp\u00f3lne elementy (Map&lt;Integer, String&gt; contents)<\/em>, ale chcia\u0142by, aby ich <em>zachowanie by\u0142o inne<\/em> &#8211; <em>@Override void writeNoteContent(String noteContent)<\/em> &#8211; ni\u017c klasy nadrz\u0119dnej, rodzica. Na przyk\u0142ad w ko\u0142onotatniku po zapisaniu strony &#8211; <em>contents.put(currentPage, noteContent) <\/em>&#8211; chcieliby\u015bmy j\u0105 wyrwa\u0107 &#8211; <em>removePage(currentPage)<\/em>. <strong>Obrazuje, to poni\u017cszy kod \u017ar\u00f3d\u0142owy.<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class ApplicationMain {\n    public static void main(String[] args) {\n\n        \/\/ utworzenie obiektu 'janNotebook' klasy 'Notebook'\n        Notebook janNotebook = new Notebook();\n\n        \/\/ utworzenie obiektu 'alaNotebook' klasy 'SpiralNotebook'\n        Notebook alaNotebook = new SpiralNotebook();\n\n        janNotebook.writeNoteContent(\"Jan ma psa\");\n        alaNotebook.writeNoteContent(\"Ala ma kota\");\n    }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Poni\u017cej wynik programu prezentuj\u0105cego dzia\u0142anie polimorfizmu.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Notebook - append note content to the current page: Jan ma psa\nSpiralNotebook - write note content and remove page: Ala ma kota\n\nProcess finished with exit code 0<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-dots\"\/>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"trzy-elementy-wspierajace-programowanie-obiektowe\">Trzy elementy wspieraj\u0105ce programowanie obiektowe<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Zale\u017cno\u015b\u0107<\/strong> &#8211; inaczej powi\u0105zanie, pozwala u\u017cywa\u0107 jednej klasy w drugiej, zazwyczaj zale\u017cno\u015b\u0107 reprezentowana jest jako atrybut klasy. Zale\u017cno\u015bci tworz\u0105 relacje pomi\u0119dzy klasami.<\/li>\n<\/ol>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\">Poni\u017cszy kod \u017ar\u00f3d\u0142owy prezentuje jeden ze sposob\u00f3w wsp\u00f3\u0142dzia\u0142a z innymi klasami poprzez tworzenie relacji &#8211; zale\u017cno\u015b\u0107.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class Notebook {\n    \/\/ pomijam atrybuty klasy\n    \/\/ pomijam konstruktory klasy\n    \/\/ pomijam metody klasy\n}<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class Student {\n    \/\/ zale\u017cno\u015b\u0107 do klasy Notebook\n    \/\/ zale\u017cno\u015b\u0107 jest jednocze\u015bnie atrybutem klasy Student\n    private Notebook notebook;\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Co, to oznacza, \u017ce tworzymy zale\u017cno\u015bci, powi\u0105zania do innych obiekt\u00f3w?<\/strong> Dzi\u0119ki zale\u017cno\u015bciom mo\u017cemy wykorzysta\u0107 istniej\u0105cy kod klasy i u\u017cy\u0107 go w naszych w\u0142asnych klasach, co pozwala zredukowa\u0107 powtarzanie kodu, zaoszcz\u0119dzi\u0107 czas na &#8220;wymy\u015blanie ko\u0142a&#8221; od nowa. Pozwala na tworzenie tzw. lu\u017anych powi\u0105za\u0144 mi\u0119dzy klasami &#8211; jest to zgodne z dobrymi praktykami programowania obiektowego.<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li><strong>Wstrzykiwanie zale\u017cno\u015bci<\/strong> &#8211; spos\u00f3b przekazywania konkretnej zale\u017cno\u015bci do klasy, kt\u00f3ra jej u\u017cywa.<\/li>\n<\/ol>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\">Poni\u017cszy kod \u017ar\u00f3d\u0142owy prezentuje jeden ze sposob\u00f3w wsp\u00f3\u0142dzia\u0142a z innymi klasami poprzez tworzenie relacji &#8211; wstrzykiwanie zale\u017cno\u015bci.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class Student {\n    private Notebook notebook;\n\n    public Student(Notebook notebook) {\n        this.notebook = notebook;\n    }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Co, to oznacza, \u017ce wstrzykujemy zale\u017cno\u015bci do innych obiekt\u00f3w?<\/strong> W momencie tworzenia obiektu decydujemy z jakiej klasy zale\u017cnej b\u0119dzie korzysta\u0142 tworzony obiekt. Nie &#8220;zaszywamy na sta\u0142e&#8221; w kodzie, nie uzale\u017cniamy si\u0119 od jednej konkretnej implementacji naszego kodu. Na przyk\u0142adzie klas Student i Notebook, dopiero w momencie tworzenia obiektu klasy student podajemy z jakiego notatnika b\u0119dzie on korzysta\u0142, <em>zwyk\u0142y notatnik &#8211; <em>new Student(new Notebook()) &#8211;<\/em><\/em> czy <em>ko\u0142onotatnik &#8211; <em>new Student(new SpiralNotebook())<\/em><\/em>. Pisanie notatek przez studenta &#8211; startNote(&#8230;) &#8211; b\u0119dzie mia\u0142o inny przebieg w zale\u017cno\u015bci od wybranego notatnika. <strong>Obrazuje, to poni\u017cszy kod \u017ar\u00f3d\u0142owy.<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class ApplicationMain {\n    public static void main(String[] args) {\n\n        \/\/ utworzenie obiektu 'janNotebook' klasy 'Notebook'\n        Notebook tomNotebook = new Notebook(30);\n        \/\/ utworzenie obiektu 'tomStudent' klasy 'Student'\n        \/\/ wstrzykni\u0119cie zale\u017cno\u015bci 'tomNotebook' do klasy Student\n        Student tomStudent = new Student(tomNotebook);\n        tomStudent.startNote(\"Pewnego dnia.\", 2);\n\n        \/\/ utworzenie obiektu 'alaNotebook' klasy 'SpiralNotebook'\n        Notebook eveNotebook = new SpiralNotebook(60);\n        \/\/ utworzenie obiektu 'eveStudent' klasy 'Student'\n        \/\/ wstrzykni\u0119cie zale\u017cno\u015bci 'eveNotebook' do klasy Student\n        Student eveStudent = new Student(eveNotebook);\n        eveStudent.startNote(\"Dawno temu.\", 4);\n    }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Poni\u017cej wynik programu prezentuj\u0105cego wstrzykiwanie zale\u017cno\u015bci.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Notebook - append note content to the current page: Pewnego dnia.\nSpiralNotebook - write note content and remove page: Dawno temu.\n\nProcess finished with exit code 0<\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li><strong>Delegacja<\/strong> &#8211; odwo\u0142anie si\u0119 do klasy zale\u017cnej w celu przekazania, przekierowania do niej dzia\u0142ania.<\/li>\n<\/ol>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\">Poni\u017cszy kod \u017ar\u00f3d\u0142owy prezentuje jeden ze sposob\u00f3w wsp\u00f3\u0142dzia\u0142a z innymi klasami poprzez tworzenie relacji &#8211; delegacja.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class Student {\n    private Notebook notebook;\n\n    void writeNote(String noteContent, int page) {\n        notebook.goToPage(page);\n        notebook.writeNoteContent(noteContent);\n    }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Co, to oznacza, \u017ce delegujemy dzia\u0142anie do innych obiekt\u00f3w?<\/strong> Na przyk\u0142adzie powy\u017cszej <em>klasy Student<\/em> i metody <em>void writeNote(String noteContent, int page)<\/em> &#8211; kiedy wywo\u0142ujemy dla studenta metod\u0119 <em>writeNote(&#8230;)<\/em> &#8211; ona deleguje swoje dzia\u0142anie do klasy Notebook, kt\u00f3ra, wie, \u017ce musi przej\u015b\u0107 do strony &#8211; <em>notebook.goToPage(page)<\/em> &#8211; na kt\u00f3rej b\u0119dzie mog\u0142a zapisa\u0107 &#8211; <em>notebook.writeNoteContent(noteContent)<\/em> &#8211;  tre\u015b\u0107 notatki. Tym samym wspieramy dobr\u0105 praktyk\u0119 programistyczn\u0105 jak\u0105 jest Single Responsibility Principle z <a rel=\"noreferrer noopener\" href=\"https:\/\/en.wikipedia.org\/wiki\/SOLID\" data-type=\"URL\" data-id=\"https:\/\/en.wikipedia.org\/wiki\/SOLID\" target=\"_blank\">S.O.L.I.D.<\/a>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\">Poni\u017cszy kod \u017ar\u00f3d\u0142owy prezentuje wszystkie sposoby wsp\u00f3\u0142dzia\u0142a z innymi klasami poprzez tworzenie relacji &#8211; zale\u017cno\u015b\u0107, wstrzykiwanie zale\u017cno\u015bci oraz delegacja.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class ApplicationMain {\n    public static void main(String[] args) {\n\n        \/\/ utworzenie obiektu 'janNotebook' klasy 'Notebook'\n        Notebook janNotebook = new Notebook();\n        \/\/ utworzenie obiektu 'janStudent' klasy 'Student'\n        Student janStudent = new Student(janNotebook);\n        janStudent.startNote(\"Jan ma psa\", 1);\n\n        \/\/ utworzenie obiektu 'alaNotebook' klasy 'SpiralNotebook'\n        Notebook alaNotebook = new SpiralNotebook();\n        \/\/ utworzenie obiektu 'alaStudent' klasy 'Student'\n        Student alaStudent = new Student(alaNotebook);\n        alaStudent.startNote(\"Ala ma kota\", 3);\n    }\n}<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Notebook - append note content to the current page: Jan ma psa\nSpiralNotebook - write note content and remove page: Ala ma kota\n\nProcess finished with exit code 0<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-dots\"\/>\n\n\n\n<h5 class=\"wp-block-heading\" id=\"assembler-vs-java\">Assembler vs Java<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">Na zako\u0144czenie jako ciekawostk\u0119 prezentuj\u0119 por\u00f3wnanie kodu \u017ar\u00f3d\u0142owego j\u0119zyka Java i Assemblera, kt\u00f3re moim zdaniem pokazuje jakie u\u0142atwienie maj\u0105 programi\u015bci, programistki j\u0119zyka Java w por\u00f3wnaniu z osobami pisz\u0105cymi kod w Assemblerze.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"asm\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">section\t.text\n   global_start   ;must be declared for linker (ld)\n  \n_start:\t          ;tells linker entry point\n   mov\tedx,len   ;message length\n   mov\tecx,msg   ;message to write\n   mov\tebx,1     ;file descriptor (stdout)\n   mov\teax,4     ;system call number (sys_write)\n   int\t0x80      ;call kernel\n  \n   mov\teax,1     ;system call number (sys_exit)\n   int\t0x80      ;call kernel\n\nsection\t.data\nmsg db 'Hello, world!', 0xa  ;string to be printed\nlen equ $ - msg     ;length of the string<\/pre>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\">Powy\u017cej kod \u017ar\u00f3d\u0142owy Assemblera.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class MainProgram {\n    public static void main(String[] args) {\n        System.out.println(\"Hello World!\");\n    }\n}<\/pre>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\">Powy\u017cej kod \u017ar\u00f3d\u0142owy j\u0119zyka Java.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-dots\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">Podsumowuj\u0105c, moim zdaniem niezb\u0119dna jest znajomo\u015b\u0107 wy\u017cej opisanego zestawu narz\u0119dzi w postaci:<br>&#8211; <a href=\"#trzy-elementy-skladowe-klasy\" data-type=\"internal\" data-id=\"#trzy-elementy-skladowe-klasy\">Trzech element\u00f3w sk\u0142adowych klasy<\/a>,<br>&#8211; <a href=\"#trzy-paradygmaty-programowania-obiektowego\" data-type=\"internal\" data-id=\"#trzy-paradygmaty-programowania-obiektowego\">Trzech paradygmat\u00f3w programowania obiektowego<\/a>,<br>&#8211; <a href=\"#trzy-elementy-wspierajace-programowanie-obiektowe\">Trzech element\u00f3w wspieraj\u0105cych programowanie obiektowe<\/a>.<br>Tak samo jak kierowca samochodu jad\u0105cy ca\u0142y czas na pierwszym biegu nie rozwinie pe\u0142nego potencja\u0142u samochodu &#8211; mo\u017ce go r\u00f3wnie\u017c popsu\u0107 &#8211; tak samo programista, programistka nie przechodz\u0105c na wy\u017cszy poziom wiedzy nie rozwinie w pe\u0142ni mo\u017cliwo\u015bci j\u0119zyka Java &#8211; mo\u017ce &#8220;popsu\u0107 kod&#8221; &#8211; pisz\u0105c kod, kt\u00f3rego p\u00f3\u017aniejsze utrzymanie b\u0119dzie bardzo trudne lub wr\u0119cz niemo\u017cliwe. Kolejnym krokiem po opanowaniu materia\u0142u z tego artyku\u0142u mo\u017ce by\u0107 zapoznanie si\u0119 z moim innym artyku\u0142em <a rel=\"noreferrer noopener\" href=\"https:\/\/www.juniorjavadeveloper.pl\/en\/2020\/02\/29\/dlaczego-kod-w-jezyku-java-powinien-byc-solidny-oraz-suchy-dry\/\" data-type=\"post\" data-id=\"449\" target=\"_blank\">Dlaczego kod w j\u0119zyku Java powinien by\u0107 SOLID\u2019ny oraz suchy, DRY?<\/a>.<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-poradnik-dla-przyszlych-junior-java-developer-039-ow wp-block-embed-poradnik-dla-przyszlych-junior-java-developer-039-ow\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"gs6HtSsw43\"><a href=\"https:\/\/www.juniorjavadeveloper.pl\/en\/kontakt\/\">Contact<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"\u201eKontakt\u201d \u2014 Poradnik dla przysz\u0142ych Junior Java Developer&amp;apos;\u00f3w\" src=\"https:\/\/www.juniorjavadeveloper.pl\/kontakt\/embed\/#?secret=1MAXIzrbfX#?secret=gs6HtSsw43\" data-secret=\"gs6HtSsw43\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-poradnik-dla-przyszlych-junior-java-developer-039-ow wp-block-embed-poradnik-dla-przyszlych-junior-java-developer-039-ow\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"GR2ljucjwT\"><a href=\"https:\/\/www.juniorjavadeveloper.pl\/en\/mentoring-rezerwuj-termin\/\">Mentoring - book an appointment<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"\u201eMentoring \u2013 rezerwuj termin\u201d \u2014 Poradnik dla przysz\u0142ych Junior Java Developer&amp;apos;\u00f3w\" src=\"https:\/\/www.juniorjavadeveloper.pl\/mentoring-rezerwuj-termin\/embed\/#?secret=dZ04HYAHP9#?secret=GR2ljucjwT\" data-secret=\"GR2ljucjwT\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Zdj\u0119cie autorstwa <a href=\"https:\/\/www.pexels.com\/pl-pl\/zdjecie\/wladca-metal-stol-praca-7238606\/\" data-type=\"URL\" data-id=\"https:\/\/www.pexels.com\/pl-pl\/zdjecie\/wladca-metal-stol-praca-7238606\/\" target=\"_blank\" rel=\"noreferrer noopener\">Maddy Freddie<\/a> z <a rel=\"noreferrer noopener\" href=\"https:\/\/www.pexels.com\/pl-pl\/\" target=\"_blank\">Pexels<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>W tym artykule przybli\u017c\u0119 trzy elementy, kt\u00f3re z mojego do\u015bwiadczenia s\u0105 bardzo istotne dla os\u00f3b ucz\u0105cych si\u0119 j\u0119zyka Java, aby dobrze zrozumie\u0107 programowanie obiektowe. Osoby \u015bredniozaawansowane oraz zaawansowane te\u017c mog\u0105 z tego skorzysta\u0107, traktuj\u0105c t\u0119 wiedz\u0119 jako powt\u00f3rk\u0119. W sk\u0142ad ka\u017cdego z trzech g\u0142\u00f3wnych punkt\u00f3w wchodz\u0105 pomniejsze trzy elementy, st\u0105d trzy tr\u00f3jce programistyczne. Poni\u017csze tr\u00f3jce [&hellip;]<\/p>","protected":false},"author":1,"featured_media":2377,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_ppp_document_settings_meta":"","footnotes":"","jetpack_publicize_message":"","jetpack_is_tweetstorm":false,"jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false}}},"categories":[4,6,3,2,7],"tags":[],"class_list":["post-1920","post","type-post","status-publish","format-standard","has-post-thumbnail","category-bez-kategorii","category-felieton","category-kod-java","category-poczatkujacy","category-poradnik"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2023\/01\/Trzy-trojce-programistyczne_-jak-ulatwic-poczatki-programowania_Mentor-Junior-Java-Developer.jpg","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.juniorjavadeveloper.pl\/en\/wp-json\/wp\/v2\/posts\/1920","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.juniorjavadeveloper.pl\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.juniorjavadeveloper.pl\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.juniorjavadeveloper.pl\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.juniorjavadeveloper.pl\/en\/wp-json\/wp\/v2\/comments?post=1920"}],"version-history":[{"count":115,"href":"https:\/\/www.juniorjavadeveloper.pl\/en\/wp-json\/wp\/v2\/posts\/1920\/revisions"}],"predecessor-version":[{"id":2392,"href":"https:\/\/www.juniorjavadeveloper.pl\/en\/wp-json\/wp\/v2\/posts\/1920\/revisions\/2392"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.juniorjavadeveloper.pl\/en\/wp-json\/wp\/v2\/media\/2377"}],"wp:attachment":[{"href":"https:\/\/www.juniorjavadeveloper.pl\/en\/wp-json\/wp\/v2\/media?parent=1920"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.juniorjavadeveloper.pl\/en\/wp-json\/wp\/v2\/categories?post=1920"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.juniorjavadeveloper.pl\/en\/wp-json\/wp\/v2\/tags?post=1920"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}