1 / 58

4IT101

4IT101. Pátá přednáška Datové struktury - pokračování Statické prvky třídy. Kolekce. Rozhraní Implementace Algoritmy G enerické typy Všechny třídy jsou z balíčku java.util. Collections. Java Collection Framework. Kolekce. Základní vlastnosti seznamů (List) Libovolný počet prvků

shakti
Download Presentation

4IT101

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 4IT101 Pátá přednáška Datové struktury - pokračování Statické prvky třídy

  2. Kolekce • Rozhraní • Implementace • Algoritmy • Generické typy • Všechny třídy jsou z balíčku java.util Collections

  3. Java Collection Framework

  4. Kolekce • Základní vlastnosti seznamů (List) • Libovolný počet prvků • Udržuje pořadí • Může obsahovat více prvků stejné hodnoty • Lze používat indexy • Základní vlastnosti množin (Set) • Libovolný počet prvků • Neudržuje pořadí • Nemůže obsahovat více prvků stejné hodnoty • Nelze používat indexy

  5. Základní operace • Vložení prvku – metoda add() • Rušení prvku – metoda remove() • Vyhledání prvku – metoda contains() • Postupné procházení kolekce – cyklus for (tzv. for each)

  6. Balíčky (package) • Java API je tvořeno několika tisíci tříd, které je třeba nějak logicky uspořádat. • Balíček tvoří zároveň i základní jmenný prostor, třída musí mít jednoznačné jméno v rámci package, ve kterém je deklarována. • Klíčové slovo package • Noname package – nepojmenovaný balíček • Základní balíček java.lang • Plná jména tříd x import

  7. Pepa • Vašek Dušan • 5804 Luboš Jarmila • Renata • 5806 Obalové třídy primitivních typů

  8. Obalové třídy • Ke každému primitivnímu typu existuje jeho objektový obal (obalová třída)

  9. K čemu slouží obalové třídy • Obalové třídy jsou read only. • S hodnotami v obalovém typu (stejně jako u všech tříd) se dát pracovat pouze pomocí metod • od 5.0 automatické konverze mezi obalovými třídami a primitivní typy (autoboxing)

  10. Autoboxing Integer cislo = 5; cislo += 2; Integer cislo = new Integer (5); int pomocna = cislo.intValue(); // převod na primitivní typ pomocna += 2; cislo = new Integer(pomocna);

  11. K čemu slouží obalové třídy • Obalové typy obsahují další metody pro práci s těmito typy (např. převod řetězce na číslo) • Obalové třídy číselných typů mají definovány konstanty: • maximální a minimální hodnotu daného typu např. Integer.MAX_VALUE • Jsou zde definovány konstanty jako Double.NEGATIV_INFINITY, Boolean.TRUE, Double.NaN

  12. Jednorozměrná a vícerozměrná pole

  13. Pole (array) – základní vlastnosti • Určený počet prvků • Přístup pomocí indexů • Může obsahovat více prvků stejné hodnoty • Lze vkládat primitivní datové typy • Neexistují metody • Obtížně se vyjadřuje neexistence prvku • Rychlejší než seznam (ne vždy) • jednorozměrné i vícerozměrné

  14. Deklarace a inicializace jednorozměrného pole typ [ ] jméno; int [ ] poleCisel; String [ ] nazvyMesicu; jméno = new typ [rozsah]; poleCisel = new int [10]; nazvyMesicu = new String [12]; typ [ ] jméno = new typ [rozsah]; double [ ] poleRealCisel = new double [20]; String [ ] vikend = new {"sobota", "nedele"}

  15. 2.4 5.7 8.2 5.0 4.21 0 1 2 3 4 double [] poleRealCisel = {2.4, 5.7, 8.2, 5, 4.21} hodnota index poleRealCisel [0] Na jednotlivé položky pole se odkazujeme jménem pole a indexem položky. Indexuje se od nuly.

  16. Jednorozměrné pole • Každé pole má datový atribut length, která obsahuje údaj o počtu prvků v poli. poleRealCisel.length

  17. Jednorozměrné pole jako parametr metody • Pokud potřebujete metodě předat větší počet parametrů stejného typu, je vhodné deklarovat příslušný parametr jako pole. • Při volání metody můžeme přímo zadat čísla k sečtení do hlavičky metody

  18. Jednorozměrné pole jako parametr metody intvysl = sectiPrvkyPole(newint[] {4, 6, 10, 20});

  19. Jednorozměrné pole jako parametr metody public int sectiPrvkyPole(int [ ] pole) { int soucet = 0; for (int i=0; i < pole.length; i++) { soucet += pole[i]; } return soucet; } public int sectiPrvkyPole(int [ ] pole) { int soucet = 0; for (int prvek : pole) { soucet += prvek; } return soucet; }

  20. Jednorozměrné pole jako parametr metody • Od verze 1.5 je možné použít tzv. proměnlivý počet parametrů metody. public static intsecti(int ... cisla) { intsoucet=0; for (intcislo: cisla) { soucet += cislo; } returnsoucet; } intvysl = secti(4, 6, 10, 20);

  21. Proměnlivý počet parametrů • Lze uvést v hlavičce metody pouze jednou a to na posledním místě • public static String format(String format, Object ... args)

  22. Vícerozměrná pole • Vícerozměrná pole v Javě jsou realizovaná jako pole polí • int poleDvojrozmerne [] []; • int poleDvojrozmerne [] [] = new int [2] [3]; int poleDvojrozmerne [ ] [ ] = new { { 1, 2, 3, }, { 4, 5, 6, }, }

  23. Vícerozměrná pole • int poleDvojrozmerne [ ] [ ] = new int [2] [ ]; • poleDvojrozmerne [0] = new int [3]; • poleDvojrozmerne [1] = new int [5]; • int pocetRadku = poleDvojrozmerne.length; int pocetPrvkuPrvniRadek = poleDvojrozmerne[0].length

  24. Výpis dvourozměrného pole public static voidvypisPole(int [][]pole){ for (int[] radek : pole){ for (int prvek : radek) { System.out.print(prvek + ", "); } System.out.println(); } }

  25. Výpis dvourozměrného pole public static void vypisPole2(int[][]pole){ for (int i = 0; i < pole.length; i++){ for (int j = 0; j < pole[i].length; j++) { System.out.print(pole[i][j] + ", "); } System.out.println(); } }

  26. 2.4 5.7 8.2 5.0 4.21 0 1 2 3 4 Mazání v poli Jak smazat položku 8.2 (položku s indexem 2)?

  27. Mazání v poli • Přepsat implicitní hodnotou • Poměrně problematické hlavně u primitivních datových typů • Vytvořit nové pole o délce n – 1 a překopírovat hodnoty

  28. Výčtový typ

  29. Výčtový typ Enum • od verze 5.0 • Jedná se o specielní typ tříd • Předem daný počet pojmenovaných instancí public enum DenVTydnu { PONDELI, UTERY, STREDA, CTVRTEK, PATEK, SOBOTA, NEDELE }

  30. Použití výčtového typu public void pridejTermin(DenVTydnu den, String odKdy, String doKdy,String popis) { // obsah metody } • typově bezpečné, • odolnější vůči změnám, rozvrh.pridejTermin(DenVTydnu.PONDELI, "14:30", "16:00", "konzultační hodiny"); rozvrh.pridejTermin(DenVTydnu.UTERY, "12:45", "14:15", "konzultační hodiny");

  31. Výčtový typ - operace • for (DenVTydnu den : DenVTydnu.values() ) { • System.out.println(den); • } • metoda values() vrátí seznam hodnot • implementuje Comparable – metoda compareTo • Slouží pro třídění (pořadí deklarace == pořadí při řazení) • metoda valueOf pro získání konkrétní hodnoty z řetězce, • DenVTydnu den = DenVTydnu.valueOf(“SOBOTA”); • DenVTydnu den = DenVTydnu.valueOf(“nedele”);

  32. Rozšíření příkazu switch switch (den) { case NEDELE: case SOBOTA: System.out.println("víkend"); break; case PONDELI: case UTERY: case STREDA: case CTVRTEK: case PATEK: System.out.println("pracovní den"); break; default : System.out.println("takový den neznám"); }

  33. Výčtový typ uvnitř třídy public class Vypocet { private enum Operace { PLUS, MINUS, NASOBENO, DELENO } public double vypocet (Operace operace, double prvni, double druhy) { switch (operace) { case PLUS: return prvni + druhy; case MINUS: return prvni - druhy; case NASOBENO: return prvni * druhy; case DELENO: return prvni/druhy; default : return 0; } }

  34. Výčtový typ – další možnosti public enumHodnoceniKurzu { VYBORNE("1"), VELMI_DOBRE("2"), DOBRE("3"), NEPROSPEL("4"), OMLUVEN("O"); privateStringpismeno; privateHodnoceniKurzu(Stringpismeno) { this.pismeno=pismeno; } } • speciální datové struktury: EnumSet, EnumMap, • výčtový typ lze rozšiřovat o další metody, překrývat stávající metody, • k vlastní hodnotě lze ukládat i doplňující údaje • např. k měsícům lze uložit i počet dní, • k seznamu planet velikost,

  35. Statické prvky třídy

  36. Třída (další prvky) Statické proměnné Datové atributy Statický inicializační blok Statické metody Metody Konstruktory Vnitřní třídy Statické vnitřní třídy

  37. Proměnná je společná pro všechny instance dané třídy. V deklaraci je uveden modifikátor static. Ostatní modifikátory se používají stejně jako u datových atributů Pojmenované konstanty jsou obvykle statické (static final) Statické proměnné (proměnné třídy) Zaměstnanec početZaměstnanců jméno příjmeni ...........

  38. Deklarace třídy se statickou proměnnou public class Zamestnanec { private static int pocetZamestnancu; private String jmeno; private String prijmeni; ………… }

  39. Vztah instancí k statické proměnné pocetZamestnancu: 2 jmeno: Kája prijmeni: Mařík jmeno: Pepa prijmeni:Novák

  40. Použití statické proměnné • Statická proměnná se používá ve spojení se jménem třídy např. Zamestnanec.pocetZamestnancu • pokud je privátní, nelze ji takto zvenku „přečíst“ ani změnit

  41. Pojmenované konstanty • celá čísla (int) • používají se modifikátorystatic a final public static final int DEN_NEDELE=0; public static final int DEN_PONDELI=1; public static final int DEN_UTERY=2; public static final int DEN_STREDA=3; public static final int DEN_CTVRTEK=4; public static final int DEN_PATEK=5; public static final int DEN_SOBOTA=6;

  42. Použití a nevýhody pojmenovaných konstant public void pridejTermin(int den, String odKdy, String doKdy, String popis) { // obsah metody } rozvrh.pridejTermin(DEN_PONDELI, "14:30", "16:00", "konzultační hodiny"); rozvrh.pridejTermin(DEN_UTERY, "12:45", "14:15", "konzultační hodiny"); rozvrh.pridejTermin(999, "14:30", "16:00", "konzultační hodiny");

  43. Použití modifikátoru final • Modifikátor final je příznakem neměnnosti/konečnosti. • final u třídy – nelze z ní dědit • final u metody – nelze ji překrýt • final u datového atributu a statické proměnné – nelze ji změnit • final u pomocné proměnné – nelze ji změnit • final u parametru metody – nelze ji změnit

  44. Statická metoda (metoda třídy) • Metoda společná pro všechny instance. • Metoda třídy má modifikátor static.

  45. Deklarace statické metody public class Zamestnanec { private static int pocetZamestnancu; private String jmeno; private String prijmeni; public Zamestnanec (String jmeno, String prijmeni){ this.jmeno = jmeno; this.prijmeni = prijmeni; pocetZamestnancu ++; } ……………………………………. public static int getPocetZamestnancu(){ return pocetZamestnancu; } }

  46. Volání metody třídy • volání ve stejné třídě, ve které je metoda definována • volání v jiné třídě getPocetZamestnancu(); název metody Zamestnanec.getPocetZamestnancu(); název třídy

  47. Použití statických metod • pro přístup k statickým proměnným • pro operace, kde není zapotřebí instance • pro získání instance na základě parametrů

  48. Inicializace • Všechny objekty musíme vytvořit • S objekty manipulujeme pomocí odkazů • Objekty nemusíme mazat • Zaručená inicializace pomocí konstruktoru

  49. ClassLoader Konstruktor je speciální metoda využívaná při vytváření instance, instanci vytváří JVM. Inicializace objektů v paměti

  50. int pocet = Zamestnanec.getPocetZamestnancu(); Zamestnanec pepa = new Zamestnanec (“Pepa”,”Novák”); Zamestnanec jana = new Zamestnanec (“Jana”,”Nováková”); jmeno = null jmeno = null prijmeni = null prijmeni = null pocetZamestnancu = 0 public class Zamestnanec { private static int pocetZamestnancu; private String jmeno; private String prijmeni; public Zamestnanec (String jmeno, String prijmeni){ this.jmeno = jmeno; this.prijmeni = prijmeni; pocetZamestnancu ++; } ……………………………………. public static int getPocetZamestnancu(){ return pocetZamestnancu; } } Pepa Jana Nováková Novák 1 2

More Related