Metody w języku Java
Metody w języku Java
22 października 2015
Artykuł logo
Pierwszy program w Java
8 listopada 2015
Obiekty i pakiety w języku Java

Obiekty i pakiety w języku Java

Czas na kolejny etap kursu programowania języka Java. W dzisiejszym odcinku wystąpią nowi bohaterowie – obiekty i pakiety. Zobaczymy też starych gości: kilka dobrych praktyk i dokładne opisy poparte przykładami. Bez wątpienia przyda się wiedza z poprzednich artykułów. Na końcu jak zwykle ćwiczenie dla Was. Do dzieła!

To jest jeden z artykułów w ramach darmowego kursu programowania w Javie. Proszę zapoznaj się z pozostałymi częściami, mogą one być pomocne w zrozumieniu materiału z tego artykułu.

Pakiet

Programy komputerowe składają się z wielu plików. Przy dużym projekcie składającym się z kilkuset, kilku tysięcy plików kluczowe staje się odpowiednie zarządzanie plikami z kodem źródłowym programu. Bez takiego zarządzania wydajność programisty mocno spada.

Więc czym jest pakiet? Pakiet wraz z nazwą klasy tworzy swego rodzaju “unikalny adres”. Podobnie jak ludzie mają swoje adresy tak klasy mają swoje pakiety, które pomagają zlokalizować klasy w trakcie działania programu.

Rozbijmy tą linię kodu na części pierwsze:

  • package – to słowo kluczowe podobnie jak class czy if, informuje kompilator o tym w jakim pakiecie znajduje się plik,
  • pl.samouczekprogramisty.kursjava – właściwa nazwa pakietu. Podobnie jak w przypadku omówionego w poprzednim artykule nazewnictwa metod tutaj obowiązują podobne zasady. Dla uproszczenia możemy powiedzieć, że dozwolone są małe litery oraz znak kropki.

Istnieje kilka zarezerwowanych nazw pakietów. Służą one do odróżnienia klas dostarczonych wraz z wirtualną maszyną Javy od klas tworzonych przez programistów. Innymi słowy pakiety tworzone przez Ciebie nie mogą zaczynać się od java. ani od javax..

Pakiety służą do grupowania klas, interfejsów, typów wyliczeniowych czy adnotacji (Jeśli czytasz artykuły chronologicznie te terminy prawdopodobnie są dla Ciebie nowe. Nie przejmuj się, opiszę je dokładnie w jednym z kolejnych artykułów.).

Jak zauważyłeś nazwa pakietów jest specyficzna. Przyjęło się, że za pakiet używa się odwróconej nazwy domeny. Takie podejście pozwala na łatwiejsze uniknięcie konfliktów. W przypadku naszego kursu użyłem pl.samouczekprogramisty.kursjava. Istotne jest  tutaj odwzorowanie struktury katalogów. Każdy człon pakietu odpowiada katalogowi na dysku.kurs_java2_pakietyW pliku źródłowym może znajdować się wyłącznie jedna linia z pakietem. Musi znajdować się na początku pliku. Co prawda nie jest to linia obowiązkowa, jednak używanie domyślnego pakietu nie jest dobrą praktyką1.

Nazwy pakietów powinny odwzorowywać ich zawartość. Np pakiet pl.samouczekprogramisty.animals mógłby zawierać klasę Dog, ale już klasa Owner powinna znaleźć się prawdopodobnie w innym miejscu.

Klasa

Klasy służą do grupowania atrybutów i metod, pakietów używamy do grupowania klas. Zanim pokażę Wam przykład kodu przejdziemy przez parę funkcji IDE, które na pewno przydadzą się w przyszłości.

Skróty klawiaturowe

IDE czy zwykły edytor tekstu są narzędziami pracy programisty. Znajomość narzędzi pracy znacząco zwiększa wydajność pracy. Innymi słowy bardzo przydatne jest używanie skrótów klawiaturowych. Postaram się przybliżyć Wam kilka z nich.

Po lewej stronie widzicie okno do przeglądania struktury projektu. To okienko możecie włączać/wyłączać używając skrótu <Alt + 1>*2. Po kliknięciu w obszar tego okienka przyda się skrót <Alt + Ins>. W tym kontekście przyda się on do stworzenia nowego pakietu oraz pliku z naszą pierwszą klasą. Po naciśnięciu tego skrótu pokaże się Wam takie okienko.kurs_java_2_nowy_pakietkurs_java_2.nowy_pakiet_dialogGdy mamy już nasz pakiet używając tego samego skrótu możemy stworzyć klasę. W naszym przykładzie stworzyłem pakiet pl.samouczekprogramisty.kursjava.engine a w nim klasę Cogwheel.kurs_java_2_new_package

Podobnie jak poprzednio teraz linijka po linijce przeanalizujemy przykładowy kod klasy w języku Java. Pierwsza linijka nie jest już dla Was niczym nowym, ot zwykła deklaracja pakietu. Ciekawsze są kolejne linie.

Komentarze w kodzie

Kolejne 3 linie to komentarz w kodzie. Komentarz w kodzie to dodatkowa wiadomość dla programisty. Czasami dodanie komentarza nad fragmentem bardziej skomplikowanego kodu pomaga w jego zrozumieniu. Komentarz jest pomijany w trakcie wykonywania programu.

W języku Java występują 2 typy komentarzy:

  • komentarze w kilku liniach – przykład widzicie powyżej, wszystko co znajduję się pomiędzy /** a */ traktowane jest jako komentarz.
  • komentarz jednoliniowy – wszystko co znajduje się za // do końca linii traktowane jest jako komentarz. Parę przykładów poniżej

Kolejne 2 linijki to już właściwa definicja klasy. Opiszmy każdy z elementów osobno:

  • public – modyfikator dostępu. Temat modyfikatorów dostępu opiszę dokładniej w osobnym artykule. Na tym etapie możemy założyć, że przed klasą stawiamy słowo kluczowe public i oznacza ono, że jest ona widoczna dla innych klas,
  • class – słowo kluczowe informujące kompilator o tym, że mamy do czynienia z definicją klasy,
  • Cogwheel – nazwa klasy. Przyjęło się, że nazwę klasy zaczynamy wielką literą. Podobnie jak w przypadku pakietów nie możmy używać wszystkich znaków. Dla uproszczenia możemy założyć, że nazwa klasy musi zaczynać się wielką literą, później możemy używać wielkich/mały liter bądź cyfr,
  • {} – para nawiasów określająca tak zwany blok, podobnie ja w metodzie grupuje on kilka instrukcji. Wszystkie linie kodu znajdujące się między nawiasami klamrowymi składają się na pełną definicję klasy.

Poniżej ta sama klasa ale już trochę bardziej rozbudowana

Pierwszy nowy element to tak zwany atrybut klasy:

  • private – modyfikator dostępu. Tym razem jest to słowo kluczowe private. Oznacza tyle, że dany element (w tym przypadku atrybut) dostępny jest wyłącznie z wnętrza danej klasy,
  • int – znany już typ,
  • size – nazwa atrybutu. Konwencja nazewnicza zakłada, że nazwy atrybutów piszemy małą literą. Podobnie jak poprzednio w nazwach możemy używać małych liter, wielkich liter i cyfr.

Kolejne dwie metody to tak zwane konstruktory. Zauważ, że ich definicje są specjalne – nie mają typu zwracanego. Konstruktor służy, jak sama nazwa wskazuje, do tworzenia nowych instancji klasy. Każda klasa musi mieć konstruktor. Konstruktory to specjalne metody, które inicjalizują instancje klas.

Konstruktury wywołujemy dokładnie tak samo jak inne metody, dodatkowo używamy słowa kluczowego new:

Pierwszy konstruktor to konstruktor bezparametrowy. Kolejny przyjmuje argument size i noCogs ale to dla Ciebie nic nowego, o argumentach wiesz wszystko z artykułu o metodach w języku Java. Nowością tutaj jest ciało konstruktora.

Obie linie przypisują wartość do atrybutu klasy. Pierwsza zawiera dodatkowe słowo kluczowe this aby odróżnić parametr size od atrybutu size. W następnej linii widzisz, że this nie jest wymagane jeśli jednoznacznie jesteśmy w stanie zidentyfikować atrybut.

Generowanie konstruktorów

IDE może nam pomóc przy pisaniu konstruktorów. Po naciśnięciu znanego już skrótu <Alt + Insert> w edytorze klasy pokaże się takie okienko.

kurs_java_2_konstruktor

W kolejnym można wybrać atrybuty klasy, które mają być przekazywane jako parametry.

kurs_java_2_Konstruktor domyślny

Zauważ, że w poprzednim przykładzie klasy Cogwheel nie umieściłem definicji żadnego konstruktora. Kilka akapitów wcześniej napisałem, że każda klasa musi mieć konstruktor. Więc jak to właściwie jest z tym konstruktorem? Otóż kompilator tworzy domyślny konstruktor automatycznie jeśli nie zdefiniujemy żadnego innego konstruktora.

Jeśli utworzysz jakikolwiek inny konstruktor przyjmujący parametry kompilator nie doda domyślnego, bezparametrowego konstruktora.

Kolejny przykład klasy

Poniżej już troszkę bardziej skomplikowany przykład. Proszę przeczytaj poniższy fragment kodu.

Poza używaniem typów, które już znasz, możesz używać już istniejących klas. Właśnie w ten sposób klasa Engine ma atrybut typu Cogwheel. Zwróć uwagę, że klasa Engine znajduje się w innym pakiecie niż klasa Cogwheel. Kompilator musi wiedzieć gdzie szukać tej klasy, właśnie z tego powodu dodajemy linijkę importującą tą klasę:

Deklaracja importu to coś cupełnie innego niż deklaracja pakietu, importów w klasie może być wiele (możemy korzystać z wielu innych klas), natomiast nasza klasa może być wyłącznie w jednym pakiecie.

Jeśli importujemy wiele klas z jednego pakietu zamiast wypisywać je wszystkie możemy użyć * np import pl.samouczekprogramisty.kursjava.engine.*;

Tutaj przychodzi z pomocą IDE. Okazuje się, że programista używający IDE nie musi pisać tych linii, IDE dodaje te linijki automatycznie. IDE także pomaga przy pisaniu samego kodu. W trakcie pisania zobaczysz menu kontekstowe podpowiadające programiście fragmenty kodu. Skrótami klawiaturowymi, które jeszcze mogą przy tym pomóc są <Ctrl + Space> i <Ctrl + Shift + Space>. Oba z nich pomagają programiście, drugi jest bardziej „inteligenty” podpowiadając wyłącznie kod, który jest poprawny w danym kontekście.

kurs_java_2_podpowiadanie

Metody nie zwracające żadnej wartości

Zwróćmy jeszcze uwagę na metodę

Nowe dla Ciebie jest słowo kluczowe void w miejscu typu zwracanego. To słowo kluczowe informuje, że dana metoda nie zwraca żadnej wartości. W ciele tej metody do atrybutu started przypisujemy wartość zwróconą przez metodę initiateStartingSequence.

Słowo kluczowe this

Proszę zwróć uwagę na dwa poniższe fragmenty kodu:

W pierwszym przypadku w konstruktorze zostało użyte słowo kluczowe this. Było ono potrzebne aby kompilator był w stanie odróżnić parametr cogwheel od atrybutu klasy cogwheel. W drugim przypadku słowo to nie było konieczne ponieważ w tym kontekście od razu wiadomo czym jest cogwheel – jest atrybutem klasy. Oba konstruktory robią dokładnie to samo, przypisują wartość parametru to atrybutu nowej instancji.

Gettery i settery

Znasz już 2 modyfikatory dostępu, private i public. Wiesz też, że atrybuty, metody które poprzedzone są modyfikatorem private są dostępne wyłącznie w danej klasie. Jak więc z zewnątrz można dowiedzieć się jaka jest wartość atrybutu started w instancji klasy Engine? Z pomocą przychodzą tak zwane „gettery” i „settery”. Jest to nic innego jak specyficzne metody, których jedynym zadaniem jest odpowiednio pobranie bądź ustawienie wartości atrybutu. Poniżej przykłady:

Gettery i settery to metody, których nazwy są określone przez specyfikację Java Beans. W skrócie:

  • metody pobierające wartość atrybutu mają nazwę get<nazwa atrybutu> typ zwracany odpowiada typowi atrybutu. Metoda nie przyjmuje żadnego parametru. Specyfikacja dopuszcza pewien wyjątek w nazwie jeśli atrybut jest typu boolean. W takim przypadku możemy użyć nazwy is<nazwa atrybutu>, reszta pozostaje bez zmian.

  • metoda ustawiająca wartość atrybutu. Nową wartością jest parametr przekazany do tej metody. Nazwa metody musi pasować do wzorca set<nazwa atrybutu>. Metoda musi przyjmować jeden parametr odpowiadający typowi atrybutu i nie może zwracać żadnej wartości.

Generowanie getterów setterów

Podobnie jak w przypadku generowania konstruktorów IDE pomaga w generowaniu getterów/setterów. W edytorze pomaga przy tym skrót <Alt + Enter> naciśnięty gdy kursor znajduje się na nazwie atrybutu.

kurs_java_2_parametry_konstruktora

Metody te można także wygenerować przy pomocy skrótu <Alt + Insert> naciśniętego w edytorze i wybraniu opcji „Getter and Setter”.

kurs_java_2_getter_setter

Ćwiczenie

Najwyższy czas na Twoje ćwiczenie. W ramach ćwiczenia utwórz nowy projekt, w nim utwórz 2 różne pakiety. W pakietach utwórz klasy odpowiadające kilku rodzajom zwierząt wraz z kilkoma atrybutami. Postaraj się używać przy tym poznanych dzisiaj skrótów. Jeśli chcesz, możesz spojrzeć na przykładowe rozwiązanie, które umieściłem na githubie.

Podsumowanie

Bardzo się cieszę, że doczytałeś do tego miejsca! Jak poszło Ci z ćwiczeniem? Proszę daj znać w komentarzach. Jeśli podobają Ci się artykuły na blogu byłbym bardzo wdzięczny gdybyś polecił bloga swoim znajomym. Jak już powtarzałem – w grupie łatwiej się uczy 🙂 Polub stronę na facebooku a nie przegapisz żadnego nowego artykułu. Do zobaczenia!

Newsletter

  Jeśli chcesz otrzymywać informacje o nowych artykułach na blogu prosto na Twój email, zapisz się 🙂

  1. Jeśli nie umieścisz żadnej deklaracji pakietu dany typ (klasa, interfejs etc.) zostanie umieszczony w domyślnym, pustym pakiecie.
  2. Taka notacja oznacza jednoczesne naciśnięcie dwóch klawiszy, w tym przypadku jest to Alt i 1

14 Komentarze

  1. MRT napisał(a):

    Świetny kurs javy, choć tłumaczony bardzo dla zielonych, mógłbyś polecić coś dla bardziej doświadczonych w programowaniu (znam obiektowego C++ i dużo w nim pisałem ), a chciałbym się nauczyć javy i czytajać jakiś kurs nie chce mi się przebijać monotonnie przez tłumaczenie paradygmatu obiektowego.

    • Marcin Pietraszek napisał(a):

      Po pierwsze bardzo miło mi to słyszeć 🙂 Jeśli masz jakiekolwiek uwagi proszę daj znać – z chęcią uzupełnię/poprawię artykuły. Dotyczy to też nowych tematów – jeśli coś szczególnie Cię interesuje z chęcią dopiszę artykuł.

      A wracając do Twojego pytania. Myślę, że miałbym coś dla Ciebie. Aktualnie prowadzę darmowy „indywidualny” kurs dla jednego z czytelników. Zdzwaniamy się dwa razy w tygodniu, całość polega na pisaniu drobnego projektu: https://github.com/SamouczekProgramisty/Rescuer. Jeśli byłbyś zainteresowany, daj znać mailem/na fb.

  2. Zosia napisał(a):

    Ja jestem z tych całkowicie zielonych. Muszę przyznać, że Twój kurs jest dla mnie najbardziej zjadliwy ze wszystkich na jakie do tej pory natrafiłam. Wszystko jest dla mnie całkowitą nowością i trochę wysiłku zajmuje mi ogarnięcie tych podstaw. Nawet mam problem jeśli chodzi o samego intelliJ. Nie wiem, jak uruchomić okienko w którym pisze się kody. Co prawda radzę sobie w Eclipse, ale czy mógłbyś coś niecoś o samym intelliJ ? 🙂

    • Marcin Pietraszek napisał(a):

      Cześć! Na początku chciałem się skupić na podstawach Javy, ale artykuł o InteliJ dopiszę do kolejki – dzięki za uwagę 🙂

      Na początek mogę polecić Ci prezentację InteliJ nagraną przez firmę, która produkuje to IDE:

      . Ponadto przygotowali oni całą masę innych tutoriali pomagających początkującym, proszę rzuć na nie okiem:

      No i na koniec – nie zrażaj się. Na początku jest dużo nowości ale jak przez to przejdziesz to później jest łatwiej. Do następnego razu!

      • Zosia napisał(a):

        O! Dzięki wielkie, to na pewno pomoże 🙂 Tak zrazić się łatwo, bo początki są straszne :/ Dzięki za wsparcie, pozdrawiam!

  3. Uzytkownik napisał(a):

    [OFFTOPIC]
    Czy myślał Pan o tym, żeby po najechaniu na Kurs programowania Java wyświetlało się rozwijane pionowe menu? Ułatwiło by to znacznie nawigację i powrót do poprzednich części kursu bez potrzeby otwierania kolejnej strony.

    • Marcin Pietraszek napisał(a):

      Cześć Użytkowniku! Po pierwsze to mam na imię Marcin 🙂

      Jeśli zależy Ci na przechodzeniu do następnego/poprzedniego artykułu to zawsze linki do nich są dostępne odpowiedni po prawej i lewej stronie.

      Szczerze mówiąc nie myślałem o tym, wydaje mi się że przy obecnej liczbie artykułow w kursie stałoby się to nieczytelne – menu zasłaniałoby całą stronę (a nie ukrywam, że chcę dodawać kolejne arytkuły).

      Może w „materiałąch dodatkowych” mógłbym linkować inne części kursu? Co o tym myślisz?

  4. mg napisał(a):

    Fajny kurs ale czegoś nie rozumiem. W klasie Cogwheell były stworzone dwa konstruktory Cogwheel() i Cogwheel(int, int) a w klasie Engine pojawia się cogwheel = new Cogwheel(4) czyli wywołanie konstruktora jedno argumentowego. Wg mnie to się nie ma prawa udać no i u mnie się nie kompiluje. Czy to błąd?

  5. Dagmara napisał(a):

    Po dłuższej (niezamierzonej) przerwie wróciłam do początków nauki Javy… I jako kompletny laik mam pewne wątpliwości co do zadania… Mogę prosić o uwagi?

    • Marcin Pietraszek napisał(a):

      Cześć Dagmara! Nigdy nie jest za późno na naukę programowania, lepiej zacząć późno niż wcale 🙂

      Co do uwag:

      1. Kod, który podałaś nie kompiluje się, IDE podpowiada Ci co jest nie tak – popraw te błędy kompilacji,
      2. Atrybutu przeważnie umieszczamy na początku klasy – w klasie Mosquito masz je „pomieszane z metodami
      3. Jak zauważyłaś protected jest słowem kluczowym i jego używanie jako nazwy nie jest dozwolone, ochodzenie tego przez umieszczanie wielkie litery wewnątrz nie jest dobrym rozwiązaniem, zastanów się nad inną nazwą (często przy zmiennych typu boolean dodaje się is na początku – w tym przypadku isProtected)
  6. Dominika napisał(a):

    Cześć 🙂 Na początek- bardzo fajny kurs. Chyba czeka mnie zarwana noc 🙂 Jestem niestety bardzo początkująca, więc czy mogłabym prosić o wyjaśnienie dwóch kwestii?
    1.

    Czy to należy rozumieć tak, że tutaj konstruktor klasy Engine jako parametr przyjmuje inny obiekt (klasy Cogwheel)?

    2.

    Jak tutaj rozumieć parametr noCogs? Jak jest użyty?
    Z góry dziękuję za podpowiedź.

    • Marcin Pietraszek napisał(a):

      Cześć Dominika 🙂

      1. Tak, jest dokładnie tak jak mówisz – kontstruktor Engine jako parametr dostaje instancję Cogwheel.
      2. Słuszna uwaga, poprawię. W tym momencie parametr nie jest wykorzystywany, powinno być numberOfCogs = noCogs.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *