1 / 49

Po čítače a programování 1

Po čítače a programování 1. 6. přednáška. Třídy a objekty. Deklarace tříd a objektů Vytváření objektů Objekt y a reference. Úvod. Základní předpoklad jazyku Java: Chceme ji používat k objektově orientovanému programování V Javě je vše považováno za objekt, dokonce i program v Javě

Download Presentation

Po čítače a programování 1

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. Počítače a programování 1 6.přednáška

  2. Třídy a objekty Deklarace tříd a objektů Vytváření objektů Objekty a reference

  3. Úvod • Základní předpoklad jazyku Java: • Chceme ji používat k objektově orientovanému programování • V Javě je vše považováno za objekt, dokonce i program v Javě • Každý programovací jazyk obsahuje vlastní prostředky určené k manipulaci s daty • Programátor si musí systematicky uvědomovat, o jaký typ manipulace se právě jedná – zda se bude s objektem manipulovat přímo či prostřednictvím určitého typu nepřímého vyjádření • Java – jednodušší – vše je považováno za objekt, identifikátor je ve skutečnosti odkazem na příslušný objekt

  4. Úvod • Co stanovuje typ objektu? • Vytváření nových datových typů: třída Většina objektově orientovaných jazyků používá klíčové slovo class • Třída(Class) — je základním stavebním kamenem v objektově orientovaném jazyce

  5. Třída (class)– základní pojmy • Třída (objektový typ) je jakási šablona (nemá přidělenou žádnou paměť). • Při návrhu definice nové třídy lze do třídy vložit dva typy prvků: • datové členy (též nazývané pole nebo položky), • členské funkce (zpravidla nazývané metodami).

  6. Třída (class)– základní pojmy • Třída se v skutečnosti skládá: • ze souboru proměnných (členské proměnné, datové složky, atributy), • podprogramů (metod), které manipulují s členskými proměnnými (daty) . • Členské proměnné (atributy) - reprezentují stav objektu – jsou v nich uloženy informace o objektu • Metody – manipulují s členskými proměnnými a obecně mění stav objektu

  7. Objekty – základní pojmy • Objekt (object) – je datový prvek, který je vytvořen podle vzoru třídy (tzv. instance třídy). Podle jednoho vzoru třídy je možné vytvořit libovolné množství objektů

  8. Příklad třídy a objektů First Instantiation: Object name: patsCar amount of fuel: 10 gallons speed: 55 miles per hour license plate: “135 XJK” Objekty, které jsou instancí třídy Deklarace třídy Second Instantiation: Object name: suesCar amount of fuel: 14 gallons speed: 0 miles per hour license plate: “SUES CAR” Class Name: Automobile Data: amount of fuel ________ speed ________ license plate ________ Methods (actions): increaseSpeed: How: Press on gas pedal. stop: How: Press on brake pedal. Third Instantiation: Object name: ronsCar amount of fuel: 2 gallons speed: 75 miles per hour license plate: “351 WLF”

  9. Deklarace třídy • Program v Javě obsahuje vždy alespoň jednu třídu • Deklarace třídy : specifikátor class jmeno { deklarace členských proměnných ….. deklarace metod třídy }

  10. Deklarace třídy • Specifikátor určuje přístupová práva k atributům a metodám třídy. • Je-li použit specifikátor public znamená to, že proměnné i metody jsou volně přístupné komukoliv. • Pozor !!! každá publictřída musí být uložena v samostatném souboru. • Metoda main()nemusí být součástí každé třídy – pokud ji neuvedeme, nic se nestane.

  11. Soubory tříd • Každá třída definovaná v Javě musí být v samostatném souboru. • Soubor má stejné jméno jako třída, ke jménu souboru je připojena přípona ".java" • Dobré programátorské doporučení:První písmeno ve jménu třídy (tedy i souboru) je velké, následují malá písmena • MyClass.java pro třídu MyClass • Všechny třídy, které potřebujete pro spuštění programu, uložte do stejného adresáře.

  12. Deklarace třídy • Po deklaraci se třída stává univerzálním vzorem. • Pomocí tohoto vzoru a klíčového slova new lze vytvořit objekty. • Nejsou-li objekty dané třídy vytvořeny, je třída bezvýznamná.

  13. Příklad public class Obdelnik { /* – třída, která reprezentuje obdélníky*/ public int sirka; public int vyska; public int obvod() { int pom; pom=2 * (sirka + vyska); return pom; } Public int obsah() { return (sirka*vyska); } }

  14. Vytvoření objektu • Syntax: class_Name instance_Name = new class_Name(); • Vytvoření objektu provází dvě akce: • Deklarace referenční proměnné příslušného typu (v předchozím příkladu Obdelnik), která v sobě bude uchovávat referenci na skutečný objekt (instanci) – bude na něj odkazovat. • Dynamické vytvoření instance (objekt) třídy pomocí new.

  15. Vytvoření objektu • Příklad: Obdelnik obd; /* ted je deklarovana referencni promenna, ale zadny objekt, nelze pouzit ani metody, ani promenne*/ obd = new Obdelnik(); /* ted se dynamicky vytvorila instance (objekt) tridy Obdelnik přes referencni promennou lze pouzit metody i promenne (jsou implicitne nastaveny na nulu)*/

  16. Vytvoření objektuproměnná instance • Pokud se v deklaraci proměnných nevyskytuje klíčové slovo static, jedná se o proměnné instance . • Proměnné vznikají až na základě použití new – každá instance této třídy má své vlastní proměnné. • Proměnné patří ke konkrétní instanci - instančníproměnné . • Stejná pravidla platí i pro metody uvedené v proměnné instanci, nedají se použít samostatně (jako statické), jejich použití je vázáno na konkrétní instanci.

  17. Přímý přístup k datům objektu • Hodnoty proměnných konkrétní instance lze samozřejmě měnit, k označení je používána tečková notace. Jmeno_ref_promen.jmeno_promen_instance = “hodnota”; • Příklad: obd.vyska = 2; obd.sirka = 9; • Pozor: Nepříliš bezpečná manipulace, je-li použit specifikátor public znamená to, že proměnné i metody jsou volně přístupné komukoliv.

  18. Metody • Pro přístup k metodám je používán stejný způsob zápisu jako pro přístup k datům. Identifikator_promen = Jmeno_ref_promen.jmeno_metody(); • Příklad: i= obd.obvod(); • Metodě není předáván žádný parametr, přesto je zápis a následný chod programu správný – metoda pracuje implicitně nad daty své instance (upřesnění, která je to instance, určuje referenční proměnná).

  19. Metody a TřídyKonvence jmen Dobré programátorské návyky • Užívejte slovesa pro názvy void metod • Provádějí akci • Užívejte podstatná jména pro názvy metod, které vracejí hodnotu • Vytvářejí (vracejí) část dat, konkrétní hodnotu • Začínejte jména tříd velkými písmeny. • Začínejte jména metod malými písmeny.

  20. Klíčové slovo this • Klíčové slovothismá speciální význam pro objekty. • Je to rezervované slovo, tj. nesmí být použito jako identifikátor proměnné, třídy nebo metody • Ostatní rezervovaná slovaint, char, main, etc. • thisv sobě skrývá jméno právě volaného objektu (každá metoda má v sobě skrytý tento implicitní parametr (nemusí být nikde deklarován), který odkazuje na tuto instanci. • Java umožňuje použití parametruthis: • Pokud metoda přistupuje pouze k svým datům, není potřeba tento parametr využívat, přesto jej však někdy uvádíme (viz pozdější výklad).

  21. Příklad použitíthis • Příkladem může býtvoid metoda, která v sobě navíc obsahuje klíčové slovo this: public void writeOutput() { System.out.println("Name = " + this.name); System.out.println("Population = " + this.population); System.out.println("Growth rate = " + this.growthRate + "%"); }

  22. Příklad použitíthis • this referujejméno objektu, který následně aktivuje writeOutput metodu

  23. Vytvoření nového objektu - prakticky • Kam se vlastně zapíší příkazy pro vytvoření nového objektu? • Řešení: • zápis do metody main, která je součástí dané třídy, • nebo je možné vytvořit objekt v kterékoliv jiné třídě.

  24. Příklad public class Obdelnik { /* – třída, která reprezentuje obdélníky*/ public int sirka; public int vyska; public int obvod() { int pom; pom=2 * (sirka + vyska); return pom; } public int obsah() { return (sirka*vyska); }

  25. Public static void main(String[] args){ Obdelnik obd = new Obdelnik(); obd.vyska = 2; obd.sirka = 9; System.out.println („Obvod je:“+obd.obvod()); } } Vypíše se: Obvod je: 22

  26. KonstruktorConstructor • Vytváření nových objektů: • Deklarace s inicializací (viz předchozí příklad) • Inicializace datových prvků objektu (popř. dalších akcí) voláním specializované metody konstruktor • Konstruktor má vždy stejné jméno jako je jméno třídy • Konstruktor je metoda, která nemá žádnou návratovou adresu, ale může mít libovolný počet parametrů i různých typů

  27. public class Obdelnik { /* – třída, která reprezentuje obdélníky*/ public int sirka; public int vyska; public Obdelnik(int parSirka, int ParVyska) { sirka = parSirka; vyska = parVyska; } /*ostatní deklarace metod se nemění */

  28. Public static void main(String[] args){ Obdelnik obd = new Obdelnik(2,9); System.out.println („Obvod je:“+obd.obvod()); } }

  29. Doporučené použití Public static void main(String[] args){ Obdelnik obd = new Obdelnik(2,9); System.out.println („Obdélník výšky:“+obd.vyska+ „Obdélník šířky:“+obd.sirka+ „má obvod:“+obd.obvod()); }

  30. Přetížení konstruktorů • Konstruktorje speciální metoda navržená k inicializaci proměnných instance • Je automaticky volána, když je objekt vytvářen pomocínew • Má stejné jméno jako třída • Přetížení konstruktoru (více než jeden konstruktor pro stejnou definici třídy) – možnost inicializace vznikající objekt různými způsoby • Různé verze inicializace všech, některých, nebo žádných proměnných instance • Každý konstruktor má odlišný typ (různý počet nebo pořadí parametrů)

  31. Definování konstruktorů • Hlavička konstruktorů neobsahuje slovovoid • Ve skutečnosti neobsahuje ani návratový typ • Konstruktor bez parametrů je default constructor • Jestliže není poskytnut žádný konstruktor, Java vytváří automatickydefault constructor • Jestliže je poskytnut jakýkoliv konstruktor, pak žádný konstruktor není vytvářen automaticky Programátorský tip • Vložte konstruktor, který inicializuje všechny instanční proměnné • Vložte konstruktor, který nemá žádné parametry • Vložte svůj vlastnídefault constructor

  32. public class Obdelnik { /* – třída, která reprezentuje obdélníky*/ public int sirka; public int vyska; public Obdelnik(int Sirka, int Vyska) { this.sirka = Sirka; this.vyska = Vyska; }

  33. // tri ruzne konstruktory public Obdelnik(int sirka, int vyska) { this.sirka = sirka; this.vyska = vyska; } public Obdelnik(Obdelnik o) { sirka = o.sirka; //this neni nutne this.vyska = o.vyska;//zlepsi se citelnost } public Obdelnik() { sirka = 1; vyska = 1; }

  34. public int obvod() { int pom; pom=2 * (sirka + vyska); return pom; } Public int obsah() { return (sirka*vyska); } }

  35. // pouziti Public static void main(String[] args){ Obdelnik obd = new Obdelnik(2,9); Obdelnik dalsi = new Obdelnik(obd);Obdelnik jednotk = new Obdelnik();System.out.println („Obvod je:“+obd.obvod()); System.out.println („Obvod je:“+dalsi.obvod()); System.out.println („Obvod je:“+jednot.obvod()); } Výsledky:Obvod je: 18; Obvod je: 18; Obvod je: 4;

  36. this – přístup ke konstruktoru • Speciální využití v přetížených konstruktorech • Pomocí this() může konstruktor vyvolat konstruktor vyvolat jiný konstruktor téže třídy • Volání this() se vythahuje na konstruktor, který má stejné parametry (shodují se do počtu i pořadí) • Upozornění: volání pomocí this() musí být první příkaz ve volajícím konstruktoru

  37. // pouziti – prepis dalsich konstruktoru jako volani jiz popsaneho konstruktoru public Obdelnik(int sirka, int vyska) { this.sirka = sirka; this.vyska = vyska; } public Obdelnik(Obdelnik o) { this(o.sirka,o.vyska); } public Obdelnik() { this(1,1);

  38. Volání metod jinými metodami • Metody instance mohou volat jiné metody instancí z dané třídy – důvod: metody jedné třídy jsou si rovny a neexistuje mezi nimi žádný vztah podřízenosti či nadřízenosti • Konstruktor třídy může vyvolat všechny metody téže třídy a může vyvolat i všechny konstruktory téže třídy • Metodě je dovoleno zavolat konstruktor pouze prostřednictvím operátoru new

  39. //volani metody teze tridy konstruktorem public void nastavSirku(int sirka) { this.sirka = sirka; } public Obdelnik(int sirka, int vyska) { nastavSirku(sirka); this.vyska = vyska; }

  40. Objekt a proměnná třídy • Ve třídě je možno deklarovat proměnnou uvozenou klíčovým slovem static • Proměnná deklarovaná uvedeným způsobem nebude duplikována v instancích této třídy – bude patřit pouze této třídě – v programu existuje pouze v jedné kopii (jedná se vlastně o „globální“ proměnnou této třídy) • Proměnná se nazývá proměnná třídy (na rozdíl od proměnné instance)

  41. Objekt a proměnná třídy • Tato proměnná je využitelná i případě, pokud třída nemá žádné instance (nebyly dosud vytvořeny žádné objekty pomocí operátoru new • K proměnné třídy lze také přistoupit pomocí klíčového slova this, ale nedoporučuje se – vhodnější je přístup pomocí jména třídy

  42. Inicializace proměnných třídy • Proměnné instance lze inicializovat pomocí konstruktoru – v případě proměnných třídy nevhodné (při každém novém objektu by se opět inicializovaly) • Řešení: • Inicializace se provede přímo v deklaraci • Je-li nutno inicializovat např. pole konstant – použijeme statický inicializační blok (static initialization block)

  43. public class Prvocisla { public static final int MAX = 1000; public static final int cisla[] = new int[MAX]; static { int pocet = 2; cisla[0] = 1; cisla[1] = 2;

  44. dalsi: for (int i = 3; pocet < MAX; i+= 2) { for (int j = 2; j < pocet; j++) { if (i % cisla[j] == 0) { continue dalsi; } } cisla[pocet] = i; pocet++; } } // konec statickeho inicializacniho bloku

  45. Public static void main(String[] args){ System.out.println (“Prvnich “+ MAX + ”prvocisel”); for (int i = 0; i < Prvocisla.cisla.length; i++) System.out.println (cisla[i] + “ ”); } } // konstanty nemusi mit prirazenou hodnotu pri deklaraci // lze ji priradit kdekoliv, ale pouze jednou

  46. Rušení objektů - čistič paměti garbage collector • Je-li objekt nepotřebný – neexistuje na něj žádný odkaz z existujících referenčních proměnných • Zajištění neplatnosti odkazu: • Do referenční proměnné se přiřadí odkaz na jiný objekt • Nebo • Referenční proměnná se přímo „vynuluje“

  47. Rušení objektů - čistič paměti garbage collector • garbage collector běží na pozadí programu s nízkou prioritou • Omezí program pouze v případě nutnosti: • Dojde k nedostatku paměti a je nutno uvolnit nepotřebné části. • garbage collector je přímo volán příkazem System.gc(); - velmi neobvyklý případ

  48. Ukončení práce s objektyfinalizer • Finalizer je metoda instance (nesmí být static), která vrací void • Má vyhrazené jméno finalize()a nemá žádné parametry • Musí být pouze jeden (nelze přetěžovat) • Tvar hlavičky: protected void finalize() throws Trouwable { • Poslední příkaz: super.finalize() • Poznámka: použití má význam pouze v případě, má-li objekt ještě jiné zdroje než přidělenou paměť

  49. Závěr • Doporučení: • Inicializujte proměnné instance v konstruktoru, nikoliv v deklaraci • Dodržujte při deklaraci třídy následující pořadí: • Proměnné • Konstanty • Metody

More Related