#01 – wstęp do obiektów w Javie

By 14 sierpnia 2014Kurs Javy
Wstep do obiektów - header

Dzisiejsza lekcja poświęcona będzie w całości obiektom w języku Java. Nauczymy się tworzyć obiekty, definiować ich metody, pola, używać ich, a także poznamy kilka zasad z nimi związanych.

Na tę chwilę nie będziemy wprowadzać pojęcia dziedziczenia. Wprawdzie jest to elementarna cecha programowania obiektowego, ale jej praktyczne zastosowanie znajdziemy dopiero w kolejnych lekcjach. Na ten moment należy wiedzieć tylko, że ta lekcja to nie wszystko, co mamy do powiedzenia o obiektach.

Zastrzeżenie

Niektóre elementy przedstawione w tej lekcji nie są zgodne ze sztuką – np. konwencja sugeruje nazywanie obiektów od angielskich nazw. Celowo korzystamy z polskich nazw aby ułatwić zrozumienie przykładów. Warto jednak mieć na uwadze, że nie jest to postrzegane jako dobra praktyka. W przyszłości pojawi się lekcja w całości poświęcona dobrym praktykom, konwencjom itp. Na  razie należy zapamiętać, że tworząc projekt komercyjny nazwy klas (i pól oraz metod) tworzymy od angielskich nazw w liczbie pojedynczej.

Lekcja

Dzisiejsza lekcja będzie poświęcona obiektom. Przed przystąpieniem do niej, upewnij się że znasz różnice pomiędzy klasą a obiektem i rozumiesz, czym jest obiekt, pole oraz metoda (o tym była lekcja #0)

Obiekty

Aby utworzyć obiekt w jezyku Java potrzebujemy znać nazwę klasy oraz pakiet (może być domyślny, ale będziemy korzystali z innego). Aby utworzyć pierwszą klasę skorzystamy z kreatora dostępnego w Eclipse, a następnie przeanalizujemy wygenerowany kod.

Krok pierwszy – tworzymy nowy projekt

Ten krok został opisany na stronie jak przygotować środowisko. Jeśli jeszcze go nie przeczytałeś, zrób to teraz.

Krok drugi – tworzymy nową klasę

W menu górnym wybieramy New -> Class lub klikamy na ikonkę download znajdującą się na górnej belce. Pojawi się okno jak poniżej:

Dodawanie nowej klasy w środowisku Eclipse

Dodawanie nowej klasy w środowisku Eclipse

Krok trzeci – analizujemy kod

Jak zauważymy, kod który został wygenerowany wygląda mniej więcej tak jak poniżej:


package pl.kobietydokodu.bazakotow.model; 

public class Kot {

}

Pierwsza linijka to deklaracja pakietu. Pakiet, tak jak było wspomniane w poprzedniej lekcji to sposób na grupowanie klas w naszym projekcie. Najczęściej grupujemy je wg funkcji, np. wszystkie klasy dotyczące wybranego wycinka rzeczywistości w pakiecie xxx.model, klasy, które zawierają logikę biznesową w pakiecie xxx.services itp.

Główny człon nazwy pakietu najczęściej jest niezmienny dla aplikacji i tworzymy go przepisując naszą domenę internetową od końca i dodając nazwę aplikacji. Przykładowo, nasza domena to kobietydokodu.pl, a aplikacja którą tworzymy to baza kotów. Oczywiście nie możemy stosować polskich znaków, nazwa pakietu nie może zawierać też odstępów czy znaków specjalnych (więcej informacji znajdziesz pod odnośnikiem numer 4 w sekcji dodatkowe informacje). Odwracamy najpierw nazwę domeny otrzymując pl.kobietydokodu (oczywiście, nie musi to być rzeczywista nazwa – jeśli nie posiadasz domeny możesz ją ‚wymyśleć’, np używając pl.imienazwisko jako początek nazwy pakietu). Następnie doklejamy nazwę aplikacji usuwając polskie znaki, spacje i ogonki, przez co otrzymujemy pl.kobietydokodu.bazakotow . To nasz podstawowy pakiet dla aplikacji, dodajemy do niego sufiksy w zależności od potrzeb.

Spójne nazewnictwo pakietów oraz ich dzielenie jest też ważne z innych powodów – w przyszłości wykorzystamy pakiety żeby automatyzować niektóre czynności i ułatwić sobie pracę. Wprawdzie nic nie stoi na przeszkodzie żeby używać domyślnego pakietu lub trzymać wszystkie klasy w jednym pakiecie, to nie jest to dobra praktyka i nie należy tego robić poza wyjątkowymi sytuacjami.

Pola

Tak jak uczyliśmy się wcześniej, pola to sposób na przechowywanie pojedynczej informacji o obiekcie. Ponieważ Java jest językiem statycznie typowanym musimy od razu powiedzieć jakiego typu jest to informacja, tzn. jakiego typu dane chcemy przechowywać (zainteresowanych, czym dokładnie jest statyczne typowanie i z czym to się wiąże odsyłam do Wikipedii). Tzw. deklaracja pola składa się z czterech elementów:

  1. klasyfikator dostępu – klasyfikatorom dostępu poświęcona będzie osobna lekcja w przyszłości, ten element jest opcjonalny
  2. typ pola – element wymagany; nazwa klasy (np. String czy Integer) lub określenie prymitywu (np. int, long) – poza wyjątkowymi przypadkami będziemy używać w tym miejscu wyłącznie nazw klas i jest to zalecana praktyka
  3. nazwa pola – element wymagany; nazwa, pod którą dane pole będzie dla nas dostępne
  4. wartość domyślna – element opcjonalny, możemy od razu przypisać wartość domyślną polu (czasem nosi to nazwę inicjowania pola); przypisanie wartości domyślnej wymaga napisania znaku równości i podaniu wartości

przykładowa deklaracja pola wygląda następująco:

String imie;

Mamy więc brak klasyfikatora dostępu (jest on w tym wypadku domyślny, ale będziemy się o tym uczyć), mamy typ danych (String) oraz nazwę pola – imie. Linię kończymy średnikiem – jest to wymagane w języku Java, aby każde polecenie kończyło się średnikiem. Dzięki temu komputer wie, gdzie kończy się jedno polecenie, a zaczyna następne.

Dla porównania weźmy np taką deklarację:

String imie = "nie mam imienia";

Ta deklaracja różni się od wcześniejszej tym, że dodaliśmy wartość domyślną (zainicjowaliśmy pole). Jeśli nie przypiszemy nowej wartości do tego pola, to będzie ono miało wartość „nie mam imienia”. Zwróć uwagę, że ciąg znaków umieściliśmy pomiędzy cudzysłowami. W języku Java cudzysłowów używamy właśnie do tego – żeby powiedzieć komputerowi że to jest ciąg znaków, a nie jakieś polecenie.

Poniższa tabelka przedstawia klasy w Javie, które możemy użyć do przechowywania konkretnych rodzajów informacji (to oczywiście zestawienie bardzo uproszczone i absolutnie nie jest kompletne – często istnieje sytuacja, w której potrzebujemy bardziej rozbudowanych funkcjonalności niż te oferowane przez sam język Java np. w zakresie dat, w takich przypadkach mamy do wyboru wiele zewnętrznych bibliotek).

Rodzaj informacji Przykładowa deklaracja Uwagi
Ciąg znaków  String imie = „Ania”;
Liczba całkowita  Integer wiek = 15; Są klasy, które moga przechowywać większe i mniejsze liczby, np. Short, Long, Byte itp
Liczba z częścią ułamkową  Float waga = 10.0;  Także są klasy które mogą przechowywać dokładniejsze liczby lub inaczej je przechowywać, np. Double czy BigDecimal.
Data / czas  Date teraz = new Date();  Ponieważ ta klasa nie jest w pakiecie java.lang musimy dodać tzw. import – przed ‚class XXX’ wpisujemy:
import java.util.Date;Alternatywnie IDE podkreśli na czerwono deklaracje, po najechaniu myszką będziemy mieli dostępne opcje, w tym m.in. ‚Import java.util.Date’
Flaga (prawda/fałsz)  Boolean aktywny = true;

Metody

Metody klas to sposób na wykonywanie jakichś operacji, tzw. logiki biznesowej. To, co możemy zrobić w metodach to np. odczyt pól, zapis do nich, wywołanie metod innych klas czy sprawdzenie pewnych warunków lub wykonanie pewnej operacji wiele razy. Słowem: możemy zaprogramować dowolny algorytm (czyli sposób postępowania).

Deklaracja metody jest bardziej złożona, przeanalizujmy ją na przykładzie:

public String powiedzCos(String coPowiedziec) {
    return "Mówię: " + coPowiedziec;
}

Podobnie jak w przypadku pól, zaczynamy od klasyfikatora dostępu, który jest opcjonalny. Następnie mamy typ danych – w tym wypadku nie jest to jednak typ informacji, którą przechowujemy (bo nie przechowujemy w metodach żadnych informacji), ale typ informacji którą metoda zwraca. Weźmy dla przykładu metodę obliczPodatek(Integer kosztZakupu); Metoda taka powinna ‚odpowiedzieć’ – zwrócić do miejsca, w którym ją wywołano obliczony podatek. To jest właśnie typ zwracany metody. Jeśli metoda nic nie zwraca (np. służy tylko do zapisywania jakiejś informacji), używamy słowa kluczowego ‚void’ zamiast typu. Na przykład:

public void zapiszDane(String dane) {
    // tutaj coś zapisujemy
}

Widzimy kolejny nowy element języka – komentarze :) dwa ukośniki bez odstępu powodują, że wszystko co jest za nimi do końca linii jest traktowane jako komentarz. Jeśli chcemy napisać komentarz na wiele linijek, możemy użyć konstrukcji: /* komentarz */, np tak jak poniżej:

public void zapiszDane(String dane) {
    /* to
    jest
    komentarz na kilka linii */
}

Następnie mamy nazwę metody – obowiązują tutaj podobne zasady, jak w przypadku nazw pól, szczegółowo będziemy je poznawać w jednej z kolejnych lekcji, natomiast na tą chwilę należy pamiętać, że nie używamy polskich znaków, odstępów i znaków specjalnych. Możemy używać cyfr, pod warunkiem że pierwszym znakiem nazwy jest litera.

Po nazwie w nawiasach zwykłych mamy tzw. argumenty – może być ich zero lub więcej. Każdy argument deklarujemy podając typ oraz nazwę. W przypadku argumentów nie podajemy klasyfikatorów dostępu. Argumenty to sposób na przekazywanie informacji do metody.

Kolejnym elementem jest tzw. ciało metody, które rozpoczynamy otwierającym nawiasem klamrowym i kończymy analogicznie, zamykającym nawiasem klamrowym. W ciele metody możemy pisać polecenia (pamiętając, żeby każde z nich kończyć średnikiem) które składają się na nasz program.

Jednym z poleceń, które możemy napisać jest return X; Powoduje to wyjście z metody i zwrócenie wyniku. X to coś, co zwracamy z metody – musi być takiego typu jak zadeklarowaliśmy przed nazwą metody (chyba że metoda zwraca typ void, wtedy wystarczy użyć: return; , aby zakończyć działanie metody i wrócić do miejsca, gdzie metoda została uruchomiona).

Wracając do naszego przykładu:

public String powiedzCos(String coPowiedziec) {
    return "Mówię: " + coPowiedziec;
}

Metoda ta jest publiczna (o tym będziemy jeszcze się uczyli), zwraca ciąg znaków (String), nazywa się powiedzCos i ma jeden argument (także ciąg znaków, który nazwaliśmy coPowiedziec). Ciało metody zwraca to, co podaliśmy jako argument poprzedzone frazą „Mówię:”. Poznajemy zarazem kolejny element języka – tzw. operator dodawania oraz konkatenacji (łączenia) ciągów. Pozwala on połączyć ze sobą dwa ciągi znaków w jeden.

Powyższa metoda wywołana np. w następujący sposób:

String coPowiedzial = powiedzCos("lubię programować");

Spowoduje, że w zmiennej (o zmiennych także powiemy sobie więcej w przyszłości) coPowiedzial będziemy mieli zapisaną wartość, którą zwróciła metoda powiedzCos z argumentem „lubię programować”. Na podstawie naszej wiedzy o działaniu tej metody, wiemy, że będzie to „Mówię: lubię programować”.

To, co musimy jeszcze wiedzieć to to, że wywoływanie metod można zagnieżdżać, tj. przekazać wynik wykonania jednej metody jako argument drugiej. Np. aby wypisać na konsolę zawartość pola imię, możemy w jakiejś metodzie użyć konstrukcji:

System.out.println(this.getImie());

Jest to (funkcjonalnie) równoważne poniższemu fragmentowi:

String imie = this.getImie();
System.out.println(imie);

Metody specjalne

W Javie istnieje kilka nazw metod, które mają specjalne znaczenie. Dokładnie omówienie tych metod pojawi eis przy okazji kolejnych lekcji, natomiast na tą chwilę zapoznamy się z tzw. getterami i setterami.

Gettery i settery to metody, które pozwalają odpowiednio pobierać i zapisywać wartość pól klasy. Dobrą praktyką jest używanie tylko metod innych klas, a nie bezpośrednio ich pól. Tak zbudowane klasy to tzw. Beany – czyli klasy które swoje pola udostępniają tylko za pośrednictwem metod. Zalety takiego podejścia będziemy omawiać w kolejnych lekcjach.

Przykładowy getter wygląda następująco:

public String getImie() {
    return this.imie;
}

natomiast setter:

public void setImie(String imie) {
    this.imie = imie;
}

Na szczęście IDE ułatwia nam zadanie i pozwala automatycznie generować takie metody. Aby to zrobić, wystarczy umieścić kursor na nazwie pola, kliknąć prawym przyciskiem myszki i wybrać opcję Source -> Generate getters and setters (wtedy możemy zrobić to automatycznie dla wielu pól jednocześnie).

Inicjowanie obiektów, this

Mając już stworzoną klasę i jej metody, możemy ją teraz zainicjować, tzn. utworzyć obiekt, który będzie tego typu. Tworzenie obiektu odbywa się poprzez wywołanie specjalnej metody, zwanej konstruktorem (możemy to zrobić np. w metodzie main naszej klasy), np:

Kot kot = new Kot();

W tej linijce robimy trzy rzeczy: deklarujemy zmienną typu Kot o nazwie kot a także tworzymy nowy obiekt ( „new Kot()” ) oraz przypisujemy go do zdeklarowanej zmiennej (używając znaku równości).

Co prawda przypisanie obiektu do zmiennej nie jest konieczne, aby go utworzyć, ale w przeciwnym wypadku mielibyśmy problem, aby cokolwiek z tym obiektem dalej zrobić.

Konstruktory

Konstruktory są specjalnymi metodami – można je wywołać tylko raz dla jednego obiektu, podczas jego tworzenia. Kolejne wywołanie konstruktora spowoduje utworzenie nowego obiektu. Konstruktory innych klas można wywoływać tylko i wyłacznie poprzedzając je słowem new – jest to informacja dla Javy, że chcemy utworzyć nowy obiekt.

Konstruktory deklarujemy prawie identycznie, jak normalne metody – za wyjątkiem tego, że niemożna opisać typu zwracanego, a nazwa metody musi być identyczna jak nazwa klasy. W naszym przypadku byłoby to np:

public Kot() {
    // jakieś operacje
}

Powyższy konstruktor to przykład tzw. konstruktora bezargumentowego – takiego, który nie przyjmuje argumentów. Konstruktory mogą przyjmować dowolną ilość argumentów dowolnego typu i wykonywać dowolne operacje – ale przeważnie używamy ich do przekazania pewnych danych do obiektu (argumenty konstruktora pokrywają się wtedy z polami zdefiniowanymi w klasie). Klasa może też mieć wiele konstruktorów, które muszą różnić się przyjmowanymi argumentami. Wewnątrz konstruktorów można wywoływać inne konstruktory tej samej klasy podobnie jak metody, używając jednak zamiast ich nazwy this().

Zastanawiasz się pewnie co się dzieję, jeśli nie zdefiniujemy żadnych konstruktorów. W takiej sytuacji Java sama dodaje tzw. konstruktor domyślny – czyli publiczny konstruktor bezargumentowy, który nie wykonuje żadnej operacji. Co ważne, jeśli zdefiniujemy choć jeden własny konstruktor, domyślny nie zostanie utworzony.

Słówko kluczowe this

Słowo to ma specjalne znaczenie w Javie – w dużym skrócie pozwala ono na odwoływanie się do ‚siebie samego’. Pozwala to na odwołanie się do pól i metod w sposób bezpośredni i czytelny. Słówko this nie jest stricte niezbędne – w wielu przypadkach możemy je pominąć, ale zwiększa czytelność i w przypadku, kiedy zmienne lokalne lub argumenty mają taką samą nazwę jak pola naszej klasy, pozwala uniknąć konfliktów. Pozwala też odwoływać się do innych konstruktorów. Zobaczmy na poniższy przykład:

public class KotZKonstruktorami {

    String imie;

    public KotZKonstruktorami() {
        //konstruktor bezargumentowy
    }

    public KotZKonstruktorami(String imie) {
        this(); //tutaj wywołujemy konstruktor bezargumentowy tej samej klasy tak, jakby była to metoda
        this.imie = imie; //przypisujemy polu imie wartość zmiennej imie
        imie = imie; //błąd - przypisujemy nie do pola obiektu imie, ale do zmiennej o tej nazwie
        // ponieważ przypisujemy wartość zmiennej imie realnie nic się nie dzieje w linijce powyżej
    }
}

Jak sama widzisz, nie zawsze da się uniknąć korzystania ze słówka kluczowego this. Dobrą praktyką jest jednak stosowanie go także tam, gdzie nie ma takiego wymogu – dzięki temu jasno wskazujemy, że chodzi nam o pole kasy a nie o zmienną, co zwiększa czytelność kodu.

Zadanie

Utwórz klasę Kot . Klasa ta powinna mieć następujące pola:

  • imię (ciąg znaków)
  • data urodzenia (data)
  • waga (liczba zmiennoprzecinkowa)
  • imię opiekuna (ciąg znaków)

Klasa ta powinna też mieć jedną metodę o nazwie przedstawSie. Metoda ta nie przyjmuje żadnych argumentów i zwraca ciąg znaków który jest zdaniem zawierającym imię kotka, jego datę urodzenia, wagę oraz imię opiekuna.

Podpowiedzi

Aby pokazać podpowiedzi, kliknij link poniżej. 

pokaż podpowiedź »

  • ciąg znaków to typ String
  • do przechowywania daty używamy klasy java.util.Date
    • pamiętajmy, żeby dodać tą klasę jako import – IDE prawdopodobnie zrobi to za nas
  • do przechowywania liczb zmiennoprzecinkowych używamy typu Float

Jeżeli masz problem z zadaniem z lekcji i nie wiesz, jak go rozwiązać, to sprawdź, jak sobie radzić - przeczytaj o szukaniu rozwiązań problemów z kodem.

Rozwiązanie

Przeglądaj kodPobierz ZIP

Rozwiązania do lekcji są dostępne w serwisie GitHub - użyj przycisków po prawej aby pobrać lub przejrzeć kod do tej lekcji. Jeśli masz wątpliwości, jak posługiwać się Git’em, instrukcje i linki znajdziesz w naszym wpisie na temat Git’a.

Licencja Creative Commons

Jeśli uważasz powyższą lekcję za przydatną, mamy małą prośbę: polub nasz fanpage. Dzięki temu będziesz zawsze na bieżąco z nowymi treściami na blogu ( i oczywiście, z nowymi częściami kursu Javy). Dzięki!

3

  •  
  •  
  •  
  •  
  •  
  • maga

    po stworzeniu identycznej klasy jak w rozwiązaniu projekt powinien się skompilować?

    • Tak, projekt powinien się kompilować i działać. Czy występuje jakiś błąd konkretny? Z przyjemnością pomożemy go rozwiązać :)

      • Gosia

        Hej! Stworzyłam identyczną klasę jak w rozwiązaniu ale gdy próbuje ją uruchchomić dostaje komunikat: the selection did not contain anything that can be run on a server.

        Jak daję prawym przyciskiem myszy na klasę to nie mam opcji Run As Java Application..

        • Klasa będąca rozwiązaniem tego zadania kompiluje się, ale nie uruchamia – sam fakt, że klasa się kompiluje oznacza tylko tyle, że Eclipse nie będzie zaznaczał nic na czerwono (czyli jest poprawna pod względem kodu). Aby umożliwić uruchamianie klasy potrzebne są dodatkowe kroki – opisane są w dodatku do tej lekcji, który znajdziesz tutaj: http://kobietydokodu.pl/01-1-uruchamianie-aplikacji-w-eclipse/

          Jeśli po lekturze lekcji i wykonaniu opisanych tam kroków nadal będą problemy, daj znać, znajdziemy rozwiązanie :)
          Póki co nie możesz uruchomić swojej klasy, bo Java nie wie co z nią zrobić – jak dokładnie ją uruchomić.

  • Aga

    A ja mam pytanie odnośnie tworzenia nowego projektu.. Utworzyłam new Maven Project, piszę kod, ale nie wiem jak go później uruchomić. Po wybraniu Run as -> Maven build wyświetla się jakieś okno z edycją konfiguracji i tu się zatrzymuję. Umiem uruchamiać normalne Java projects, ale przy tym się po prostu gubię. Czy normalnie mogę robić wszystko, to co Wy w dalszych lekcjach, ale bez wykorzystania mavena? Bo takie problemy na starcie są strasznie demotywujące, a nie bardzo rozumiem dalej w czym on mi pomaga.. :)

    • Aga

      Ok, następna lekcja mówi, że mam się nie przejmować mavenem póki co i normalnie uruchamiać jak normalny projekt, można usunąć komentarz :>

      • Mavenem zajmiemy się w lekcji #7 – wtedy zapraszam też do zapoznania się z opublikowaną dzisiaj lekcją #7.1 o tym, jak korzystać z Mavena z wykorzystaniem Eclipse :)

  • 1. W instrukcji do zadania jest stworzyć JEDNĄ metodę o nazwie przed­stawSie. Tymczasem w rozwiązaniu:
    – nie ma tej metody
    – są za to getters i setters, których zadanie nie kazało stworzyć

    2. Nie lepiej było odpowiedź do ściągnięcia podać jako JEDEN plik .java . Tak to muszę ściągać cały folder, unzippować go, przeszukiwać wszystkie foldery aby znaleźć plik .java. Bardzo kłopotliwe i czasochłonne.

    • Faktycznie, brakowało tej metody, już poprawiliśmy i podmieniliśmy rozwiązanie, dzięki za zwrócenie uwagi! Pozostałe metody to tzw. gettery i settery – pozwalają innym obiektom pobierać wartość danego pola i ją zapisywać. W treści zadania ich nie ma i faktycznie na ten moment nie są wymagane, ale będziemy z nich korzystali w przyszłości.

      Jeśli chodzi o odpowiedź – założyliśmy, że wszystkie odpowiedzi będziemy umieszczać jako projekty Eclipse, gotowe do zaimportowania. Zamiast przechodzić przez wszystkie foldery, możesz po prostu wybrać opcję File -> Import w Eclipse i zaimportować całe rozwiązanie. Powodem takiego podejścia jest to, że czasem zła lokalizacja pliku uniemożliwia jego uruchomienie – dlatego zamieszczamy kompletne projekty Eclipse, gotowe do zaimportowania.

      • //dzięki za zwrócenie uwagi!
        Jestem nauczycielem i pracuję z dziećmi, a ucząc ich czegoś muszę (chcę raczej) być bardzo precyzyjny, więc będę się czepiał coś czasem.(Zboczenie zawodowe :-))

        Na ten moment jestem na 350 stronie Java How To Program 10th edition i biorę się za Wasz kurs, aby trochę szybciej przejść do bardziej praktycznej strony, jak choćby taki Spring czy Maven, o których do tej pory książka się nie zająknęła.

        // możesz po prostu wybrać opcję File -> Import w Eclipse i //zaimportować całe rozwiązanie

        Dokładniej to chyba File / Import / General / File System / next, tak?
        Tam mam ten Wasz folder z rozwiażaniem do jakiegoś gotowego folderu załadować (Into folder:).
        Ale jakiego?

        Rozumiem, że powinienem wcześniej utworzyć projekt Maven i to w nim wyląduje.
        Tam z kolei chcą bym wpisał Group Id i Artifact ID.
        Group Id to będzie pl.kobietydokodu, tak?
        A Artifact ID?

        Może to Wam wydaje sie oczywiste, ale niestety dla mnie te „grzebania” instalacyjne,
        to większa trudność niż te 350 stron które już przebrnąłem z książką. :-)

        I jeszcze jedna wątpliwość. W rozwiązaniu widzę:
        package pl.kobietydokodu.koty.domain;

        a w odcinku #01.1 jest
        package pl.kobietydokodu

        Ale to ma tak być, tak?

        • Jak tam? Znajdziecie moment by mi odpowiedzieć? Jak nie macie czasu, to dajcie znać – wtedy będę jakoś metodą prób i błędów eksperymentował, by posuwać się do przodu. :-)

        • Cześć,

          przepraszamy za zwłokę. Jeśli chodzi o import rozwiązań – nasze rozwiązania są jako projekty Maven dla uproszczenia (mimo tego, że na początku nie korzystamy z Mavena). File -> Import -> Maven -> Maven project. Jak wskażesz mu katalog, w którym są wypakowane pliki, Eclipse sam załatwi reszte.

          W kwestii groupid i artifactId, możesz zajrzeć do lekcji 7 (http://kobietydokodu.pl/7-maven-i-tajemnice-pliku-pom-xml/), tam jest wyjaśnione co to za pola i jakie wartości powinny mieć (rozdział ‚pom.xml’). Szybka odpowiedź: możesz tam wpisać dowolne wartości

          Pakiety to tylko grupowanie plików – rozwiązania do zadań nie są bezpośrednio przepisane ze screenów. To, jaki pakiet wpiszesz u góry zmieni jedynie to, jaką deklarację import …. będziesz musiał dodać w innych plikach (to uproszczenie, ale w naszym przypadku tak to będzie działało). Ponieważ Eclipse robi to za Ciebie najczęściej, nie ma dużego znaczenia, jaki pakiet tam wpiszesz

          Pozdrawiamy!

          • Damian Nowak

            Ta instrukcja jak załadować odpowiedz powinna być w jakims FAQ, ja tez nie wiedzialem jak to odpalic”korzystamy z Mavena). File -> Import -> Maven -> Maven project. Jak wskażesz mu katalog, w którym są wypakowane pliki, Eclipse sam załatwi reszte.”

  • Dzięki za odpowiedź. Mam jeszcze takie 2 zapytania odnośnie tej lekcji:
    1) ” String imie = „nie mam imienia”;

    Ta deklaracja różni się od wcześniejszej tym, że dodal­iśmy wartość domyślną (zainicjowal­iśmy pole). Jeśli nie przyp­iszemy nowej wartości do tego pola, to będzie ono miało wartość “nie mam imienia”.

    Do tej pory inaczej rozumiałem wartość domyślną (default value) – jako coś, co JVM sama wstawi jeśli ja tego nie określę, czyli dla String wstawi null, dla primitywów 0, a dla boolean false. Jeśli dla wartości – nazwijmy ją roboczo „inicjacyjnej” – damy nazwę „wartość domyślna”, to jak wtedy nazwiemy te wartości które dopisuje JVM?

    2) „poza wyjątkowymi przy­pad­kami będziemy uży­wać w tym miejscu wyłącznie nazw klas i jest to zale­cana praktyka”

    Czyli Integer wiek = 15; zamiast int wiek = 15; ?
    Jaki jest powód?

    • W kursie ‚wartość domyślna’ jest z punktu widzenia aplikacji. Technicznie, inicjujemy zmienną taką a nie inną wartością. W terminologii Javy oczywiście nie jest to wartość domyślna, natomiast logicznie tak właśnie będzie się zachowywać – jeśli nie przypiszemy jej innej wartości, będzie miała tą, którą podaliśmy.

      W kwestii Integer / int powodem jest dokładnie to, o czym mówisz w punkcie wyżej – niezainicjowana zmienna, która jest prymitywem, będzie miała wartość 0. Często 0 jest potencjalnie prawidłową wartością (np. licznik, ile razy coś się zdarzyło), użycie obiektów pozwala odróżnić zero jako wartość od ‚brak wartości’. Użycie prymitywów może w ten sposób także spowodować powstanie błędu, który będzie nam bardzo trudno wychwycić.

      • A pamięci to nie obciąży za bardzo? Jak będzie baza danych z olbrzymia ilością liczb, to nie będzie to miało znaczenia, że wszystkie są Integer, a nie int? Bo domyślam się, ze jednak obiekt zajmuje więcej pamięci niż prymityw…

        • Ciekawe pytanie :) Odpowiedź brzmi – niezbyt ;) Standardowy int to 4 bajty, obiekt typu Integer to 16 bajtów (za : http://stackoverflow.com/a/258150). Zależy oczywiście, co znaczy olbrzymia ilość liczb – w systemie najczęściej nie ‚trzymamy’ w pamięci więcej niż kilkuset takich obiektów na raz (resztę trzymamy w pliku, bazie danych itp). W tym kontekście jest to różnica pomijalna. Druga rzecz to fakt, że chcąc np wypisać taką liczbę lub przekazać ją do jakiegoś API, często przyjmują one obiekty,a nie prymitywy – więc ma miejsce jawna (lub ukryta) konwersja z prymitywu na obiekt, więc mamy w sumie 20 bajtów. Natomiast dyskusja o pamięci wyrażonej w bajtach w obecnych systemach komputerowych (fizycznie mamy najczęściej ponad 2 miliardy bajtów dostępne) nie musi mieć miejsca, o ile nie projektujesz rozwiązań np. na mikrokontrolery.

          Podsumowując: jeśli różnica rozmiary pomiędzy 4 a 16 bajtów robi różnicę w systemie, nad którym pracujesz, to najprawdopodobniej wymaga on zmiany designu.

  • Dexter

    Witam, przy próbie stworzenia nowej klasy New -> Class mam puste pole Source Folder i nie mogę żadnego wybrać, przez co nie mogę stworzyć klasy. Co zrobić? Jak wybrać source folder?

  • sajmplus

    Bardzo ciekawy projekt ;) Jako developer C++ chciałem liznąć troszkę Javy jednak większość kursów mi nie odpowiadała, ten za to trafił w dziesiątkę.

    Mam kilka propozycji do usprawnienia kursu:
    1. Zwiększenie czcionki listingów – na małej matrycy z dużą rozdzielczością bez okularów nie ma szans;
    2. Otwieranie obrazów w nowym oknie/galerii – nie trzeba będzie za każdym razem cofać;
    3. Przycisk z linkiem do nasępnej części kursu

    • Super pomysły! Jak tylko znajdziemy chwilę wolnego, to postaramy się je wdrożyć, bo naprawdę pomogą w nauce. Powodzenia z nauką Javy!

  • Anna Drybulska

    Z ogromnym zapałem zabrałam się do instalacji Javy i aplikacji SpringTool postępując zgodnie z umieszczonym przez was filmikiem (strasznie nie lubię zdrobnień). Poległam, ale się podniosę :) Po uruchomieniu pliku STS.exe otrzymałam komunikat, którego się nie spodziewałam. Załączam PrtScc. Będę wdzięczna za pomoc. Miłego dnia, Ania-początkująca (żeby była jaśność)

    • Sprawdź jakie informacje są w tym pliku z logami, który wskazuje Ci komunikat i jeśli nie będą dla Ciebie zrozumiałe lub nie będziesz wiedziała jak rozwiązać problem spróbuj wyszukać rozwiązania w google, może ktoś wcześniej miał już taki problem.

  • tlen

    Super poradnik, 2 rzeczy mi rzuciły się w oczy:
    W listingu przy setterze jest this zanim zostało omówione :)

    Komentarze od listingu o this nie tłumaczą co jest celem programisty, przez co ostatni komentarz to masło maślane z którego nic nie wynika

    • Trochę przefromułowaliśmy komentarze w kodzie, dzięki!

  • Jarek

    Czy w konstruktorze przyjmującym argumenty potrzebne jest jawne wywołanie konstruktora bezargumentowego? Nie ma tu kaskady?

  • Marcin Piekarski

    czy tylko mi sie wydaje czy Java dla osoby ktora zaczyna przygode z programowaniem jest trudniejsza niz nauka C++???

    • Hm, w wielu systemach nauczania, Java jest traktowana jako podstawa, a jej obiektowość ułatwia odwzorowanie świata rzeczywistego. C++ ma sporo haczyków wymagających znajomości działania komputera. Jeśli ktoś zaczyna zupełnie od zera to proponowałam bym rozpoczęcie nauki od Pythona, który ma bardzo przyjemną składnię, która nie będzie utrudniała poznania podstawowych konceptów. Potem, wybór języka będzie raczej kwestią indywidualnego gustu ;)

  • karol p

    Witam, mam taki problem. Przepraszam od razu, bo pewnie nie ten dział na takie pytania.
    Nie wiem jak sformułować warunek.
    if (liczba1==[0-9] && liczba2==[0-9]){}
    chodzi o to by if sprawdzał czy użytkownik wpisał liczbę.

    • Monika Senderecka

      public boolean isNumber(String inputString) {
      boolean result = true;
      for (int i = 0; i < inputString.length(); i++) {
      if ('0' <= inputString.charAt(i) && inputString.charAt(i) <= '9'){
      } else {
      result = false;
      break;
      }
      }
      return result;
      }

  • Piotr

    Cześć, mam takie pytanie: w jakim formacie mam zapisać datę, aby setDataUrodzenia to przyjęła? Tworzę obiekt Kot cat = new Kot(); a następnie chcesz ustawić datę cat.setDataUrodzenia(?) co powinno być wpisanę w miejsce „?” ?

    • Jacek

      W zależności od tego jakiego typu masz pole dataUrodzenia.
      Np. cat.setDataUrodzenia(LocalDateTime dataUrodzienia){
      this.dataUrodzenia = dataUrodzenia;
      }

      • Dokładnie tak – w Javie 8 najlepszą klasą do obsługi daty urodzenia będzie LocalDate lub LocalDateTime, ale możesz też po prostu użyć klasy Date. W razie problemów, zawsze możesz zajrzeć do rozwiązania :)

  • Wiktor Kalinowski

    Witam, jestem zalamany.. Wszedlem na GitHuba znalazlem odpowiedz do pierwszego zadania. Ladnie skopiowalem i nie dziala.
    Jezeli skopiuje rozwiazanie wasze w konsoli mam napisane abym dodal „public static void main(String[] args){”
    Gdy dodaje wtedy wszystkie private klasy swieca sie, ze nie moga byc private, zmieniam na public to inne rzeczy nie dzialaja..
    Nie wiem jak to zrobic. Strasznie sie zalamalem.
    Mozna jakos podpowiedziec o co chodzi? Bo juz nie wiem sam..

    • Nie do końca wiemy o co chodzi, ale cieszymy się i gratulujemy! ;)

      • Wiktor Kalinowski

        A mialem jakis problem i nie wiedzialem o co chodzi, nie moglem usunac komentarzu wiec zmienilem tresc.

        Ogolnie to ciezko to widze wszystko ale bede sie zapierac nogami i rekami aby sie nauczyc Javy ;)
        Dziekuje za odpowiedz.

        • Życzymy zatem powodzenia i wytrwałości w nauce! Mamy nadzieję, że treści na naszym blogu okażą się dla Ciebie pomocne! ;)

  • Bartek

    Cześć! :)

    Na początku chcę Wam podziękować za Waszą chęć dzielenia się swoją wiedzą i czas poświęcony na przygotowanie tego projektu. Świetna sprawa! Jestem na początku swojej przygody z javą i cieszę się, że natrafiłem na ten kurs. :)

    Jednocześnie chcę dopytać jaka jest przyczyna tego, że nowo utworzony projekt maven’a nie jest projektem java. Podczas dodawania klasy wyskakuje error: Source folder is not a Java project. Zrobiłem wszystko tak jak było opisane przez Alexa. Wygląda to tak jakby cały 5 punkt tutoriala został pominięty.

    Pozdrawiam

    • Zakładając, że korzystasz z Eclipse – w oknie tworzenia nowej klasy, możesz wskazać katalog ze źródłami. Maven ma ściśle okresloną strukturę katalogów – i pliki Java mogą trafić albo do src/main/java albo do src/main/resources (a nie po prostu src, jak w standardowym projekcie Javy) – być może to jest przyczyną błędu. Ale ciężko nam coś doradzić bez zerknięcia w projekt, podeślij proszę spakowany jako zip albo umieść go na githubie, to będziemy w stanie powiedzieć coś więcej :)

      • Bartek

        Tak, korzystam z Eclipse.
        Plik przesłałem mailem. :)

  • radoslav_p

    Cześć ! Dziękuję za Waszą pracę i przygotowanie kursu. Mam jedną i prostą sugestię: proszę, poprawcie czytelność strony. Bez użycia Reader View w Mozilli trudno cokolwiek przeczytać na stronie. Tekst niestety zlewa się z tłem, a takie czytanie strasznie męczy. Pozdr.

    • Cześć, czy jest to kwestia bardziej koloru czcionki czy kroju/rozmiaru?
      Daj znać też proszę w jakiej rozdzielczości pracujesz – postaramy się ‚przetestować’ blog w podobnych parametrach

  • Patrycja

    Cześć! Po napisaniu projektu (sprawdzone z rozwiązaniem) po kliknięcu Run nie mam opcji Console Application, tylko jest Run as -> Run on Server. Jak moge to naprawić? :) W testowej aplikacji było dokładnie tak jak w kursie, a tutaj jest problem.

  • Aga

    Głupie pytanie na start. Gdzie znajdę to rozwiązanie? Klikam w oba przyciski powyżej i nie wiem co dalej :(

    • Po kliknięciu w przycisk pobierania na Twoim dysku pojawi się plik zip – po jego rozpakowaniu możesz zaimportować projekt do Eclipse (po uruchomieniu wybierz opcję Import -> Java project).
      Drugi link prowadzi do źródeł rozwiązania – możesz przeglądać kod rozwiązania w serwisie github.com i porównać go ze swoim kodem :)

  • Cześć,
    to wygląda jak problem z mavenem i dostępem do repozytorium. Czy korzystasz z sieci firmowej/osiedlowej? Albo łączysz się za pośrednictwem proxy? W każdej z tych opcji musisz ‚powiedzieć’ mavenowi jak może się połączyć z siecią, np w taki sposób: https://maven.apache.org/guides/mini/guide-proxies.html (aby dowiedzieć się jakie są wartości tych parametrów, jeśli ich nie znasz, poszukaj ‚check proxy settings’ w google dodając system operacyjny, którego używasz)

  • ooo

    Mam pytanie, co powinno być w metodzie main, aby uruchomić program?

  • Monika Senderecka

    Cześć, czy nazwa konstruktora nie powinna być taka sama jak nazwa klasy?

    public class KotZKonstruktorami {

    String imie;

    public Kot(String imie) {
    this(); //tutaj wywołujemy konstruktor bezargumentowy tej samej klasy tak, jakby była to metoda
    this.imie = imie; //przypisujemy polu imie wartość zmiennej imie
    imie = imie; //błąd – przypisujemy nie do pola obiektu imie, ale do zmiennej o tej nazwie
    // ponieważ przypisujemy wartość zmiennej imie realnie nic się nie dzieje w linijce powyżej
    }

    Wydaje mi się że wkradł się tu mały błąd, ale może jest to dopuszczalne przy określeniu w jakiś magiczny sposób zasięgu.

    • Oczywiście, wkradła się pomyłka. Nazwa konstruktora powinna być taka sama jak nazwa klasy – już poprawiamy! Dzięki!

  • Falcor

    Hej.
    Kurs sam w sobie jest ok, ale nie wydaje mi się, żeby był dla osób naprawdę początkujących. Staram się nauczyć Javy i kilka prostych kursów już przerobiłem. Gdyby nie one nie miałbym pojęcia o co chodzi w tej lekcji. Zwykle zaczynało się od czegoś typu „Hello world”, a tutaj od razu z grubej rury. Dla osób już trochę zorientowanych w tematyce to może i lepiej – nie muszę zaczynać wszystkiego od początku, tylko od czegoś bardziej zaawansowanego. Jednak jeśli dla kogoś jest to pierwsza lekcja i nie miał wcześniej do czynienia z programowaniem, to wydaje mi się, że niewiele z niej zrozumie. Mimo, że materiał jest dobrze wytłumaczony, to jest go za dużo (pola, metody, zmienne, konstruktory i obiekty – wszystko w jednej lekcji) i na końcu, ktoś może odnieść wrażenie, że napisany program nic nie robi. A nie ma to jak zobaczyć efekty swojej pracy :) Już po działaniu programu czasami można się zorientować, co tak naprawdę zrobiliśmy, jak działają konkretne metody i po co w ogóle te set-y i get-y.
    Tak czy inaczej z mojej perspektywy strona bardzo przydatna – na pewno będę tutaj zaglądał. Dzięki :)

    • FareZ Qlusive

      Sam wlasnie teraz zaczalem nauke od tego kursu jak do tej pory zrozumialem ta lekcje.Chociaz musialem przeczytac 2-3 razy ale jakos dalem rade.

    • Hej! Założeniem tego kursu jest mocny nacisk na praktyczne programowanie – stąd czasem teoria podawana jest w pigułce, a zrozumienie treści wymaga doczytania dodatkowych materiałów. Oczywiście nie każdemu taki sposób nauki będzie odpowiadał – dla mnie kursy, gdzie bardzo powoli wprowadzano w teorię były nieciekawe i nie miałam chęci z nich korzystać, więc poprosiłam Kubę by przygotował coś nastawionego na intensywną naukę. I osobiście super mi się z niego uczyło. Przed samą nauką Javy zrobiłam sobie kurs z Pythona na codecademy i jak najbardziej taka podstawowa wiedza mi wystarczyła ;)

      • Marcin Kędzia

        Ja przerobiłem kurs Java na codecademy, przerobiłem już połowę książki do Java, ale tutaj nie mogę przebrnąć nawet przez pierwszą lekcję. Tłumaczenia są dla mnie tak skomplikowane jak definicje w szkole, czytam 3 razy i nie rozumiem, mam wrażenie że jestem za głupi :

    • Milena

      Mam takie same odczucia. Zaczęłam Wasz kurs dobry rok temu, ale poważnie się zniechęciłam po tej lekcji. Jakieś pół roku temu ktoś podesłał mi linka do codecademy, tam przerobiłam Javę i Pythona (którego pokochałam :) ) i dopiero teraz wróciłam do Javy u Was. Cóż, bogatsza o doświadczenie rozumiem trochę więcej, ale dla osoby kompletnie początkującej, którą nadal jestem, wcale nie jest dużo łatwiej. Może to kwestia charakteru – jednych taki sposób przedstawiania materiału motywuje, innych wręcz przeciwnie.

      • Dzięki za podzielenie się odczuciami – na pewno nie podajemy wszystkiego na tacy i wiele trzeba samodzielnie doczytywać i uszczegóławiać. Zapewne też forma kursu może dla niektórych osób nie być najwygodniejsza – niemniej dzięki za feedback :)

  • olekxd

    Super kurs nazwalbym go w prawdzie dla poczatkujacych stopnia drugiego, jak dla mnie swietna sprawa, aby odswiezyc wiedze poznana z ksiazek i otchlani internetu. Popieram podejscie, aby nie wszytko bylo podane na tacy tylko, aby zmusic uzytkownika do szukania na wlasna reke, poniewaz to duzo bardziej pomaga utrwalic wiedze. Dlatego czytanie ksiazek i przepisywanie z nich przykladow to niezbyt owocna taktyka, sam musialem jedna ksiaze przeczytac zeby dojsc do tych wnioskow. Jak najbardziej bede promowal go na stronach z branzy IT, poniewaz za taki wklad nalezy sie wam nagroda. Jestem w trakcie tworzenia strony-portfolio w oparciu o bootstrapa w zasadzie wszystko juz zrobione tylko musze wypelnic ja odpowiednia trescia. W zakladce About me chcialbym opisac moje pierwsze kroki w programowaniu. Pytanie do Ani i Jakuba czy moge wkleic adres waszego bloga oraz napisac o nim kilka cieplych slow ?

    • Cześć,
      dzięki bardzo za ciepłe słowa! Jak najbardziej możesz wkleić linka do bloga – będziemy wdzięczni za polecenie nas dalej :)

      Co do float vs double – trochę z przyzwyczajenia, trochę z praktyki. Nie ma żadnej oficjalnej konwencji żeby używać double częściej. W naszym przypadku zapisujemy wagę kota – coś, co będzie z przedziału (powiedzmy) 0-15, z dokładnością do 1-2 miejsc po przecinku. Float ma dokładność (w przybliżeniu) 7 cyfr w zapisie dziesiętnym – zdecydowanie powyżej naszych wymagań.
      O ile nie jest to stricte problem w naszej aplikacji, jest to dobry nawyk. Czytając plik nie będziesz zapisywał kolejnych bajtów w typie int (choć to domyślny), bo po prostu szkoda miejsca w pamięci ;) O ile tutaj mówimy o kilku bajtach, z pewnością trafisz też na projekt, gdzie będzie to miało istotne znaczenie (np. przetwarzanie bardzo dużej ilości danych w pamięci, streaming danych itp).
      Podsumowując: użycie double w tym miejscu nie byłoby problemem, ale warto wyrabiać sobie pewne przyzwyczajenia – pozwalają unikać prostych błędów w przyszłości :)

  • Dobry

    Witajcie!
    Chciałbym korzystać z IntelliJ-a idąc przez ten kurs, ponieważ korzystałem z niego wcześniej. Czy jest gdzieś opis jak skonfigurować środowisko pod ten program? Sporo się już męczę z tym i za każdym razem jest coś nie tak. Korzystam z Linux Mint 17.3 + IntelliJ 2016.2.3

    Z góry dziękuję za odpowiedź,
    Michał

  • Joanna Podolska

    Cześć!
    Ja mam jedną uwagę… Wszystko fajnie opisane jest, ale brakuje mi informacji, jak to połączyć w całość. Dopiero po przeanalizowaniu rozwiązania do lekcji mam mgliste pojęcie, jak to zrobić :(

    • Cześć!
      Jeśli nigdy nie programowałaś może czasem okazać się, że materiał będzie trzeba przeczytać 2 razy, albo poszukać dodatkowych informacji w polecanych przez nas źródłach i dopiero z taką wiedzą wszystko okaże się jasne. Ten kurs kładzie duży nacisk na praktyczne aspekty programowania w Javie i często odsyła do dodatkowych źródeł, by lepiej zrozumieć teorie i różne pojęcia – może też po prostu nie jest to idealny sposób nauki dla Ciebie, albo, może warto zacząć od np. kursu programowania w Pythonie, gdzie trochę mniej „gramatyki” języka. Pozdrawiam,

  • Michał Laskowski

    Nie było łatwo ale udało mi się przebrnąc :) Zadanie co prawda zrobilem inaczej niz w odpowiedzi, bo bez getterów i setterów ale wynik koncowy jest taki jak byc powinien (mam taka nadzieję:) )

    • Zachęcamy nie tylko do poszukania kodu, który zwróci taki sam wynik, ale również używania przedstawionych przez nas struktur – gettery i settery to element programowania obiektowego (używanie obiektów poprzez ich metody a nie pola, czyli enkapsulacja).

  • rand

    No dobra, utworzyłem tę klasę i co dalej ? Jak ją uruchomić ? W następnej lekcji niby jest pokazany sposób na „run”, ale nijak to się ma do tego zadania domowego. Dopiero zaczynam naukę Javy i jako totalnie początkujący jest to dla mnie opisane niejasno i bez powiązania. Mam stworzyć kolejną klasę z metodą która będzie uruchamiać ‚kota’ ? Jaka funkcja miałaby go aktywować ?

  • Marek Kozłowski

    Dobry wieczór :). Dwa pytanka odnośnie zadania : 1. W którym miejscu powienienem wprowadzić konretne wartości odpowiadające
    nazwom pól? 2. Czy mógł bym prosić o wyjaśnienie co robi getter a co setter?
    Wiem ogólnie, że chodzi o enkapsulację czyli odpublicznienie pól a uczynienie publicznymi metody które „dysponują polami” ale tak
    konkretnie po co getter a do czego setter?

    • „Gettery i settery to metody, które pozwalają odpowiednio pobierać i zapisywać wartość pól klasy.” Co do pytania 1, to znajdziesz na nie odpowiedź w kolejnej lekcji kursu – ta skupia się na przedstawieniu podstawowych elementów języka związanych z obiektami.

      • Marek Kozłowski

        Dziękuję