Poznámky
Prezentace
Osnova
1
"Róbert Novotný"
  • Róbert Novotný
  • robert.novotny@upjs.sk
  • 13. 10. 2006
2
V minulom dieli ste videli...
  • class Pes {
  • String rasa;


  • int vek;


  • String stekaj() {
  • return "Haf!"
  • }


  • void pridajRok() {
  • vek = vek + 1;
  • }
  • }
3
Chráňte životné prostredie a inštančné premenné!
  • Pes slayer = new Pes();
  • slayer.vek = -125;
4
Chráňte životné prostredie a inštančné premenné!
  • public class Pes {


  • //.. rasu vynecháme


  • int vek;



  • void nastavVek(int novýVek) {
  • vek = novýVek;
  • }


  • int dajVek() {
  • return vek;
  • }


  • }


5
Chráňte životné prostredie a inštančné premenné!
  • public class Pes {
  • //...
  • void nastavVek(int novýVek) {
  • if(novýVek >= 0) {
  • vek = novýVek;
  • } else {
  • System.out.println("Vek nesmie byť < 0");
  • }
  • }
  • }
6
Chráňte životné prostredie a inštančné premenné!
  • Pes slayer = new Pes();
  • pes.nastavVek(25);
  • pes.vek = -17000;


7
Súkromné vlastníctvo
  • k privátnym premenným môže pristupovať len kód v danej triede
8
Súkromné vlastníctvo
  • Príklad použitia: chceme premennú, do ktorej nemôžeme zapisovať (,,read only")
9
Daj a nastav po americky
  • 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
    • dajXXX
10
Daj a nastav po americky
  • 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
Daj a nastav po americky
  • 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
Dátové štruktúry
  • 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
Polia obyčajné
  • ,,...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
Výhody a nevýhody polí
  • 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
Polia dynamické čili zoznamy
  • 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)
    • mená.add("Rex");
  • prístup k prvku
    • String meno = mená.get(0);
  • dĺžka zoznamu
    • int dĺžka = mená.size();
16
Polia dynamické čili zoznamy
  • 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
    • viď dokumentácia
17
Polia vs. zoznamy
  • 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
Prechádzame poľom
  • 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
Prechádzame zoznamom
  • 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
Ďalšie dátové štruktúry
  • 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
Utajené metódy práce s kávou
  • 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()
      • ,,heš! heš!"
22
Metóda toString()
  • 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
Metóda toString()
  • class Pes {
  • private String rasa;
  • private int vek;
  • …
  • public String toString() {
  • String s = "Pes rasy " + rasa + " s vekom " + vek;
  • return s;
  • }
  • }
24
Metóda toString()
  • public String toString() {
  • return String.format("Pes rasy %s s vekom %d", rasa, vek);
  • }
25
Formátovanie disku reťazcov
  • 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
Metóda equals()
  • 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
Metóda equals()
  • Častejšie sa zvykne používať porovnávanie atribútov
  • Metóda sa ľahko pochopí, ale ťažko napíše
28
Metóda equals()
  • Častejšie sa zvykne používať porovnávanie atribútov
  • Metóda sa ľahko pochopí, ale ťažko napíše
29
Metóda equals()
  • Metóda sa ľahko pochopí, ale ťažko napíše
30
Metóda equals()
  • Riešenie: inžiniersky prístup: použitím IDE (Eclipse) a jeho nástroja na vygenerovanie metódy.
31
Metóda hashCode()
  • 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