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
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
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
Java Collection Framework
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
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)
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
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
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
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)
AutoboxingInteger cislo = 5;cislo += 2;
Integer cislo = new Integer (5);int pomocna = cislo.intValue(); // převod na primitivní typpomocna += 2;cislo = new Integer(pomocna);
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
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
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é
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"}
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]
Jednorozměrné pole
• Každé pole má datový atribut length, která obsahuje údaj o počtu prvků v poli.
poleRealCisel.length
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
Jednorozměrné pole jako parametr metody
int vysl = sectiPrvkyPole(new int [] {4, 6, 10, 20});
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;
}
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);
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)
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, },
}
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
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();
}}
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();
}}
Mazání v poli
43210
4.215.08.25.72.4
Jak smazat položku 8.2 (položku s indexem 2)?
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
Výčtový typVýčtový typVýčtový typVýčtový typ
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
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
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”);
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");
}
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;
} }
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;
}}
Statické prvky třídyStatické prvky třídyStatické prvky třídyStatické prvky třídy
Statické proměnnéDatové atributyStatický inicializační blokStatické metodyMetodyKonstruktoryVnitřní třídyStatické vnitřní třídy
Třída (další prvky)
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
...........
Deklarace třídy se statickou proměnnou
public class Zamestnanec { private static int pocetZamestnancu; private String jmeno; private String prijmeni;…………}
Vztah instancí k statické proměnné
pocetZamestnancu: 2
jmeno: Pepaprijmeni:Novák
jmeno: Kájaprijmeni: Mařík
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
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;
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");
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
Statická metoda (metoda třídy)
• Metoda společná pro všechny instance.
• Metoda třídy má modifikátor static.
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; }}
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
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ů
Inicializace
• Všechny objekty musíme vytvořit• S objekty manipulujeme pomocí
odkazů• Objekty nemusíme mazat• Zaručená inicializace pomocí
konstruktoru
Inicializace objektů v paměti
• ClassLoader• Konstruktor je speciální metoda
využívaná při vytváření instance, instanci vytváří JVM.
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; }}
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
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)
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
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)
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ů)
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
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
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