1 / 59

4IT101 šestá přednáška

4IT101 šestá přednáška. Statické prvky třídy. 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. Statické prvky tříd.

Download Presentation

4IT101 šestá přednáška

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šestá přednáška

  2. Statické prvky třídy

  3. 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

  4. Statické prvky tříd • Statické datové atributy – data společná všem instancím, existují i bez instancí, jakmile s nimi chceme pracovat • Statické metody – obdobně jako u statických datových atributů je možné je volat bez existence instance • V deklaraci je použito klíčové slovo static

  5. 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

  6. Návrhový vzor UtilitaKnihovní jednotka • Je třeba vytvořit skupinu všeobecně přístupných metod případně konstant, není důvod pro existenci instancí. • Řešení je vytvořit třídu se statickými metodami (případně konstantami) a vytvořit soukromý konstruktor.

  7. 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

  8. 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)

  9. 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

  10. 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)

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

  12. Návrhový vzor SingletonJedináček • V aplikaci je třeba, aby existovala pouze jedna snadno dostupná instance dané třídy. Např. plátno v projektech s kreslením. • Realizuje se pomocí soukromého konstruktoru a statické metody getInstance().

  13. private static PlatnoplatnoSingleton; /**Tovarni metoda pro ziskani instance * tridyPlatno - singleton. */ public static PlatnogetPlatno() { if(platnoSingleton == null) { platnoSingleton = newPlatno("Demonstrační plátno",300, 300,Color.WHITE); } platnoSingleton.setVisible(true); returnplatnoSingleton; } privatePlatno(String titulek, int sirka, intvyska, ColorbarvaPozadi){

  14. 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

  15. Parametry příkazové řádky public 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"

  16. Mapy Datové struktury pro uložení dvojice klíč - hodnota

  17. Pepa • Vašek Dušan • 5804 Luboš Jarmila • Renata • 5806 Mapy pondělí 8 úterý 9 středa 7 čtvrtek 10 pátek 6

  18. Mapy • Lze si je představit jako tabulku se dvěma sloupci. První sloupec představuje klíč, žádné dva klíče si nejsou rovny. Druhý sloupec představuje hodnoty, tady se údaje mohou opakovat. • dvě základní implementace: HashMap TreeMap

  19. Deklarace a inicializace mapy • Červeně označená část inicializace může být ve verzi Javy 7 vynechána (operátor diamant) private Map <String, Long> pocetSlov = new HashMap<String, Long>(); private Map <Long, Osoba> telSeznam = new HashMap<Long, Osoba>(); private Map <DenVTydnu, Double> odpracovanoHodin= new TreeMap<DenVTydnu, Double>();

  20. Metody pro mapy

  21. Vytvoření a naplnění mapy Map <String, Integer> mapa = new HashMap<String,Integer>(); mapa.put("pes", 2); mapa.put("pes", 3); mapa.put("kočka", 1); mapa.put(“morče", 1); System.out.println(mapa); {pes=3, morče=1, kočka=1}

  22. přičtení jedničky k hodnotě v mapě mapa.put(druh, mapa.get(druh) + 1); se převede na následující operace Integer pocetO = mapa.get("pes“); int pocetN = pocetO.intValue(); Integer pocetVysl = new Integer(pocetN + 1); mapa.put("pes", pocetVysl); Jak by vypadal rychlejší kód pro přičítání jedničky?

  23. Procházení mapy • přes množinu klíčů – získá se metodou keySet() • pomocí cyklu for • pomocí iterátoru – při rušení prvků for (String klic : mapa.keySet() ){ System.out.println(klic+"\t"+mapa.get(klic)); }

  24. Pepa • Vašek Dušan • 5804 Luboš Jarmila • Renata • 5806 Mapa seznamů Map<Integer, List<String> > telSeznam; telSeznam = new HashMap<Integer, List<String>> ();

  25. void pridejPrvek(inttelCislo, String jmeno) { if (mapa.containsKey(telCislo)){ List <String> seznamJmen = mapa.get(telCislo); seznamJmen.add(jmeno); } else { List <String> seznamJmen = new ArrayList<String>(); seznamJmen.add(jmeno); mapa.put(telCislo, seznamJmen); } } public void vypisSeznam (){ Set<Integer> seznamKlicu = mapa.keySet(); for (IntegertelCislo :seznamKlicu){ List <String> seznamJmen = mapa.get(telCislo); System.out.print(telCislo + "\t\t"); for(String jmeno : seznamJmen) { System.out.print(jmeno +", "); } System.out.println(); } }

  26. Procházení seznamů • Pomocí cyklu for („foreach“) seznamy, množiny, pole • Pomocí indexů v cyklu for pouze seznamy (List) a pole • Přes iterator seznamy, množiny

  27. Procházení kolekce - “for each” for(typ identifikátor : kolekce) { příkaz; } for (String zvire : seznam){ System.out.println(zvire); } for (String zvire : mnozina){ System.out.println(zvire); }

  28. Procházení seznamu s využitím indexů for (int i = 0; i < seznam.size(); i++) { System.out.println ("" + i + ". " + seznam.get(i)); } 0. morče 1. kočka 2. pes

  29. Odebírání ze seznamů a množin public void odeber(String druh) { for(String zvire : seznam){ if (zvire.equals(druh)){ seznam.remove(druh); } } } java.util.ConcurrentModificationException

  30. Rozhraní (interface) Iterator<E> public void odeber(String druh){ Iterator<String> ukazovatko = seznam.iterator(); while (ukazovatko.hasNext()) { String zvire = ukazovatko.next(); if (zvire. equals(druh)){ ukazovatko.remove(); } } } • hasNext() • next() • remove() identifikátor iterátoru !!!!

  31. Znaky a textové řetězce

  32. Znaky • primitivní typ char, Unicode, 2B char cSHackem = ’č’; char nejakyZnak = ’\u12ab’; • matematické operace – lze přičítat/odečítat pozice v tabulce Unicode • obalová třída Character • též statické metody pro znaky static boolean isDigit(char c); static boolean isLetter(char c); static boolean isLowerCase(char c); static char toLowerCase(char c); static char toUpperCase(char c);

  33. Escape znaky \ttabulátor \n nový řádek \“uvozovky \’ apostrof \\zpětné lomítko \uxxxx vložení znaku Unicode

  34. Národní znaky a překladač • různá kódování : ISO-8859-2, CP1250, UTF8 javac–encoding utf8 Trida.java • native2ascii – převede do přenositelného tvaru: "čeština" => "\u00c4\u0164e\u0139\u02c7tina"

  35. Třída String read-only třída String str = “abc”; String str = new String(“abc”); spojování řetězců str = str + “def”; připojování dalších typů str = “vysledek “ + 5; str = “výsledek “ + 3 + 5; str = “výsledek “ + (3 + 5); str = “Účet: “ + mujUcet; String.valueOf() o.toString()

  36. Metody třídy String int length() boolean equals(String str) boolean equalsIgnoreCase(String str) boolean endsWith(String koncovka) boolean startsWith(String str)

  37. public classPorovnani { public static voidmain(String[] args) { String ret1 = "length: 10"; String ret2 = "length: " + 10; String ret3 = "length: "+ret1.length(); System.out.println(ret1 == ret2); System.out.println(ret1 == ret3); System.out.println(ret2 == ret3); } } Co vypíše následující kód? true true true false false false true false false

  38. Metody pro práci s řetězci String toLowerCase() String toUpperCase() String substring(int beginIndex) String substring(int beginIndex, int endIndex) int indexOf(String str) char[] toCharArray()

  39. Formátování řetězců • metoda format() ve třídě String, metody printf() u výstupních operací (PrintStream či PrintWriter), • interně se používá třída java.util.Formatter příklady: String vystup = String.format("strana: %d/%d“, strana, pocetStran); System.out.printf("úhly – alfa: %f6.4, beta: %f6.4, gama: %f6.4%n“, alfa, beta, gama); System.out.printf("%-30s %2d %f4.2%n", prijmeni, semestr, prumer);

  40. Formátování řetězců • specifikace formátu %[argument_index$][příznaky][šířka][.přesnost]konverze konverze: d celé číslo v dekadickém tvaru x, h celé číslo hex, f desetinné číslo g desetinné číslo, u velkých čísel vědecký formát t formátování datumu a času b boolean s text, výsledek toString(), popř. null příznaky - zarovnání vlevo 0 vypíše se úvodní nula + u čísel i znaménko + , vloží se oddělovač řádů dle národního prostředí

  41. Lokalizace • některé operace s textem závisí na nastavení jazyka a země, tzv. Locale, • třída java.util.Locale, • Metody závislé na Locale: • format(), • toLowerCase, • toUpperCase() • při spuštění JVM se nastaví defaultní Locale,

  42. StringBuffer StringBuilder • pomocné třídy pro práci s řetězci • „rychlejší“ operace s řetězci, int length() StringBuffer append(String str) StringBuffer append(Object o) StringBuffer insert(int pozice, String str) StringBuffer insert(int pozice, Object o) StringBuffer delete(int zacatek, int konec) String toString() String substring(int beginIndex) String substring(int beginIndex, int endIndex)

  43. Použití třídy StringBuffer for (String klic: mapa.keySet()) { StringBuffer sb = new StringBuffer(); sb.append("zvire "); sb.append(klic); sb.append(", pocet kusu "); sb.append(mapa.get(klic)).toString(); String radek = sb.toString(); } for (String klic: mapa.keySet()) { String radek = "zvire "+klic+", pocet kusu "+mapa.get(klic); }

  44. Použití třídy StringBuilder StringBuilder sb = new StringBuilder(60); for (String klic: mapa.keySet()) { sb.delete(0, sb.length()); sb.append("zvire ").append(klic); sb.append(", pocet kusu ").append(mapa.get(klic)); String radek = sb.toString(); }

  45. Regulární výrazy • od verze 1.4 • regulární výraz je posloupnost znaků a symbolů, která definuje skupinu textových řetězců. • balíček java.util.regex: • třídy Pattern a Matcher • výjimka PatternSyntaxException • rozšíření třídy String

  46. Třídy Pattern a Matcher Pattern p = Pattern.compile("a*b"); Matcher m = p.matcher("aaaaab"); boolean b = m.matches();

  47. Metody třídy String využívající regulární výrazy matches(String vzor) replaceAll(String vzor, String repl) replaceFirst(String vzor, String repl) split(String vzor) split(String vzor, int n)

  48. Syntaxe regulárních výrazů • jednotlivé znaky: x konkrétní znak \\ zpětné lomítko (jeden znak) \0n znak zadaný pomocí oktalové soustavy (0-377) \xhh znak zadaný pomocí hexadecimální soustavy \uhhhh znak z Unicode zadaný pomocí hexadecimální soustavy \ttabelátor \nznak LF (linefeed, newline) \rznak CR (carriage-return) \eznak escape

  49. Syntaxe regulárních výrazů • množiny znaků, tj jeden ze znaků v zadané množině [abc] jednoduchá množina (tj. jeden ze znaků a b c) [^abc] negace, tj. žádný ze znaků a b c, [a-zA-Z] rozsah znaků (znaky a až z a znaky A-Z) . (tečka) libovolný znak \d číslice, tj. [0-9] \Dnečíslice, tj. [^0-9] \s “netisknutelné” znaky, tj mezera, tabelátor, znaky konce řádku a konce stránky, \Sopak \s

  50. Syntaxe regulárních výrazů • označení hranic ^ začátek řetězce $konec řetězce \bhranice slova • znaky opakování ? předchozí znak bude 1x nebo 0x, * 0 a více opakování předchozího znaku, +předchozí znak je minimálně jedenkrát, {n} přesně n opakování předchozího znaku, {n,} minimálně n opakování předchozího znaku, {m,n} minimálně m a maximálně n opakování předchozího znaku,

More Related