Java jest językiem w pełni zorientowanym obiektowo. Znaczy to że każdy efekt uzyskujemy poprzez pisanie klas. Czym jest w ogóle programowanie zorientowane obiektowo?
Spróbuję tutaj to wytłumaczyć. Jeśli zrozumiesz teraz z czym się to je, to uwierz, później bedzie łatwiej Ci projektować aplikacje :)
Klasa jest tak jakby wzorem. Wzorem dla jakiegoś obiektu. Obiektem możesz nazwać wszystko co chcesz. Założmy że na potrzeby kursu za obiekt weźmiemy Człowieka :)
Człowiek ma jakieś cechy i te cechy nazywać będziemy polami. Mogą być nimi np imię, nazwisko, wzrost, waga, kolor włosów itp…
Człowiek może mieć akcje, które może wykonywać, np. IdźSpać, IdźDoPracy, Zjedz, PogadajZ itp.. Zauważ moją pisownię – bez spacji.
Ok.. Hm, akcje mogą modyfikować pola, prawda? Jeśli akcję nazwiemy PrzefarbujWłosy to kolor włosów się zmieni, logiczne, nie? I również logiczne jest że każdy człowiek może mieć inne pola, ale raczej te same metody – czyli te akcje.
Ok, czyli wiemy że mamy metody, czyli funkcje człowieka i pola, czyli zmienne okreslające go.
Napiszmy klasę Czlowiek :)
1 2 3 | public class Czlowiek { } |
Mega, nie?:D Ale ten człowiek to troche jak steretypowa blondynka – pusty ;) wypełnijmy go!
1 2 3 4 5 6 7 8 | public class Czlowiek { private String imie; private String naziwsko; public double wiek; public double wzrost; public String kolor_wlosow; public int plec; } |
Dodaliśmy mu cechy :) Co znaczą słowa public i private? Pola public będa dostępne na zewnątrz (czyli każdy inny człowiek będzie mógł je zobaczyć) a pola private to nasze prywatne cechy, które mogą poznać tylko nieliczni.. :) Np przyjaciele czy rodzice.
Ale ten Czlowiek nie może nic robić. Dajmy mu nieco elastyczności. Na początek zmieńmy to tak:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public class Czlowiek { private String imie; private String naziwsko; public double wiek; public double wzrost; public String kolor_wlosow; public int plec; private String czynnosc; public Czlowiek(String im, String naz, double wiekk, double wzrostt, String wlosy, int plecc){ imie =im; naziwsko=naz; wiek=wiekk; wzrost = wzrostt; kolor_wlosow=wlosy; plec = plecc; } } |
Metoda która ma tę samą nazwę co klasa i nie zwraca nic nazywa się Konstruktorem. I jest jedną z ważniejszych metod. W niej określamy w jaki sposób będziemy mogli tworzyć obiekty klasy Czlowiek, czyli Ludzi ;) czyli z klasy zrobimy sobie jakąs ilość ludzi, każdy z innymi cechami.
Ok, dopiszmy jeszcze jakieś metody.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | public class Czlowiek { private String imie; private String naziwsko; public double wiek; public double wzrost; public String kolor_wlosow; public int plec; private String czynnosc; public Czlowiek(String im, String naz, double wiekk, double wzrostt, String wlosy, int plecc){ imie =im; naziwsko=naz; wiek=wiekk; wzrost = wzrostt; kolor_wlosow=wlosy; plec = plecc; } public void idzSpac(){ czynnosc="spię"; } public void idzDoPracy(){ czynnosc="Jezu, znów praca."; } public void idzDoLozka(){ czynnosc="Poleże, odpocznę.."; } public void idzDoLozka(Czlowiek inny){ czynnosc="UWAGA +18 !!! :)"; } } |
Zobacz teraz. Pole czynnosc, będzie zmieniane. Jak każemy pójść mu spać, to pójdzie spać. Jak do pracy to pójde pracować. Jeśli każemy mu pójść do łózka to pójdzie do łóżka… Ale zaraz, zaraz!! Coś tu nie tak, nie? Dwie metody o tej samej nazwie, magia, nie? Z tym że jedna przyjmuje jako argument obiekt klasy Czlowiek – o nazwie inny. A druga jest bez niego. Co to może oznaczać w praktyce? Ano ta metoda bez parametru może oznaczać pójscie poleżeć, natomiast druga metoda, znacząca pójde do łożka obiektu klasy Czlowiek z drugim obiektem klasy Czlowiek.. UFFF! Może tam być gorąco. Oby im się konstruktory nie przegrzały ;) Ale coś tutaj nie tak. Zmienilismy czynnosc jednego obiektu, tego który inicjuje metodę idzDoLozka(Czlowiek inny) ale 'czynnosc’ obiektu przekazanego jako argument nadal ma jakąś inną czynność.. Co nie jest prawdą, bo jak takie obiekty pójdą do łóżka, to muszę, no oba muszą zmienić swoją czynność!! Przyznaj mi rację. Ok, ale jak mam zmienić czynnosc obiektu skoro jest ona ustawiona jako prywatna? No mogę zmienić na publiczną, ale przecież nie każdy człowiek i nie w każdej sytuacji może zmienić naszą aktualnie wykonywaną czynność. Napiszmy metodę, która pozwoli ustawić (zmienić) czynność. Mam nadzieje że rozumiesz jak to zrobić? Popatrz:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | public class Czlowiek { private String imie; private String naziwsko; public double wiek; public double wzrost; public String kolor_wlosow; public int plec; private String czynnosc; public Czlowiek(String im, String naz, double wiekk, double wzrostt, String wlosy, int plecc){ imie =im; naziwsko=naz; wiek=wiekk; wzrost = wzrostt; kolor_wlosow=wlosy; plec = plecc; } public void idzSpac(){ czynnosc="spię"; } public boolean ustawCzynnosc(String cz){ czynnosc=cz; return true; } public void idzDoPracy(){ czynnosc="Jezu, znów praca."; } public void idzDoLozka(){ czynnosc="Poleże, odpocznę.."; } public void idzDoLozka(Czlowiek inny){ czynnosc="UWAGA +18 !!! :)"; inny.ustawCzynnosc("UWAGA +18 !!! :)"); } } |
I teraz wszystko jest spoko ^^ Każdy z dwóch obiektów klasy Czlowiek ma ustawioną czynnosc na wlasciwą. Dobra, stwórzmy teraz „grupkę osób”.
Po wygenerowaniu nowej aplikacji w NetBeans dostajemy na start takie coś:
1 2 3 4 5 6 7 8 9 | public class Hyhy { /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here } } |
Nasz projekt nazywał się Hyhy. Publiczna statyczna metoda main to miejsce gdzie będzie dziać się większosć wywołań naszych klas. Nasza grupka osób będzie zaimplementowana jako lista obiektów klasy Czlowiek. Zabrzmiało mega groźnie! Implementacja to sposób wykonania pomysłu. Zakładam że wiesz co to lista :)
Wygląda to tak:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | public static void main(String[] args) { List grupa =new ArrayList(); String imiona[] = {"Marcin", "Mateusz","Marek"}; String imie; for(int i=0;i<3;i++){ imie = imiona[rand.nextInt(imiona.length)]; grupa.add(new Czlowiek(imie, "Rejtan", 20, 190, "blond", 1)); } grupa.add(new Czlowiek("Natalia", "Wielowatkowa", 19, 173,"dlugie blond", 0)); Iterator iterator = grupa.iterator(); while(iterator.hasNext()){ System.out.println(iterator.next().getImie()); } } |
Skoro tak kurs, to opowiem co tu sie dzieje.
1 | List grupa =new ArrayList(); |
inicjalizacja nowej, pustej listy obiektów Czlowiek o nazwie grupa.
1 2 | String imiona[] = {"Marcin", "Mateusz","Marek"}; String imie; |
Tablica imion do losowania i zmienna imie, która będzie przechowywać wylosowane imię.
1 2 3 4 5 6 | for(int i=0;i<3;i++){ imie = imiona[rand.nextInt(imiona.length)]; grupa.add(new Czlowiek(imie, "Rejtan", 20, 190, "blond", 1)); } |
Pętla która wykona się 3 razy, od 0 do 2. Wylosuje w tej linii:
1 | imie = imiona[rand.nextInt(imiona.length)]; |
jedno imię z tablicy. Linia pod nią dodaje w każdej iteracji pętli jeden obiekt do listy.
Dane dodawanych obiektów:
imię – wylosowane.
nazwisko – Rejtan
wiek – 20
wzrost – 190
kolor włosów – blond
płec – 1 czyli facet.
Po skonczeniu tej pętli będziemy mieli w Liście 3 osoby – każda z tym samym nazwiskiem. Niech będzie to 3 braci. W tym samym wieku… I z tym samym wzrostem Przypadki się zdarzają przecież takie, nie? ;)
Poniżej dodaje już pojedyńczą osobę – Natalię Wielowatkową, 19letnią blondynke z długimi włosami i mająca 173 cm wzrostu.
1 | grupa.add(new Czlowiek("Natalia", "Wielowatkowa", 19, 173,"dlugie blond", 0)); |
Pod Natalią juz tylko Iteratorem wyświetlam imiona wylosowanych osób:
1 2 3 4 5 | while(iterator.hasNext()){ System.out.println(iterator.next().getImie()); } |
Zauważyłeś coś teraz?
1 | iterator.next() |
zwraca obiekt z listy. Więc jest on obiektem klasy Czlowiek, ale nasz czlowiek nie mial metody getImie() :P podczas pisania pomyslalem że dam ludziom możliwość przedstawiania się. Klasa rozszerzyła się o metodę:
1 2 3 4 5 | public String getImie(){ return imie; } |
No to co.. Wypróbujmy najciekawszą metodę z naszej klasy ;)
Po pętli dopisujemy:
1 2 3 4 5 6 | System.out.println(grupa.get(1).getImie()+" posiada czynnosc: "+grupa.get(1).getCzynnosc()); System.out.println(grupa.get(3).getImie()+" posiada czynnosc: "+grupa.get(3).getCzynnosc()); grupa.get(1).idzDoLozka(grupa.get(3)); System.out.println("Po zainicjowaniu metody idzDoLozka..."); System.out.println(grupa.get(1).getImie()+" posiada czynnosc: "+grupa.get(1).getCzynnosc()); System.out.println(grupa.get(3).getImie()+" posiada czynnosc: "+grupa.get(3).getCzynnosc()); |
Czyli wyswietlamy stan przed zainicjowaniem metody idzDoLozka. Dopisałem do klasy metodę getCzynnosc() – liczę że sam napiszesz ją sobie sam. Po skompilowaniu dostajemy na ekranie:
1 2 3 4 5 | Marcin posiada czynnosc: null Natalia posiada czynnosc: null Po zainicjowaniu metody idzDoLodzka... Marcin posiada czynnosc: UWAGA +18 !!! :) Natalia posiada czynnosc: UWAGA +18 !!! :) |
;D czyli wszystko działa.
Kilka wyjaśnienień na koniec…
Zakładam że część już umiesz. Tzn że podstawy umiesz. Wiesz np co znaczą te słowa void czy String.
Zauważ że
1 | List grupa |
również jest instancją klasy o nazwie List. Czyli ktoś stworzył klasę o nazwie List gdzie napisał metody Add(), Get() itp.. Rozumiesz to, nie?
Co tam jeszcze… A! Forma tego kursu raczej nie będzie poważna, chyba że temat będzie tego wymagał.
Mam nadzieję że rozjaśniłem nieco programowanie obiektowe. Prócz słow kluczowych takich jak public i private jest jeszcze protected – jak na nasze aktualne umiejętności niech jej funkcjonalność będzie identyczna jak private.
Zobacz że metoda main jest statyczna, tzn ma przedrostek static. Modyfikator “static” używany jest, aby stworzyć zmienne, czy metody, dostępne dla każdej instancji klasy. Taka zmienna lub metoda istnieje zawsze, nawet gdy nie nie została utworzona żadna instancja klasy. Ze statycznej metody nie wolno się odwoływać do niczego, co statyczne nie jest. Z tego powodu
1 | private static Random rand = new Random(System.currentTimeMillis()); |
jest ze słowem static.
No cóż. To na dziś chyba tyle. Jak znajdę czas, to spróbujemy porozszerzać nieco klasę Czlowiek w dosłownym tego słowa znaczeniu no i w przykładzie może cos więcej niż iteratory i listy.
Na razie!
PS. Mile widziane komentarze z info czy warto bym szukał czas na pisanie kolejen cześci.
Oj daaawnoo mnie tu nie było. Ale wakacje to był czas dużej liczby intensywnych wyjazdów i tak naprawdę, dopiero jakoś… Read More
Cześć! Zapraszam na krótkie podsumowanie kwietnia. Wyjazd do Niemiec A dokładniej pod granicę z Francją. Chrześnica miała pierwszą komunię. Po… Read More
Ostatnio tygodnie były tak bardzo wypełnione, że nie udało mi się napisać nawet krótkiego podsumowanie. Więc dziś zbiorczo podsumuję luty… Read More
Zapraszam na krótkie podsumowanie miesiąca. Książki W styczniu przeczytałem "Homo Deus: Historia jutra". Książka łudząco podoba do wcześniejszej książki tego… Read More
Cześć! Zapraszam na podsumowanie roku 2023. Książki Zacznijmy od książek. W tym roku cel 35 książek nie został osiągnięty. Niemniej… Read More
Zapraszam na krótkie podsumowanie miesiąca. Książki W grudniu skończyłem czytać Mein Kampf. Nudna książka. Ciekawsze fragmenty można by było streścić… Read More
Pokaż komentarze
Dużo interesujących wpisów można tutaj znaleźć. Pozdrawiamy.:)