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

4IT101

  • Upload
    shakti

  • View
    27

  • Download
    0

Embed Size (px)

DESCRIPTION

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ů - PowerPoint PPT Presentation

Citation preview

Page 1: 4IT101

4IT101 4IT101 4IT101 4IT101

Pátá přednáškaPátá přednáška

Datové struktury - pokračováníDatové struktury - pokračování

Statické prvky třídyStatické prvky třídy

Page 2: 4IT101

Kolekce• Rozhraní• Implementace• Algoritmy

• Generické typy

• Všechny třídy jsou z balíčku java.util

<<interface>>

Collection

<<interface>>

List<<interface>>

Set

<<interface>>

Map

HashSet TreeSetArrayList LinkedList HashMap TreeMapCollections

Page 3: 4IT101

Java Collection Framework

Page 4: 4IT101

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

Page 5: 4IT101

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)

Page 6: 4IT101

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

Page 7: 4IT101

Obalové třídy Obalové třídy primitivních typůprimitivních typů

Obalové třídy Obalové třídy primitivních typůprimitivních typů

5801 Pepa

5802 Vašek Dušan

5804 Luboš Jarmila

5805 Renata

5806

Page 8: 4IT101

Obalové třídy

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

primitivní typ obalová třída

byte Byte

short Short

int Integer

long Long

float Float

double Double

char Character

boolean Boolean

Page 9: 4IT101

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)

Page 10: 4IT101

AutoboxingInteger cislo = 5;cislo += 2;

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

Page 11: 4IT101

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

Page 12: 4IT101

Jednorozměrná a Jednorozměrná a vícerozměrná polevícerozměrná poleJednorozměrná a Jednorozměrná a

vícerozměrná polevícerozměrná pole

Page 13: 4IT101

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é

Page 14: 4IT101

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"}

Page 15: 4IT101

double [] poleRealCisel = {2.4, 5.7, 8.2,

5, 4.21}

43210

4.215.08.25.72.4

index

hodnota

Na jednotlivé položky pole se odkazujeme jménem pole a indexem položky. Indexuje se od nuly.

poleRealCisel [0]

Page 16: 4IT101

Jednorozměrné pole

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

poleRealCisel.length

Page 17: 4IT101

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

Page 18: 4IT101

Jednorozměrné pole jako parametr metody

int vysl = sectiPrvkyPole(new int [] {4, 6, 10, 20});

Page 19: 4IT101

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;

}

Page 20: 4IT101

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);

Page 21: 4IT101

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)

Page 22: 4IT101

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, },

}

Page 23: 4IT101

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

Page 24: 4IT101

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();

}}

Page 25: 4IT101

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();

}}

Page 26: 4IT101

Mazání v poli

43210

4.215.08.25.72.4

Jak smazat položku 8.2 (položku s indexem 2)?

Page 27: 4IT101

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

Page 28: 4IT101

Výčtový typVýčtový typVýčtový typVýčtový typ

Page 29: 4IT101

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

}

<<enum>>DenVTydnu

Page 30: 4IT101

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");

<<enum>>DenVTydnu

Rozvrh

Page 31: 4IT101

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”);

Page 32: 4IT101

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");

}

Page 33: 4IT101

Výčtový typ uvnitř třídypublic 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;

} }

Page 34: 4IT101

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;

}}

Page 35: 4IT101

Statické prvky třídyStatické prvky třídyStatické prvky třídyStatické prvky třídy

Page 36: 4IT101

Statické proměnnéDatové atributyStatický inicializační blokStatické metodyMetodyKonstruktoryVnitřní třídyStatické vnitřní třídy

Třída (další prvky)

Page 37: 4IT101

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

...........

Page 38: 4IT101

Deklarace třídy se statickou proměnnou

public class Zamestnanec { private static int pocetZamestnancu; private String jmeno; private String prijmeni;…………}

Page 39: 4IT101

Vztah instancí k statické proměnné

pocetZamestnancu: 2

jmeno: Pepaprijmeni:Novák

jmeno: Kájaprijmeni: Mařík

Page 40: 4IT101

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

Page 41: 4IT101

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;

Page 42: 4IT101

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");

Page 43: 4IT101

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

Page 44: 4IT101

Statická metoda (metoda třídy)

• Metoda společná pro všechny instance.

• Metoda třídy má modifikátor static.

Page 45: 4IT101

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; }}

Page 46: 4IT101

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

Page 47: 4IT101

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ů

Page 48: 4IT101

Inicializace

• Všechny objekty musíme vytvořit• S objekty manipulujeme pomocí

odkazů• Objekty nemusíme mazat• Zaručená inicializace pomocí

konstruktoru

Page 49: 4IT101

Inicializace objektů v paměti

• ClassLoader• Konstruktor je speciální metoda

využívaná při vytváření instance, instanci vytváří JVM.

Page 50: 4IT101

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 = nullPepa

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; }}

Page 51: 4IT101

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

Page 52: 4IT101

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)

Page 53: 4IT101

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

Page 54: 4IT101

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)

Page 55: 4IT101

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ů)

Page 56: 4IT101

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

Page 57: 4IT101

Parametry příkazové řádkypublic static void main(String [] args)

• Na příkazovém řádku je možno uvést parametry:java Trida ahoj 15 48 45.4 "Dobry den"

"ahoj" "15" "48" "45.4" "Dobry den"

0 1 2 3 4

Page 58: 4IT101

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