Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

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

Podobné prezentace


Prezentace na téma: "4IT1014IT101 Pátá přednáška Datové struktury - pokračování Statické prvky třídy."— Transkript prezentace:

1 4IT1014IT101 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 Obalové třídy primitivních typů 5801 Pepa 5802 Vašek Dušan 5804 Luboš Jarmila 5805 Renata 5806

8 Obalové třídy Ke každému primitivnímu typu existuje jeho objektový obal (obalová třída) primitivní typobalová třída byteByte shortShort intInteger longLong floatFloat doubleDouble charCharacter booleanBoolean

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 double [] poleRealCisel = {2.4, 5.7, 8.2, 5, 4.21} index hodnota Na jednotlivé položky pole se odkazujeme jménem pole a indexem položky. Indexuje se od nuly. poleRealCisel [0]

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 int vysl = sectiPrvkyPole(new int [] {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 int secti(int... cisla) { int soucet=0; for (int cislo: cisla) { soucet += cislo; } return soucet; } int vysl = 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 void vypisPole(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 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 typově bezpečné, odolnější vůči změnám, public void pridejTermin(DenVTydnu den, String odKdy, String doKdy, String popis) { // obsah metody } 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 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, for (DenVTydnu den : DenVTydnu.values() ) { System.out.println(den); } 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 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, public enum HodnoceniKurzu { VYBORNE("1"), VELMI_DOBRE("2"), DOBRE("3"), NEPROSPEL("4"), OMLUVEN("O"); private String pismeno; private HodnoceniKurzu(String pismeno) { this.pismeno=pismeno; }

35 Statické prvky třídy

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

37 Statické proměnné (proměnné třídy) 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) 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: Pepa prijmeni:Novák jmeno: Kája prijmeni: Maří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átory static 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(); Zamestnanec.getPocetZamestnancu(); název třídy název metody

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 Inicializace objektů v paměti ClassLoader Konstruktor je speciální metoda využívaná při vytváření instance, instanci vytváří JVM.

50 int pocet = Zamestnanec.getPocetZamestnancu(); Zamestnanec pepa = new Zamestnanec (“Pepa”,”Novák”); Zamestnanec jana = new Zamestnanec (“Jana”,”Nováková”); prijmeni = null jmeno = null pocetZamestnancu = 0 prijmeni = null jmeno = null Pepa Novák Jana 1 Nováková 2 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; }

51 Třída Math Třída ze standardu Javy, která obsahuje pouze statické konstanty a statické metody Třída nemá veřejný konstruktor, nelze tedy vytvořit instanci Takto navržená třída se označuje jako utilita

52 Třída Math Jsou zde dvě konstanty –Math.PI –Math.E Metody pro matematické funkce např. –Math.abs(double a) –Math.cos(double a) –Math.max(long a, long b) –Math.sqrt(double a)

53 Třída System další utilita ze základního balíčku java.lang poskytuje tři statické proměnné sloužící pro vstup a výstup z/na konzolu (lze přesměrovat jinam) –in –out –err

54 System.out Statická proměnná System.out je automaticky nasměrovaná na konzolu, je typu PrintStream Nejčastěji se používá pro volání dvou metod: println (String text) print (String text)

55 Třída System metody z této třídy slouží pro čtení properties, nastavení zabezpečení atd. metoda System.exit(int status) –k ukončení aplikace (pokud je někdy třeba skončit jinak než provedením všech příkazů)

56 Metoda main – spouštění javovské aplikace Aby bylo možno spustit aplikaci, musí existovat vstupní bod do aplikace Při spouštění JVM říkáme, jaká třída má být natažena do paměti první java MojeTrida JVM pak hledá v kódu metodu main s následující hlavičkou: public static void main (String [] args) Aplikace provede kód v metodě main a skončí –dříve – výjimky, return, metodou System.exit( ), –později – čekání na dokončení vláken

57 Parametry příkazové řádky public static void main(String [] args) Na příkazovém řádku je možno uvést parametry: java Trida ahoj "Dobry den" "ahoj""15""48""45.4""Dobry den" 01234

58 Použité zdroje Dokumentace k Javě (www.oracle.com) Pavlíčková, Pavlíček : Úvod do Javy Pecinovský: Myslíme objektově v jazyku Java Java a Duke jsou registrované známky firmy Oracle


Stáhnout ppt "4IT1014IT101 Pátá přednáška Datové struktury - pokračování Statické prvky třídy."

Podobné prezentace


Reklamy Google