540 likes | 739 Views
4IT101. Druhá přednáška Datové typy a operátory Zapouzdření Pojem r o zhraní. Opakování a dokončení minulé přednášky. Základní vlastnosti objektů Datové atributy Metody deklarace metod a konstruktorů volání metod a konstruktorů. Třídy a jejich instance.
E N D
4IT101 Druhá přednáška Datové typy a operátory Zapouzdření Pojem rozhraní
Opakování a dokončení minulé přednášky Základní vlastnosti objektů Datové atributy Metody deklarace metod a konstruktorů volání metod a konstruktorů
Třídy a jejich instance • Objekty s podobnými vlastnostmi sdružujeme do tříd • Příslušnost objektu do třídy vyjadřujeme tvrzením, že objekt je instancí dané třídy(termíny objekt a instance jsou synonyma) • Třída je zvláštní druh objektu, který umí na požádání vytvořit svoji instanci (třída je „forma“ na vytváření svých instancí) • Třída = zobecněný klasický datový typ • Vedle množiny hodnot definuje i množinu přípustných operací nad těmito hodnotami • Jinými slovy: Třída definuje vlastnosti a schopnosti svých instancí
Základní pilíře OOP • Zapouzdření (kód je pohromadě se zpracovávanými daty) • Skrývání implementace(nikdo nemá mít šanci zjistit, jak je program implementován) • Zvýšení bezpečnosti a robustnosti (nemožnost nekorektního použití) • Usnadnění budoucích modifikací • Identita • Každá zpráva musí mít svého adresáta, nelze ji poslat „do prostoru“ • Objekt sám rozhodne, jak na zprávu zareaguje • polymorfizmus
Základní pilíře OOP • Skládání • Objekt může obsahovat jiné objekty • Dědičnost – speciální případ, při němž s objektem převezmu i jeho rozhraní • Omezuje duplicity v kódu • Nebezpečí špatného použití (narušuje zapouzdření) • Používání návrhových vzorů • Proč bych měl vymýšlet něco, co už je vymyšlené, a je to vymyšlené dobře
Deklarace třídy Tělo třídy public class Pes { private String rasa; private String jmeno; ....... } Hlavička třídy, musí obsahovat klíčové slovo class a identifikátor (jméno) deklarace datových atributů dále jsou deklarovány konstruktory a metody
Deklarace metody Jméno metody Typ návratové hodnoty Parametry metody Modifikátor přístupu publicStringgetRasa( ) { return rasa; } Klíčové slovo pro vrácení výsledku a ukončení metody Vracená hodnota
Deklarace metody Jméno metody public voidzmenVelikost(intnovyPrumer) { vymaz(); prumer = novyPrumer; kresli(); } Typ void určuje, že metoda nic nevrací formální parametr metody
Deklarace konstruktoru public class Pes { private String rasa; private String jmeno; publicPes (String rasa, String jmeno) { this.rasa = rasa; this.jmeno = jmeno; } ....... } modifikátor přístupu Formální parametry (slouží k inicializaci dat. atributů) Název třídy/typ návratové hodnoty
Konstruktor • Konstruktor můžeme vnímat jako metodu, která nemá název a název třídy v deklaraci označuje typ návratové hodnoty • nebo jako metodu, která se jmenuje stejně jako třída, jejíž instanci vytváří a typ návratové hodnoty se neuvádí • Je to jenom otázka interpretace částí definice • V debugeru a při vypisování výjimek je označován <init>
Odkaz na tuto instanci (this) public class Kruh { private int prumer; private int xPozice; private int yPozice; private String barva; /* * Vytvoreni noveho kruhu na defaultni pozici (20,60) s defaultni barvou (modra) */ public Kruh() { prumer = 30; xPozice = 20; yPozice = 60; barva = "modra"; kresli(); } this.prumer = 30; this.xPozice = 20; this.zPozice = 60; this.barva = "modra"; this.kresli();
Odkaz this public class Pes { private String rasa; private String jmeno; publicPes (String rasa, Stringjmeno) { this.rasa = rasa; this.jmeno = jmeno; } ....... }
Volání metody instance odkaz na vytvořenou instanci (identifikátor) mujPes.stekej(); StringrasaMehoPsa= mujPes.getRasa();
Použití konstruktoru Kruh kruh1 = new Kruh(); určení typu proměnné spuštění konstruktoru, v závorce mohou být hodnoty jednotlivých parametrů jméno proměnné (identifikátor) operátor new pro vytvoření instance přiřazovací příkaz
Primitivní datové typy celá čísla desetinná čísla znak logická hodnota (ano/ne, platí/neplatí, pravda/nepravda) Objektové (referenční) datové typy třída (class) rozhraní (interface) výčtový typ (enum) pole Datové typy v Javě
celá čísla byte (-27 až 27-1) short (-215 až 215-1) int (-231 až 231-1) long (-263 až 263-1) desetinná čísla float (max 3.4*1038) double(max 1.8*10308) logická hodnota boolean konstanty true a false znak char 16-bitové, UNICODE Primitivní datové typy
Konstanty primitivních datových typů • celočíselná konstanta je typu int 5 12457 intcisloDek = 10; intcisloOkt = 012; intcisloHex = 0xa; intcisloBin= 0b1010; intcisloSOddelovaci = 1_345_765; • reálná konstanta je typu double 6.254 2.5e20 (semilogaritmický tvar, = 2.5 x 1020)
Literály pro číselné typy • Zapsat celočíselnou konstantu typu long lze pomocí literálu 2L • Obdobně pro reálné konstanty 45.6f je typu float 5d je typu double
znaky 'a' 'B' ‘\u010D’ (č) ‘\u0000’ (prázdný znak) logická hodnota true false Konstanty primitivních datových typů
Operátory pro primitivní datové typy • přiřazení = • aritmetické +, - ,* , / , % +=, -=, *=, /=, %= ++, -- • relační ==,!=,< ,>,<=,>= • logické &&, ||, !,&, | • bitové operátory • ternární/podmíněný operátor ?: • operátor přetypování (cílový_typ)
Operátor přiřazení int cislo = 15; double celeCislo = 2.5; celeCislo = celeCislo + cislo; char znak = 'a'; znak = 'F'; double stavMehoUctu = mujUcet.getStav();
Aritmetické operátory + sčítání - odčítání * násobení / dělení %modulo
Dělení • double podil = 5/2; (2) • double podil = 5d/2; (2.5) • celočíselné dělení nulou – vznikne výjimka (ArithmeticException) • reálné dělení nulou – výsledkem je jedna z konstant Double.POSITIVE_INFINITY nebo Double.NEGATIVE_INFINITY
Jaký je výsledek ? System.out.println(12345 + 5432l); 5432L 17777
Relační operátory == rovná se != nerovná se < menší než > větší než <= menší nebo rovno >= větší nebo rovno
Logické operátory (cislo1 > 5) && (cislo2 !=0) • logické operátory jsou definovány pouze pro typ boolean (často se používají v kombinaci s výsledky relačních operátorů) && logický součin || logický součet ! negace
Přetypování • Přetypování existuje nezávisle pro primitivní i referenční typy • Přetypování čísel na delší typ (neztratí se žádná informace) probíhá automaticky. • byteshort int long float double int maleCislo = 2; long velkeCislo = maleCislo; double cislo = 5; přetypování int na long přetypování int na double
Operátor přetypování • Přetypování čísel na kratší typ musím uvést double desetineCislo = 5.0; int celeCislo = desetineCislo;☹ • překladač nás upozorní na nekompatibilitu typů a program nepřeloží. int celeCislo = (int)desetineCislo; • když uvedeme operátor přetypování, program lze přeložit, bude odseknuta desetinná část čísla.
Kulaté závorky kulaté závorky ( ) se v Javě používají na následujících místech: • ve složitějších výrazech pro vyjádření priority operací 3 x 5 + 6 (3 x 5) + 6 3 x (5 + 6) • jako operátor přetypování, • v deklaraci metod pro uzavření seznamu formálních parametrů, • při volání metod pro uvedení seznamu skutečných parametrů, • v příkazech selekce a iterace pro uvedení podmínky • při odchytávání výjimek
Primitivní a objektové (referenční) datové typy instance třídy String instance třídy Student instance třídy String
Objektové typy - konstanty • konstanta null • při deklaraci referenčního typu • NullPointerException při volání metody • řetězce "ahoj"
Objektovétypy – operátor přiřazení String text = "ahoj"; int cislo1 = 5; int cislo2 = cislo1; String text2 = text; obsah identifikátor instance třídy String s obsahem "ahoj"
Objektové typy -operátory • . (tečka) • == != porovnání odkazů • instanceof • class Integer cislo1 = newInteger(10); // vytvoření instance Integer cislo2 = cislo1; // zkopírování odkazu na instanci Integer cislo3 = newInteger(10); // vytvoření druhé instance System.out.print(cislo1 == cislo2); //výsledek je true System.out.print(cislo1 == cislo3); //výsledek je false System.out.print(cislo1.equals(cislo3)); //výsledek je true
Řetězcový operátor + "Ahoj" + "Tome" "AhojTome" int cislo = 5; "Výsledek je " + cislo +7; "Výsledek je 57" "Výsledek je " + (cislo +7); "Výsledek je 12"
Zapouzdření • V objektu jsou spojeny vlastnosti a schopnosti, které spolu souvisejí. • Kód je pohromadě se zpracovávanými daty • Skrývání implementace(nikdo nemá mít šanci zjistit, jak je program implementován) • Zvýšení bezpečnosti a robustnosti (nemožnost nekorektního použití) • Usnadnění budoucích modifikací • Objekt (instance) rozhoduje o svém stavu => datové atributy jsou z venku nepřístupné
Zapouzdření • K datovému atributu deklarovanému s modifikátorem private lze přistupovat pouze pomocí metod. • „Přečtení“datového atributu pomocí metody get…… • Nastavení hodnoty pomocí metody set…….
private typ nazev; publictypgetNazev() { return nazev; } private String rasa; publicStringgetRasa ( ) { return rasa; }
private typ nazev; publicvoidsetNazev(typnazev) { this.nazev = nazev; } private String rasa; publicvoidsetRasa (String rasa) { this.rasa = rasa; }
Pojem rozhraní (interface) • uživatelské rozhraní (user interface), • aplikační programové rozhraní (API, application programming interface), • „vzdálené“ rozhraní (remote interface) • rozhraní (interface) – jazyková konstrukce Javy a dalších objektově orientovaných jazyků,
import java.awt.*; /** * Ctverec, ktery se nakresli sam na Platno a se kterym je mozne manipulovat. * @author Michael Kolling * @author Lubos Pavlicek * @version 1.0 (15 July 2000) * @version 1.0cz (30 July 2004) */ public class Ctverec{ private int velikost; private int xPozice; private int yPozice; private String barva; /** * Vytvoreni noveho ctverce na defaltni pozici (60, 50) a s defaltni barvou (cervena). */ public Ctverec() { velikost = 30; xPozice = 60; yPozice = 50; barva = "cervena"; kresli(); }
API • jak metodu volat • dáno podpisem metody • kontroluje překladač • co je výsledkem metody a jsou nějak omezeny hodnoty parametrů • udává tzv. kontrakt (je to zapsáno v dokumentaci) • probíhá po zavolání metody
Interface jako jazyková konstrukce • jedná se pouze o popis rozhraní, neobsahuje žádnou implementaci • říká, co musí třída obsahovat za metody, pokud uvádí, že implementuje toto rozhraní
Kdy se interface používá? • Snížení závislosti mezi třídami • Jako odkaz na funkci
<<interface>> Ovladani zapnout() vypnout() Lampa zapnout() vypnout() ..... Tlacitko stisk ()