|
1
|
- Róbert Novotný
- robert.novotny@upjs.sk
- 13. 10. 2006
|
|
2
|
- class Pes {
- String rasa;
- int vek;
- String stekaj() {
- return "Haf!"
- }
- void pridajRok() {
- vek = vek + 1;
- }
- }
|
|
3
|
- Pes slayer = new Pes();
- slayer.vek = -125;
|
|
4
|
- public class Pes {
- //.. rasu vynecháme
- int vek;
- void nastavVek(int novýVek) {
- vek = novýVek;
- }
- int dajVek() {
- return vek;
- }
- }
|
|
5
|
- public class Pes {
- //...
- void nastavVek(int novýVek) {
- if(novýVek >= 0) {
- vek = novýVek;
- } else {
- System.out.println("Vek nesmie byť < 0");
- }
- }
- }
|
|
6
|
- Pes slayer = new Pes();
- pes.nastavVek(25);
- pes.vek = -17000;
|
|
7
|
- k privátnym premenným môže pristupovať len kód v danej triede
|
|
8
|
- Príklad použitia: chceme premennú, do ktorej nemôžeme zapisovať (,,read
only")
|
|
9
|
- Pre každú inštančnú premennú naklepkáme 2 metódy:
- dajXXX dajVek(), dajRasu()
- nastavXXX nastavVek(...), nastavRasu()
- Premenné určené len na čítanie majú len jednu metódu
|
|
10
|
- Dohoda:
- metóda dajXXX sa bude zapisovať ako getXXX
- metóda nastavXXX sa bude zapisovať ako setXXX
- ,,nahodíme gettre a settre"
- Nariadenie
- odteraz pristupujeme k premenným triedy len cez getXXX a setXXX
- ,,úplné zapúzdrenie"
|
|
11
|
- Problém so slovenčinou
- správne by malo byť: String dajRasu()
- podľa dohody: getRasu()
- zabudneme na Ľ. Štúra a na skloňovanie
- nástroje predpokladajú takýto stav:
- private String rasa;
- get + rasa = getRasa()
- set + rasa = setRasa(String nováRasa)
- zabudneme na slovenčinu = riešenie odrodilca
- ,,reč, ktorú z domu vieš, ó, jak je lichá"
- private String breed;
- String getBreed()
- setBreed(String aBreed)
|
|
12
|
- s obyčajnými dátovými typmi by sme sa ďaleko nedostali
- potrebujeme často reprezentovať komplikované štruktúry
- spomni matematiku:
- množiny
- zoznamy
- funkcie (postupnosti)
- stromy (grafy)
- spomni Pascal
- polia (array [1..10] of integer)
- záznamy (record meno: string; vek: integer; end;)
- množiny (set of integer)
|
|
13
|
- ,,...a od Prešova v tym poľu"
- už poznáme
- deklarácia a inicializácia
- String[] reťazce = new String[4];
- alternatívna deklarácia a inicializácia
- String[] reťazce = { "Ferko", "Miško" };
- prístup k prvkom poľa
- String prvý = reťazce[0];
- dĺžka poľa
- String dlzka = reťazce.length;
|
|
14
|
- dĺžka poľa môže byť určená premennou
- spomni Pascal: len konštantou, alebo číslom pri deklarácii.
- komplikované vkladanie prvkov do existujúceho poľa
- nadeklarovať nové pole o jedna dlhšie
- v cykle skopírovať prvú časť poľa, nový prvok, zvyšok
- komplikované mazanie prvkov z poľa
- nadeklarovať nové pole o jedna kratšie
- v cykle skopírovať prvú časť poľa, zvyšok za vymazaným prvkom
|
|
15
|
- našťastie máme zoznamy – trieda java.util.ArrayList
- deklarácia a inicializácia
- java.util.ArrayList<String> mená
- = new java.util.ArrayList<String>();
- pridanie prvku (na koniec zoznamu)
- prístup k prvku
- String meno = mená.get(0);
- dĺžka zoznamu
|
|
16
|
- odstránenie prvku
- mená.remove(2);
- prvky sa posunú doľava
- pridanie prvku na pozíciu
- mená.add(1, "Lassie");
- pridanie na ,,druhú" pozíciu
- prvky sa posunú doprava
- ostatné operácie
|
|
17
|
- polia vieme previesť na zoznam a späť
- zoznam => pole
- String[] poleMien
- = mená.toArray(new String[0]);
- pole => zoznam
- java.util.List<String> mená
- = java.util.Arrays.asList(poleMien);
- porovnanie
- prístup k poliam je rýchlejší – chlieviky v pamäti za sebou
- v Jave 5: zoznamy majú všetky výhody polí a odstraňujú ich nevýhody
|
|
18
|
- dva spôsoby prechádzania poľom
- String[] mená = { "Rex", "Brok" };
- klasický
- for (int i = 0; i < mená.length; i++) {
- String meno = mená[i];
- System.out.println(meno);
- }
- Java 5:
- for (String meno : mená) {
- System.out.println(meno);
- }
|
|
19
|
- dva spôsoby prechádzania zoznamom
- klasický
- for (int i = 0; i < zoznamMien.size(); i++) {
- String meno = zoznamMien.get(i);
- System.out.println(meno);
- }
- Java 5:
- for (String meno : zoznamMien) {
- System.out.println(meno);
- }
|
|
20
|
- v starej Jave – namiesto ArrayList-ov bol java.util.Vector.
- radšej používajme ArrayList
- existujú aj ďalšie dátové štruktúry
- množina – java.util.HashSet
- mapa – java.util.HashMap
- o nich neskôr...
|
|
21
|
- Je užitočné vedieť o niektorých ,,utajených metódach" práce s
objektami
- traja zhavranelí bratia
- toString()
- ,,znak si a v znak sa obrátiš"
- equals()
- ,,všetci sú si rovní, len niektorí sú si rovnejší"
- hashCode()
|
|
22
|
- Každá trieda môže mať metódu s hlavičkou
- public String toString()
- Metóda slúži na vrátenie ľubovoľného reťazca, ktorý popisuje objekt
- Často používaná na ladenie
|
|
23
|
- class Pes {
- private String rasa;
- private int vek;
- …
- public String toString() {
- String s = "Pes rasy " + rasa + " s vekom " + vek;
- return s;
- }
- }
|
|
24
|
- public String toString() {
- return String.format("Pes rasy %s s vekom %d", rasa, vek);
- }
|
|
25
|
- String prvy = "Miško";
- String druhy = "Ferko";
- int vek1 = 25;
- float vek2 = 35.0f;
- String.format("%s - %d, %s - %f", prvy, vek1, druhy, vek2)
|
|
26
|
- Slúži na porovnávanie objektov
- Ale ako môžeme porovnávať dva objekty?
- databázovo
- ak majú dva objekty rovnaké ID, sú rovnaké
- čo dvaja občania s rovnakým rodným číslom?
- porovnaním atribútov
- dva psy sú rovnaké, ak majú rovnakú rasu a rovnaký vek
- ,,veľmi zjednodušené"
- Každá trieda môže mať metódu
- public boolean equals(Object obj)
|
|
27
|
- Častejšie sa zvykne používať porovnávanie atribútov
- Metóda sa ľahko pochopí, ale ťažko napíše
|
|
28
|
- Častejšie sa zvykne používať porovnávanie atribútov
- Metóda sa ľahko pochopí, ale ťažko napíše
|
|
29
|
- Metóda sa ľahko pochopí, ale ťažko napíše
|
|
30
|
- Riešenie: inžiniersky prístup: použitím IDE (Eclipse) a jeho nástroja na
vygenerovanie metódy.
|
|
31
|
- Používaný v algoritmoch triedy pre množiny HashSet
- Každý objekt by mal mať svoj čo najjedinečnejší kód.
- Požiadavky:
- ak sú dva objekty rovnaké (equal), majú rovnaký hashCode
- dva nerovnaké objekty môžu mať rovnaký hashCode
- Opäť inžiniersky prístup: generovanie pomocou IDE
|