Struktura složitějších programů. Rozhraní. Dědičnost. Obsah Objektové modelování reality........................................................................................2 Kroky řešení reálného problému na počítači .............................................................................2 Vývoj software je proces.......................................................................................................2 Celkový rámec vývoje SW....................................................................................................2 Metodiky vývoje SW ...........................................................................................................3 Metodika typu "vodopád" .....................................................................................................3 Srovnání Java - Pascal..........................................................................................................4 Organizace programových souborů.........................................................................................4 Organizace zdrojových souborů .............................................................................................4 Shromáždění informací o realitě.............................................................................................4 Jak zachytíme tyto informace ................................................................................................5 Modelování reality pomocí tříd..............................................................................................5 Rozhraní ...................................................................................................................5 Rozhraní ...........................................................................................................................5 Co je rozhraní.....................................................................................................................6 Deklarace rozhraní ..............................................................................................................6 Implementace rozhraní.........................................................................................................6 Využití rozhraní..................................................................................................................7 Dvě třídy implementující totéž rozhraní...................................................................................7 Dědičnost ..................................................................................................................7 Dědičnost ..........................................................................................................................7 Terminologie dědičnosti .......................................................................................................8 Jak zapisujeme dědění..........................................................................................................9 Dědičnost a vlastnosti tříd.....................................................................................................9 Příklad ..............................................................................................................................9 Příklad - co tam bylo nového ...............................................................................................10 Další příklad ....................................................................................................................11 Do třetice - víceúrovňová dědičnost......................................................................................11 Přístupová práva (viditelnost) ......................................................................................11 Přístupová práva ...............................................................................................................11 Granularita omezení přístupu...............................................................................................12 Typy omezení přístupu.......................................................................................................12 Kde jsou která omezení aplikovatelná?..................................................................................12 Příklad -publicWlKIPFniA .........................................................................................13 ľ i r p m- pil i. LbbiL i Příklad-protectedWlKIPEľllA ................................................................................... 13 Tnp rni1 pil i. LbbiL i Příklad - přátelský .............................................................................................................14 Příklad - private ................................................................................................................14 1 Struktura složitějších programů. Rozhraní. Dědičnost. Když si nevíte rady............................................................................................................15 Přístupová práva a umístění deklarací do souborů....................................................................15 Organizace tříd do balíků............................................................................................16 Zápis třídy do zdrojového souboru........................................................................................16 Organizace tříd do balíků....................................................................................................16 Balíky.............................................................................................................................16 Příslušnost třídy k balíku ....................................................................................................17 Deklarace import NázevTřidyWlKIPFniA ................................................................. 18 TTir Fnn-FiLi.L^nLi Deklarace import názevbaliku. *WlTCIPFMA ........................................................... 18 íli r tni" Fi» u Ľ Ban k i Objektové modelování reality • Kroky řešení problému na počítači - pár slov o SW inženýrství Kroky řešení reálného problému na počítači Generický (univerzální, obecný...) model postupu: 1. Zadání problému 2. Shromáždění informací o realitě a jejich analýza 3. Modelování reality na počítači a implementace požadovaných operací nad modelovanou realitou Vývoj software je proces... (podle JS, SW inženýrství): 1. při němž jsou uživatelovy potřeby 2. transformovány na požadavky na software, 3. tyto jsou transformovány na návrh, 4. návrh je implementován pomocí kódu, 5. kód je testován, dokumentován a certifikován pro operační použití. Celkový rámec vývoje SW V tomto předmětu nás z toho bude zajímat jen něco a jen částečně: 1. Specifikace (tj. zadání a jeho formalizace) 2 Struktura složitějších programů. Rozhraní. Dědičnost. 2. Vývoj (tj. návrh a vlastní programování) 3. částečně Validace (z ní především testování) 1. Specifikace SW: Je třeba definovat funkcionalitu SW a operační omezení. 2. Vývoj SW: Je třeba vytvořit SW, který splňuje požadavky kladené ve specifikaci. 3. Validace SW: SW musí být validován („kolaudován"), aby bylo potvrzeno, že řeší právě to, co požaduje uživatel. 4. Evoluce SW: SW musí být dále rozvíjen, aby vyhověl měnícím se požadavkům zákazníka. Metodiky vývoje SW Tyto generické modely jsou dále rozpracovávány do podoby konkrétních metodik. Metodika (tvorby SW) je ucelený soubor inženýrských postupů, jak řízeným způsobem, s odhadnutelnou spotřebou zdrojů dospět k použitelnému SW produktu. Některé skupiny metodik: strukturovaná • objektová Metodika typu "vodopád" Nevracím se nikdy o více jak jednu úroveň zpět: 1. Analýza (Analysis) 2. Návrh (Design) 3. Implementace (Implementation) 4. Testování (Testing) 5. Nasazení (Deployment) Nyní zpět k Jávě a jednoduchým programům... 3 Struktura složitějších programů. Rozhraní. Dědičnost. Srovnání Java - Pascal Co bude odlišné oproti dosavadním programátorským zkušenostem? Struktura a rozsah programu: Pascal program měl jeden nebo více zdrojových souborů (soubor = modul) tvořenými jednotlivými procedurami/fcemi, definicemi a deklaracemi (typů, proměnných...) Java (a některé další 00 jazyky): program je obvykle tvořen více soubory (soubor = popis jedné třídy) tvořenými deklaracemi metod a proměnných (případně dalších prvků) těchto tříd. Organizace programových souborů v Pascalu: zdrojové (.pasWlKlPFDlA "llir ľni- Fil ■■ L^b-iL ■ [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=.pas]) soubory, výsledný (jeden) spustitelný soubor (. exeWlKIPFľJlA ľlír p m- pil i. LbbiL i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=.exe]), resp. přeložené kódy jednotek (. tpuWlKIPFMA íli p p pit riii i. Laanb i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=.tpu]) • v Jave: zdrojové (. javaWlFCIPFFHA Ti r hni" Fik ■■ l-ainh i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=java]) soubory, přeložené soubory v bajtkódu (. classWlKľlPFFHA I i r V n i ■ Fib i ■ ■ ■ i h ■ [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=.class]) - jeden z nich spouštíme Organizace zdrojových souborů v Pascalu nebyla (nutná) v Jave je nezbytná - zdrojové soubory organizujeme podle toho, ve kterých balících j sou třídy zařazeny (přeložené soubory se implicitně ukládají vedle zdrojových) Shromáždění informací o realitě Zjistíme, jaké typy objektů se ve zkoumaném výseku reality vyskytují a které potřebujeme • člověk, pes, veterinář Zjistíme a zachytíme vztahy mezi objekty našeho zájmu 4 Struktura složitějších programů. Rozhraní. Dědičnost. • člověk-chovatel vlastní psa Zjistíme, které činnosti objekty (aktéři, aktoři) provádějí • veterinář psa očkuje, pes štěká, kousne člověka... Jak zachytíme tyto informace Jak zachytíme tyto informace: • neformálními prostředky - tužkou na papíře vlastními slovy v přirozeném jazyce • formálně pomocí nějakého vyjadřovacího aparátu - např. grafického jazyka • pomocí CASE nástroje přímo na počítači Zatím se přidržíme neformálního způsobu... Modelování reality pomocí tříd Určení základních tříd, tj. skupin (kategorií) objektů, které mají podobné vlastnosti/schopnosti: • Person WltlPFDlA Tkr Fn,- F.. -L^.Vj [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=Person] • AccountWlKlfT.TJlA "ľlír ľni- Fil i. L-^a-iL i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search= Account] Rozhraní Rozhraní V Jávě, na rozdíl od C++ neexistuje vícenásobná dědičnost - • to nám ušetří řadu komplikací • ale je třeba to něčím nahradit 5 Struktura složitějších programů. Rozhraní. Dědičnost. Pokud po třídě chceme, aby disponovala vlastnostmi z několika různých množin (skupin), můžeme ji deklarovat tak, že implementuje více rozhraní Co je rozhraní • Rozhraní je vlastně popis (specifikace) množiny vlastností, aniž bychom tyto vlastnosti ihned implementovali Vlastnostmi zde rozumíme především metody. Říkáme, že určitá třída implementuje rozhraní, pokud implementuje (tedy má - přímo sama nebo podědí) všechny vlastnosti (tj. metody), které jsou daným rozhraním předepsány. • Javové rozhraní je tedy množina hlaviček metod označená identifikátorem - názvem rozhraní, (a celých specifikací - tj. popisem, co přesně má metoda dělat - vstupy/výstupy metody, její vedlešjí efekty...) Deklarace rozhraní • Vypadá i umisťuje se do souborů podobně jako deklarace třídy • Všechny metody v rozhraní musí být publicWlKlPFMA •**i " 11T :, r*j.:r. [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=public] a v hlavičce se to ani nemusí uvádět. • Těla metod v deklaraci rozhraní se nepíší. (Metody v rozhraní tudíž vypadají velmi podobně jako abstraktní metody ve třídách, ale nemusím psát abstract.) Příklad deklarace rozhraní public interface Informing { void writelnfo(); } Implementace rozhraní Příklad public class Person implements Informing { public void writelnfo() { 6 Struktura složitějších programů. Rozhraní. Dědičnost. } } Čteme: Třída Person implementuje rozhraní Informing. 1. Třída v hlavičce uvede implements NázevRozhrani WlKIPEľJlA "Ifcr Fni- Fib i. Lfv-ibi [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=implements NázevRozhrani] 2. Třída implementuje všechny metody předepsané rozhraním Využití rozhraní 1. Potřebujeme-li u jisté proměnné právě jen funkcionalitu popsanou určitým rozhraním, 2. tuto proměnnou můžeme pak deklarovat jako typu rozhraní - ne přímo objektu, který rozhraní implementuje. Příklad Informing petr = new Person("Petr Novák", 1945); petr.writelnfo(); // "petr" stači deklarovat jen jako Informing // jiné metody než předepsané timto intf. // nepotřebujeme! Dvě třídy implementující totéž rozhraní Totéž rozhraní může implementovat více tříd, často konceptuálne zcela nesouvisejících: • Rozhraní Going ("jdoucí") implementují dvě třídy: Car (auto má schopnost "jít", tedy jet) • Clock (hodiny také "jdou") Viz příklad - projekt v BlueJ - car clockWlKIPEMA [http ://cs. wikipedia. org/wiki/Speci%C3 %A lln%C3 %AD: Search?search=car_clock] Dědičnost Dědičnost 7 Struktura složitějších programů. Rozhraní. Dědičnost. V realitě jsme často svědci toho, že třídy jsou podtřídami jiných: • tj. všechny objekty podtřídy jsou zároveň objekty nadtřídy, např. každý objekt typu (třídy) Chova-telPsuWlIílfT.TJlA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=ChovatelPsu] je současně typu ClovekWlICIPFrjlA Tif F*n-i- Fil i. Ln^ki [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=Clovek]nebo • např. každý objekt typu (třídy) PesWlKlPFTJlA Imp p pit riL i. Lnni [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=Pes] je současně typu Do- maciZvire Trir ľni- Fil i. L-aa-iL i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=DomaciZvire] (alespoň v našem výseku reality - existují i psi "nedomácí"...) Podtřídaje tedy "zjemněním" nadtřídy: • přebírá její vlastnosti a zpravidla přidává další, rozšiřuje svou nadtřídu/předka V Jávě je každá uživatelem definovaná třída potomkem nějaké jiné - neuvedeme-li předka explicitně, je předkem vestavěná třída ObjectWlrlPFTJlA Hli r put Fib n bnihi [http ://cs. wikipedia. org/wiki/Speci%C3 %A lln%C3 %AD: Search?search=Obj ect] Terminologie dědičnosti Terminologie: • Nadtřídě (superclass) se také říká "(bezprostřední) předek", "rodičovská třída" • Podtřídě (subclass) se také říká "(bezprostřední) potomek", "dceřinná třída" Dědění může mít i více "generací", např. PersonWlKlPFrjlA li r p n t Fík i. ■■■■h ■ [http ://cs. wikipedia. org/wiki/Speci%C3 %A lln%C3 %AD: Search?search=Person] <- Emp 1 o y e e WlKlPFMA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=Employee] <- Hip p'pín- Fjb i. L-ra-iL. ManagerWlKIPFniA "Tkr Fn-i- Fík i. L-^a-iL i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=Manager] (osoba je rodičovskou třídou zaměstnance, ten je rodičovskou třídou manažera) Přeneseně tedy předkem (nikoli bezprostředním) manažera je člověk. Struktura složitějších programů. Rozhraní. Dědičnost. Jak zapisujeme dědění Klíčovým slovem extends WlKlPFľllA Tnr ľni- Fib i. L^biLi [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD: Search?search= extends ]: public class Employee extends Person { ... popis vlastnosti (proměnných, metod...) zaměstnance navic oproti člověku... } Dědičnost a vlastnosti tříd Jak víme, třídy popisují skupiny objektů podobných vlastností Třídy mohou mít tyto skupiny vlastností: • Metody - procedury/funkce, které pracují (především) s objekty této třídy • Proměnné - pojmenované datové prvky (hodnoty) uchovávané v každém objektu této třídy Vlastnosti jsou ve třídě "schované", tzv. zapouzdřené (encapsulated) Třída připomíná pascalský záznam (record), ten však zapouzdřuje jen proměnné, nikoli metody. Dědičnost (alespoň v javovém smyslu) znamená, že dceřinná třída (podtřída, potomek) • má všechny vlastnosti (metody, proměnné) nadtřidy • + vlastnosti uvedené přímo v deklaraci podtřídy Příklad Cíl: vylepšit třídu [http ://cs. wikipedia. org/wiki/Speci%C3 %A lln%C3 %AD: Search?search=Ucet] Postup: 1. Zdokonalíme náš příklad s účtem tak, aby si účet "hlídal", kolik se z něj převádí peněz 2. Zdokonalenou verzi třídy Account WlKlPFľllA Tli r pni" r ik i. Laanb i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=Account ]nazveme Cre-ditAccountWlKIPFMA Trir rni1 Fib i. ľ hi k i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=CreditAccount] UcetWlKIPEľJlA Tli r hni1 Fib ■■ Lnikri 9 Struktura složitějších programů. Rozhraní. Dědičnost. Příklad 1. Příklad kompletního zdrojového kódu třídy ke stažení zde [http://www.fi.muni.cz/~tomp/java/ucebnice/javasrc/tomp^anka/KontokorentniUcet.java] public class CreditAccount extends Account { // private double balance; znovu neuvádíme // ... zdědi se z nadtřidy/předka "Account" // kolik mohu "jit do minusu" private double creditLimit; public void add(double amount) { if (balance + creditLimit + amount >= 0) { // zavoláme původni "neopatrnou" metodu super.add(amount); } else { System.err.printin("Nelze odebrat částku " + (-amount)); } } // public void writelnfo() ... zdědi se // public void transferTo(Account to, double amount) ... zdědi se // ... předpokládejme, že v třidě "Učet" používáme variantu: // add(-amount); // to.add(amount); // } Vzorový zdroják sám o sobě nepůjde přeložit, protože nemáme třídu, na níž závisí. Příklad - co tam bylo nového • Klíčové slovo extends WlĽIPFľHA Hli r priT Fib i. Laanb i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=extends] - značí, že třída CreditAccountWlKIPF.TllA ílir rni- Fib i. Lniki [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=CreditAccount] je potom-kem/podtndou/rozšířením/dceřinnou třídou (subclass) třídy Account WlfCIPFDlA ľlír p m- Fib i. Ľaaib i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search= Account]. • Konstrukce super.metoda ( . . . ) Tip V pit Fil i. l-aiifc i 10 Struktura složitějších programů. Rozhraní. Dědičnost. [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=super.metoda(...);] značí, zeje volána metoda rodičovské třídy/předka/nadtřídy {superclass). Kdyby se nevolala překrytá metoda, superWlKlřT.THA "Tkr Pni- Fi» t. LniLi [http://cs.wikipedia.org/wiki/Speci%C3%A1 ln%C3%AD:Search?search= super] by se neuvádělo. • Větvení if() {...} else { . . . } WlKlPF.ÍllA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=if() {...} else {...}] - složené závorky se používají k uzavření příkazů do sekvence - ve smyslu pascalského begin/end. Další příklad Demoprojekt private_accoun TTir Fn-i- Fík ■■ L-^b-iL i [http://es.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=privat e account] : • výchozí třída Account • podědíme do třídy PrivateAccount (osobní/privátní účet) • zde přibude nová vlastnost - proměnná "vlastník" nesoucí odkaz na osobu vlastnící tento účet. Do třetice - víceúrovňová dědičnost Neplést s vícenásobnou - více úrovněmi myslíme častou situaci, kdy ze třídy odvodíme podtndu, z ní zase podtndu... Demoprojekt checked_private_accoun tWlKIPFMA TTir Fn-i- Fn. ■■ L-^a-iL i [http://es.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=checke d private account] : • výchozí třída Account (obyčejný účet) • podědíme do třídy PrivateAccount (osobní/privátní účet) z ní podědíme do třídy CheckedPrivateAccount (osobní účet s kontrolou minimálního zůstatku) Přístupová práva (viditelnost) Přístupová práva Přístup ke třídám i jejim prvkům lze (podobně jako např. v C++) regulovat: 11 Struktura složitějších programů. Rozhraní. Dědičnost. • Přístupem se rozumí jakékoli použití dané třídy, prvku... • Omezení přístupu je kontrolováno hned při překladu -> není-li přístup povolen, nelze program ani přeložit. • Tímto způsobem lze regulovat přístup staticky, mezi celými třídami, nikoli pro jednotlivé objekty • Jiný způsob zabezpečení představuje tzv. security manager, který lze aktivovat při spuštění JVM. Granularita omezení pnstupu Přístup je v Jávě regulován jednotlivě po prvcích ne jako v C++ po blocích Omezení přistupuje určeno uvedením jednoho z tzv. modifikátoru přístupu {access modifier) nebo naopak neuvedením žádného. Typy omezení pnstupu • Existují čtyři možnosti: • public Píp rriT rib u Lnifai [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=public] = veřejný • protectedWllCIPFniA TTir Fn-i- Fík ■■ l^B-ib i [http ://cs. wikipedia. org/wiki/Speci%C3 %A lln%C3 %AD: Search?search=protected] = chráněný • modifikátor neuveden = říká se lokální v balíku nebo chráněný v balíku nebo "přátelský" • privateWlICIPFrilA — i " iiT :,i*j.ir. [http ://cs. wikipedia. org/wiki/Speci%C3 %A lln%C3 %AD: Search?search=private] = soukromý Kde jsou která omezení aplikovatelná? Pro třídy: • veřejné - public neveřejné - lokální v balíku Pro vlastnosti tříd = proměnné/metody: 12 Struktura složitějších programů. Rozhraní. Dědičnost. • veřejné - public • chráněné - protected neveřejné - lokální v balíku soukromé - private Příklad - public™™!?. [http://cs.wikipedia.Org/wiki/Speci%C3%A1ln%C3%AD:S earch?search=public] publicWlKIPFTílA íl r P pit ML i. i-iink i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=public] => přístupné odevšad public class Account { } třída Account [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=Account ]je veřejná = lze např. • vytvořit objekt typu AccountWlKlPFDlA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=Account] i v metodě jiné třídy • deklarovat podtřídu třídy AccountWlKIPFFHA Tnr p ni1 pil i. LbbiLi [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=Account] ve stejném i jiném balíku Příklad - protected?™™!* [http://cs.wikipedia.Org/wiki/Speci%C3%A1ln%C3%AD:S earch?search=protected] protectedWlKIPFDlA *Dip tm1 Fil i. Bi^h i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=protected] => přístupné jen z podtříd a ze tříd stejného balíku public class Account { // chráněná proměnná 13 Struktura složitějších programů. Rozhraní. Dědičnost. protected float creditLimit; } používá se jak pro metody (velmi často), tak pro proměnné (méně často) Příklad - přátelský lokální v balíku = přátelský=> přístupné jenže tříd stejného balíku,už ale ne z podtříd, jsou-li v jiném balíku public class Account { Date created; // přátelská proměnná } • používá se spíše u proměnných než metod, ale dost často se vyskytuje z lenosti programátora, kterému se nechce psát protectedWlLIPFFtlA Hi r priT r ik i. l-iint i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=protected] • osobně moc nedoporučuji, protože svazuje přístupová práva s organizací do balíků (-> a ta se může přece jen měnit častěji než např. vztah nadtrida-podtridaWlTCIPFFHA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=nadtřída-podtřída].) • Mohlo by mít význam, je-li práce rozdělena na více lidí na jednom balíku pracuje jen jeden člověk -pak si může přátelským přístupem chránit své neveřejné prvky/třídy -> nesmí ovšem nikdo jiný chtít mé třídy rozšiřovat a používat přitom přátelské prvky. • Používá se relativně často pro neveřejné třídy definované v jednom zdrojovém souboru se třídou veřejnou. Příklad - private privat eWlKIPFMA TTir ľni- Fík u L■■-■> i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=private] => přístupné jen v rámci třídy, ani v podtŕídách - používá se častěji pro proměnné než metody označením private prvek znevidíteIníme i případným podtřídám! public class Account { private String owner; } proměnná 14 ownerWUHPFFUA Tli r 1-riT r i h i. Lnifai Struktura složitějších programů. Rozhraní. Dědičnost. [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=owner] je soukromá = nelze k ní přímo přistoupit ani v podtřídě -je tedy třeba zpřístupnit proměnnou pro "vnější" potřeby jinak, např. • přístupovými metodami setOwner (String m) WlKIPFTJlA Trjr ľni- Fi» ■ Lf«*ti [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=setOwner(String m)] a String getOwner( Tpi r priT Fib i. ĽaanL i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=StringgetOwner()] Když si nevite rady Nastavení přístupových práv k třídě pomocí modifikátoru se děje na úrovni tříd, tj. vztahuje se pak na všechny objekty příslušné třídy i na její statické vlastnosti (proměnné, metody) atd. Nastavení musí vycházet z povahy dotyčné proměnné či metody. Nevíme-li si rady, jaká práva přidělit, řídíme se následujícím: • metoda by měla být publicWlKIPEIIlA Ihr Fni- Fil i. L-kjiiLi [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=public], je-li užitečná i mimo třídu či balík - "navenek" • jinak protectedVťllCIPF:l")lA Tfjf p'ni- Fib ■ LbvbIi [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=protected] • máme-li záruku, že metoda bude v případných podtřídách nepotřebná, může být private Wrl KI Pľ. I JIA [http://cs.wikipedia.org/wiki/Speci%C3%A11n%C3%AD:Search?search=private] - "n.r r'n-i- Fil i. L^a-iL^ ale kdy tu záruku máme??? proměnná by měla být privateWlKIPEfllA "Tk*- Tni- Fil i. LriiLi [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=private], nebo protec-tedWlťlPFDlA ílir rni- Fil i. unikl [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=protected], je-li potřeba přímý přístup v podtřídě téměř nikdy bychom neměli deklarovat proměnné jako publicWlKIPElJlA Tli r F*n i ■ Fib i ■ I ■ ■ ■ i k i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=public]! Přístupová práva a umístění deklarací do souborů • Třídy deklarované jako veřejné (publicWlKIPEľllA flip p pit Fib i. L mi b ■ 15 Struktura složitějších programů. Rozhraní. Dědičnost. [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=public]) musí být umístěné do souborů s názvem totožným s názvem třídy (+přípona . j ava lir p ni1 pil i. LniLi [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=.java]) i na systémech Windows (vč. velikosti písmen) • kromě takové třídy však může být v tomtéž souboru i libovolný počet deklarací neveřejných tříd • privateWlKIPFMA Tlir ľni- riL i. L>anki [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=private] nemají význam, ale přátelské ano Organizace tříd do balíků Zápis třídy do zdrojového souboru Soubor Person.java Trip V pi i" Fib i. Ľ Bai It i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=erson.java] bude obsahovat (pozor na velká/malá písmena - v obsahu i názvu souboru): public class Person { ... popis vlastnosti (proměnných, metod...) osoby ... } publi cWlKIPFniA Trip r'n-i- Fík i. L-■,■-■■ i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=public] značí, že třída je "veřejně" použitelná, tj. i mimo balík Organizace tříd do balíků Třídy zorganizujeme do balíků. V balíku jsou vždy umístěny související třídy. Co znamená související? • třídy, jejichž objekty spolupracují • třídy na podobné úrovni abstrakce • třídy ze stejné části reality Balíky 16 Struktura složitějších programů. Rozhraní. Dědičnost. Balíky obvykle organizujeme do hierarchií, např.: • cz.muni.fi.pbl62 ílir rni- riL i. unikl [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=cz.muni.fi.pbl62] • cz . muni . f i . pbl62 . banking WHTIPFMA Ihr rni- riL i. l-BBifc i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=cz.muni.fi.pbl62.banking] • cz.muni. fi.pbl62.banking.creditWlKIPF:ľJlA Thr Fm- Fib i. L^Bil i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=cz.muni.fi.pbl62.banking.c ředit] Neplatí však, že by třídy "dceřinného" balíku (např. cz .muni . fi .pbl62 .banking, credit) • byly zároveň třídami balíku "rodičovského" (cz .muni . fi .pbl62 . bankingWlKIPRniA ííi r priT Fit i. LniLi ) I I [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=cz.muni.fi.pbl62.banking]! Hierarchie balíků má tedy význam spíše pro srozumitelnost a logické členění. Příslušnost třídy k balíku Deklarujeme ji syntaxí: package názevbaliku;WlPCIPEfllA ílir p m- Fib i. Laaabi [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=packagenázevbalíku;] • Uvádíme obvykle jako první deklaraci v zdrojovém souboru; Příslušnost k balíku musíme současně potvrdit správným umístěním zdrojového souboru do adresářové struktury; např. zdrojový soubor třídy PersonWlKlPRMA íli r p n t Fit i. ĽBini i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=Person] umístíme do podadresáře cz\muni\fi\pbl62WlK:iPF.rjlA "Rip p'n-i- Flu i_ L-n-ik i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=cz\muni\fi\pbl62] • Neuvedeme-li příslušnost k balíku, stane se třída součástí implicitního balíku - to však nelze pro jakékoli větší a/nebo znovupoužívané třídy či dokonce programy doporučit a zde nebude tolerováno! 17 Struktura složitějších programů. Rozhraní. Dědičnost. Deklarace import NázevTřidyTÍS^IÍ [http://cs.wikipedia.Org/wiki/Speci%C3%A1ln%C3%AD:S earch?search=import NázevTřídy] Deklarace import nesouvisí s děděním, ale s organizací tříd programu do balíků: • Umožní odkazovat se v rámci kódu jedné třídy na ostatní třídy Syntaxe: import názevtřidy; WlfCIPF.ÍllA ITir tni" Fib k Lniki [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=import názevtřidy;] • kde názevtřidy je uveden včetně názvu balíku Píšeme obvykle ihned po deklaraci příslušnosti k balíku (package názevbaliku; WIKIPFMA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=package "Tli* ľni- Fil i. Ljv-iL i názevbaliku;]) Import není nutné deklarovat mezi třídami téhož balíku! Deklarace import názevbaliku. *ÍK55£ [http://cs.wikipedia.org/wiki/Speci%C3%A1ln%C3%AD:S earch?search=import názevbaliku.*] Pak lze používat všechny třídy z uvedeného balíku Doporučuje se "import s hvězdičkou" nepoužívat: • jinak nevíme nikdy s jistotou, ze kterého balíku se daná třída použila; • i profesionálové to však někdy používají:-) • lze tolerovat tam, kde používáme z určitého balíku většinu tříd; • v tomto úvodním kurzu většinou tolerovat nebudeme! "Hvězdičkou" nezpřístupníme třídy z podbalíků, např. • import lli r rnn1 Pil i. LniL ■ [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=import cz.*] nezpřístupní třídu cz.muni. fi .pbl62 . PersonWllflPFniA T i r r m- Pil i. l-iinh i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=cz.muni.fi.pbl62.Person] 18 Struktura složitějších programů. Rozhraní. Dědičnost.