Mateusz Mazurek – programista z pasją

Python, architektura, ciekawostki ze świata IT

Programowanie

kursJavy.czesc(1);

Cześć! Cieszę się, że mnie odwiedziłeś/aś. Zanim przejdziesz do artykułu chciałbym zwrocić Ci uwagę na to, że ten artykuł był pisany kilka lat temu (2012-12-25) miej więc proszę na uwadzę że rozwiązania i przemyślenia które tu znajdziesz nie muszą być aktualne. Niemniej jednak zachęcam do przeczytania.

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.

Idź do 2 części…

Dzięki za wizytę,
Mateusz Mazurek

A może wolisz nowości na mail?

Subskrybuj
Powiadom o
guest

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

1 Komentarz
Inline Feedbacks
View all comments
adworkers

Dużo interesujących wpisów można tutaj znaleźć. Pozdrawiamy.:)