OOP - Objektově Orientované Programování

Slides:



Advertisements
Podobné prezentace
A1PRG - Programování – Seminář Ing. Michal Typová konverze, oblast platnosti, paměťové třídy 9 Verze
Advertisements

(instance konkrétní třídy)
Seminář C++ 5. cvičení Dědičnost Ing. Jan Mikulka.
Přednáška č. 3 Normalizace dat, Datová a funkční analýza
Pole, ukazatele a odkazy
ÚVOD DO CPP 7 Dědičnost - pokračování
BLIŽŠÍ POHLED NA TŘÍDY, DĚDIČNOST - úvod
PJV151 Vnořené a vnitřní členy mohou být členy tříd a interfejsů. Je-li X obalem Y a Y je obalem Z, pak Z získá jméno X$Y$Z - kompilací vzniknou classy.
4IT1014IT101 Pátá přednáška Datové struktury - pokračování Statické prvky třídy.
Polymorfismus Dědičnost
C# pro začátečníky Mgr. Jaromír Osčádal
Databázové systémy II Přednáška č. 6 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky
Programování v C++ Cvičení.
Principy překladačů Mezikód Jakub Yaghob.
Čtvrté cvičení Objektové programování Objektový model v Javě
Programování PA - 2.
J a v a Začínáme programovat Lucie Žoltá metody, objekty, konstruktor.
Objekty v CLIPSu RNDr. Jiří Dvořák, CSc.
State. State – kontext a problém Kontext  chování objektu má záviset na jeho stavu, který se typicky mění za běhu Neflexibilní řešení  metody obsahují.
Páté cvičení Dědičnost Interface Abstarktní třídy a metody
KONCEPTUÁLNÍ MODELOVÁNÍ
Třída jako zdroj funkcionality
Adapter. Adapter – pojem Součástka navržená k propojení dvou „nekompatibilních“ zařízení Definice slova podle Cambridge Advanced Learner's Dictionary:
Objektové orientované programování Objektově orientované problémy v PHP Lukáš Masopust 2008.
Objektové programování
Jedenácté cvičení Vlákna. Java cv112 Vlákna Operační systém Mutitasking – více úloh se v operačním programu vykonává „současně“ Java Multithreading -
C# - OOP (object oriented programming)
Strategy. Strategy – „All-in-1“ na začátek class AStrategy { public: virtual void Algorithm()=0; protected: AStrategy(); }; class SpecificStrategy: public.
6. cvičení Polymorfismus
Počítače a programování 1
PB161 Právo friend, přetěžování operátorů, přetypování PB161 | Friend, operátory PB161 – Programování v jazyce C++ Objektově Orientované Programování.
KIV/PPA1 cvičení 8 Cvičící: Pavel Bžoch. Osnova cvičení Objekty v Javě Třída Konstruktor Metody Metody a proměnné třídy x instance Program sestávající.
OSNOVA: a) Úvod do OOPb) Třídy bez metod c) Třídy s metodamid) Konstruktory a destruktory e) Metody constf) Knihovní třídy g) Třídy ve tříděh) Přetížení.
Algoritmizace a programování Objektově orientované programování - 16 Mgr. Josef Nožička IKT Algoritmizace a programování
C# - předávání parametrů Centrum pro virtuální a moderní metody a formy vzdělávání na Obchodní akademii T.G. Masaryka, Kostelec nad Orlicí.
IB111 Programování a algoritmizace
Návrh a tvorba WWW Přednáška 5 Úvod do jazyka PHP.
OSNOVA: a) Přetížení členských funkcí b) Dědičnost tříd Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně Počítače a programování 2 pro obor EST BPC2E.
Dědičnost - inheritance dědičnost je jednou z forem znovupoužitelnosti dědičnost je jednou z forem znovupoužitelnosti B A Třída A je předkem třídy B Třída.
7. Typ soubor Souborem dat běžně rozumíme uspořádanou množinu dat, uloženou mimo operační paměť počítače (na disku). Pascalský soubor je abstrakcí skutečného.
13/04/20151 Datový typ třída – class (1) Datový typ definovaný uživatelem Poskytuje mechanismus pro modelování entit, s nimiž manipulují aplikace Charakterizuje.
Databázové modelování
Metodika objektového přístupu při tvorbě překladačů. Marek Běhálek Informatika a aplikovaná matematika FEI VŠB-TU Ostrava.
Šesté cvičení Výjimky Balíky.
Principy OOP Objektově orientované programování vychá-zí ze třech základních principů (rysů): zapouzdření (encapsulation) dědičnost (inheritance) polymorfismus.
Netrvaloppa21 Vytvořte třídu Student pro reprezentaci struktury student na ZČU. Atributy třídy budou fakulta a osobniCislo. Název třídy: Student proměnné.
PJV031 Přetypování (casting) Objekty, atributy, lokální proměnné, parametry a návratové hodnoty metod mají definovaný, neměnný typ. Jsou dva druhy typů:
Decorator. Rozšiřuje objekty o dodatečné chování  rozšiřuje konkrétní objekty, ne třídy  rozšiřuje objekt dynamicky, tj. za běhu Upřednostňuje kompozici.
Počítače a programování 1 7.přednáška. Základy Pole ve třídách a metodách Pole Arrays.
Jazyk C A0B36PRI - PROGRAMOVÁNÍ Část II.
Počítače a programování 1 2.přednáška. Základní lexikální struktura programu Program v jazyce Java je tvořen symboly a oddělovači Program Java je psán.
Strategy. Motivace Různé algoritmy pro stejnou akci Hromada kódu v mnoha podmínkách Důsledky  Komplexnost  Špatná čitelnost  Těžká správa kódu  Těžka.
Template Method. Motivační příklad – reálný svět Čaj 1) Uvař vodu 2) Dej do hrnku sáček čaje 3) Zalij hrnek 4) Přisyp cukr a vymačkej citrón Káva 1) Uvař.
PJV16 1 Dokumentace Tvorba dokumentace byla vždy útrpnou záležitostí neboť: programátoři ji krajně neradi dělají - a pokud - tak až nakonec, nebývala žádná.
NÁZEV ŠKOLY: S0Š Net Office, spol. s r.o., Orlová-Lutyně AUTOR: Ing. Adéla Tomalová NÁZEV: Podpora výuky v technických oborech TEMA: Objektově orientované.
PJV15 1 Vnořené ( nested ) a vnitřní ( inner ) členy Třídy či interfejsy mohou být členy tříd či interfejsů. Je-li X obalem Y a Y obalem Z, pak Z získá.
Vývojová prostředí Objektově Orientované Programování OB21-OP-EL-KON-DOL-M Orbis pictus 21. století.
SOLID principy v OOP návrhu
Y36PJC Programování v jazyce C/C++
Úvod do C# - OOP Jaroslav BURDYS 4IT.
OOP OOP (Object Oriented Programming)
Vícerozměrná pole (1) Jazyk C povoluje, aby pole mělo více rozměrů (dimenzí) než jeden Z vícerozměrných polí bývá nejčastěji použí-váno pole dvourozměrné.
Generické typy jsou třídy či interfejsy deklarující tzv. typové parametry jimiž: systematizují typovou kontrolu kompilátorem, vyjadřují jasněji smysl,
Návrhový vzor Flyweight
Polymorfismus = Mnohotvarost
Bridge.
Reflexe jako introspekce
C# přehled vlastností.
NÁZEV ŠKOLY: S0Š Net Office, spol. s r.o., Orlová-Lutyně
Výčtové typy ( Java 5 ) Výčtové typy jsou speciální třídy zavedené pro větší bezpečí a pohodlí. V nejjednodušší variantě se definují příkladmo takto:
Transkript prezentace:

OOP - Objektově Orientované Programování Klasické procedurální ( tj. neobjektově ) programování využívá jen primitivní typy, jejich pole a statický kontext - tj. statické atributy, statické metody, statické inicializátory a výčty. Pro řešení řady problémů je tento přístup naprosto vyhovující. Leč objektová metodika ( analýza OOA, design OOD, programování OOP ), výrazně usnadňuje tvorbu, údržbu a rozvoj složitého softwaru. Objektový přístup je velmi přirozený: pohlíží na softwarové entity a vztahy často tak, jakoby by byly z materiálního světa a běžného života, což usnadňuje pochopení a tvorbu konstrukcí pomocí analogií a metafor. PJV02 ALG

Java vyniká Pořádkem Přísným, fixním typování jmen, literálů, hodnot, výrazů, objektů. Abstrakci ( abstraction ), tj. zobecnění pohledů a částečná řešení. Dědičností ( inheritance ), tj. získávání vlastností a schopností děděním z vhodné třídy a případně i dat nebo částečných požadavků z interfejsů. Polymorfismem ( polymorphism ), tj. jednotné zacházení s různými ( mnohotvarými ) objekty mající některé společné zděděné schopnosti. Zapouzdřením ( encapsulation ), tj. skrývání části tříd a interfejsů. Dobrovolnou doporučenou etiketou. Podporou dokumentace. PJV02 ALG

Pořádek v Javě Třída ( class ), interfejs ( interface, tj. rozhraní či interfejs) a výčet ( což je speciální třída typu enum ) jsou základní stavební kameny. Sídlí v balíčcích ( package ), přístup k nim umožňuje: import import static ( jen pro statické metody a proměnné ) Zdrojové soubory, tj. kompilační jednotky, s extenzí .java obsahují: Jeden příkaz package - je vždy první. Lze ho sice vynechat – pak se jedná o tzv. noname space – nedoporučuje se. Několik příkazů import [ static ] pro snadný přístup k jiným balíčkům. import java.lang.*; je neodstranitelný nutný default. Definice tříd, interfejsů a výčtů v libovolném pořadí. Komentáře dokumentační ( třídy, interfejsu a jejich složkami): /** */ řádkové resp. blokové (kdekoli): // resp. /* */ PJV02

Kompilátor javac A.class abstract class B { … } B.class classpath = C:\xxx ; ... kompilační jednotka C.java xxx package aa.bb.cc; aa import zz.*; import uu.vv.E; import static zz.ss.G.*; import static zz.nn.G.m; bb cc A.class javac C.java abstract class B { … } B.class public class C { … } C.class enum M { … } interface P { … } M.class class A { … } P.class interface R { … } R.class Tento příklad neukazuje možnosti vnořených a vnitřních členů tříd a interfejsů bytecodes PJV02

Pořádek Ve zdrojovém souboru může být nanejvýš jedna vrcholná (top) třída, výčet či interfejs s modifikátorem public - pak dle onoho musí být pojmenována kompilační jednotka. Kompilátor vytvoří tolik souborů bytekódu, kolik je ve zdrojovém tříd, výčtů a interfejsů ( i vnitřních ). Ty mají shodná jména s extenzí .class. ( Vnitřní třídy či interfejsy mají vlastní jména složená ze sekvence jmen vnějších tříd či interfejsů oddělených dolarem. ) Aplikaci ( jako svůj podprogram ) spouští JVM (Java Virtual Machine) řádkovým příkazem java -cp C:\xxx -Dxxx=123 aa.bb.cc.C uuu vv w kde -cp značí -classpath, -D pro vklad dat do proměnné xxx uuu vvv w jsou řetězy předané metodě main jako String[ ] args JVM přijme bytekódový soubor jen tehdy, leží-li v adresáři na cestě dané classpath prodloužené dle operandu v příkazu package. PJV02

Účel tříd a interfejsů Třídy slouží jako: - Úložiště statického kontextu tj. statických položek tříd. - Plán pro tvorbu objektů obsahující nestatické položky. - Zdroj neprivátních členů pro dědictví potomkům. - Privátní zdroj funkcionality potomků. - Vstup do aplikace: public static void main(String [ ] args) Interfejsy slouží jako norma či požadavek. - Nemají konstruktory ani inicializátory. - Mohou: mít jen final static atributy, - mít jen abstract metody – ty nemají funkcionalitu, - být i prázdné – tzv. tagging interfejsy, - definovat static konkrétní metody, - definovat default nestatické konkrétní metody. - Implementující třídy nemusejí tyto metody redefinovat. - Metody abstract a default metody lze vzájemně překrývat. Java 8 PJV02

Typy Jménům se v definici přiřadí neměnitelný typ, který může být: - primitivní – primitivních typů je jen 8. - referenční, tj. dle: - dle třídy nebo interfejsu, - pole ( primitivních hodnot anebo referencí ). - void ( prázdný ) - jen jako návratový typ metod ( tedy procedur ). Konstruktory nevyznačují návratový typ – ten je dán jménem třídy. Musejí mít jméno shodné se jménem své třídy. Java nemá destruktory – ničení objektů zajišťuje garbage collector. PJV02

Jména Všechny položky programu musejí být rozlišitelné různými jmény. V některých případech se rozlišují položky shodných jmen dle principu "košile-kabát". Třídy a interfejsy jsou rozlišitelné pomocí úplných jmen. Ta jsou dána prefixem dle příkazu package a jejich prostým jménem. Atributy přejímají úplná jména tříd či interfejsů jako prefix prostých jmen. Metody a konstruktory přejímají úplná jména tříd či interfejsů jako prefix vlastních signatur. Signatura metod i konstruktorů se skládá z jejich vlastních jmen a sekvenci typů jejich parametrů. Metody i konstruktory v téže třídě mohou mít shodná jména, avšak různé signatury - pak jsou tzv. přetížené ( overload ). Což je vhodné, mají-li obdobnou funkcionalitu. PJV02

Abstrakce a konkretizace Abstrakce je důležitým pohledem na oba světy: ten reálný i ten virtuální, je základem taxonomie složitých systémů. Abstrakce má tvar stromu: směrem ke kořeni abstrahujeme ( vypouštíme detaily ), směrem k listům konkretizujeme ( přidáváme a realizujeme detaily ). Pomocí abstrakce lze vytvářet velmi užitečné, ač neúplné, abstraktní plány. Vyjasňují strukturu systému a po pozdějším doplnění vedou k plánům úplným - tedy konkrétním. Jen podle konkrétních plánů ( tříd ) lze vytvářet výrobky ( objekty ). Konkrétní třída může zabránit konstrukci objektů privatizací všech svých konstruktorů modifikátorem private a případně ani nepřipustí jejich použití jiným způsobem. ( Např. java.lang.Math. ) PJV02

Abstraktní třídy, metody a interfejsy Abstraktní třída má modifikátor abstract - konkrétní třída nikoli. Má alespoň jeden konstruktor, nelze však podle ní objekty vytvářet. Nemusí mít žádnou abstraktní metodu. Abstraktní třída nemůže být finální. Má-li třída abstraktní metodu ( vlastní definovanou či zděděnou a nepřekrytou na konkrétní ), pak musí být označena jako abstract. Statický kontext ( tj. static atributy, metody, inicializátory, výčty ) abstraktní třídy je funkční. Abstraktní metoda má v definici místo těla jen středník, např.: public abstract int compareTo( Object o ) ; Interfejs přípomíná značně omezenou abstraktní třídu, jež má všechny metody abstraktní ( modifikátor abstract je defaultem ). Ten umožňuje jednak částečný pohled na objekty a jednak slouží jako požadavek, předpis či norma. Lze říci, že normuje své potomky. PJV02

Abstrakce, dědičnost a polymorfismus Object Object P U E A A Q F D B B R R S G C C T Abstrakce ( po šipkách ) - úží pohled - konkrétní plán Typy: Vztahy: - abstraktní plán extends (rozšiřuje) implements (splňuje) - norma, předpis, požadavek PJV02

Polymorfismus Polymorfismus se týká jen překrytých nestatických metod - umožňují objektům různým podtypům daného nadtypu specifické chování. Polymorfismus je relace ( reflexivní, asymetrická a transitivní ) mezi referenčním typem a množinou referenčních typů, které lze oním typem referovat. Existuje-li dráha ( po kterýchkoli šipkách ) z typu x k typu y pak: Typ y je abstrakcí typu x, označme: y  x Typ x lze referovat typem y – čili lze říci, že x je také y. Množina typů Y = { x U y | y  x } je polymorfismem typu y. Tři příklady polymorfismu z předchozího obrázku: A = { A, B, C, D }, Q = { Q, B, C, R, S, T }, U = { U, F, G } Zda objekt o patří do určitého typu lze otestovat výrazem: instanceof Typ má hodnotu true či false instanceof java.lang.Object má vždy hodnotu true . PJV02

Dědičnost ( inheritance ) Dědičnost velmi usnadňuje: - Přístup k existujícím třídám a interfejsům a jejich pochopení. Vytváření nových tříd a interfejsů s využitím vlastností a schopností již existujících, ověřených a dokumentovaných. Všechny třídy ( bez ohledu na balíčky ) tvoří jediný, dědičný, kořenový strom orientovaný směrem ke kořeni, jímž je třída java.lang.Object. Tedy každá třída, kromě java.lang.Object, má právě jednoho přímého předka ( superclass = nadtřída ), jehož je přímým potomkem ( subclass = podtřída ). Svoji přímou nadtřídu vyznačuje podtřída ve své hlavičce za klíčovým slovem extends, jinak je jí java.lang.Object. Konkrétní třída java.lang.Object nemá předka ( je to prapředek Adam ), která definuje 11 „generálních“ metod. Všechny ostatní třídy jsou jejími přímými či nepřímými potomky a zaručeně mají tyto „generální“ metody, byť mnohdy překryté. Třída též dědí od interfejsů dle seznamu za klíčovým slovem implements. PJV02

Dědičnost ( inheritance ) Interfejsy tvoří nesouvislý acyklický graf. ( Hrany jsou jen typu extends. ) Není žádný základní interfejs ( co obdoba třídy java.lang.Object ) Interfejs tedy: nemusí mít žádného předka, může být přímým potomkem více interfejsů uvedených v seznam za klíčovým slovem extends, nemůže být potomkem žádné třídy, nemůže být finální. Dědí se pouze viditelné členy ( tj. atributy, metody, vnitřní třídy, vnitřní interfejsy, výčty ), jež nemají příliš restriktivní přístupový modifikátor: ( public – protected – default=friend – private tj.: vždy – v balíčku či potomek v jiném balíčku – v témže balíčku – nikdy ). Potomek nemůže dědictví odmítnout a tedy není nikdy chudší než předek – zpravidla bývá mnohem bohatší. PJV02

Dědičnost metod P E A Q F D B R S G C T Object U A B R C třída Interfejsy obsahují jen nestatické abstraktní metody a statické finální atributy generální metody: clone(), equals(), hashCode(), finalize(), getClass(), notify(), notifyAll(), toString(), wait(...) java.lang. Object U P m2( ); abstract E A A static Q m6( ){...} m1( ){...} m3( ); final abstract F D B B R R S m3( ){...} m4( ){...} m4( ); m4( ); static private m7( ){...}; m6( ){...} m5( ); abstract G C C m2( ){...} static T m6( ){...} m3( ){…}; m5( ){…}; metoda - konkrétní m( ){…}; třída finální třída abstr. třída interfejs extends implements - abstraktní m( ); PJV02

Dědičnost metod, objekt, reference Interfejsy obsahují jen nestatické abstraktní metody a statické finální atributy java.lang. generální metody: clone(), equals(), hashCode(), finalize(), getClass(), notify(), notifyAll(), toString(), wait(...) P Object Q P m2( ); R S A A Q S m1( ){...} m3( ); Object abstract A B B R R S m3( ){...} B m4( ){...} m4( ); m4( ); m5( ); C new C C C m2( ){...} T m3( ){...} m5( ){...} třída finální třída abstr. třída reference objekt interfejs extends implements PJV02

Dědičnost atributů P E A Q F D B R S G C T Object U A B R C třída Interfejsy obsahují statické finální atributy java.lang. Object Atributy mohou být libovolně [ne]statické U P i=1 abstract E A A final private m=5 Q n=4 j=2 final abstract F D B B i=11 R R S n=44 j=22 i=1 k=3 i=1 j=22 j=2 k=3 k=3 abstract i=1 G C C i=1/11 ? n=44 j=2/22 ? T j=22 k=33 k=3/33 ? atributy - definice i=11 třída finální třída abstr. třída interfejs extends implements - zděnění k=3 PJV02

- navíc jen pro vnořené / vnitřní Syntaxe třídy [ public | protected | private ] [ abstract | final ] [ strictfp ] static class JménoTřídy [ <~> ] // hlavička třídy [ extends JménoNadTřídy [ <~> ] | extends java.lang.Object ] [ implements JménoInterfejsu [ <~> ] , ... ] { // tělo třídy // atributy statické a nestatické // inicializátory statické a nestatické // konstruktory // metody statické a nestatické // vnořené ( nested ) statické třídy - ale ne static členy krom konstant // vnitřní ( inner ) třídy // výčty enum // vnořené interfejsy ( jsou jen statické ) // anotace } kódové bloky - meta symboly - navíc jen pro vnořené / vnitřní - typové parametry PJV02

Syntax konstruktoru [ public | protected | private ] //  modifikátory přístupu jako u metod [ <~> ] JménoTřídy //  jméno konstruktor = jméno třídy ( [ [ final ] [ <~> ] Typ parm, ... ] [ [ final ] [ <~> ] Typ ... varargs ] ] ) //  formální parametry jako u metod [ throws Ex1, Ex2, ... ] //  stigma: seznam neřešených nehod { [ super ( ); | super (…); | this (…); ] [ příkazy ] } Příklad volání: new JmenoKonstruktoru( x, y, z1, z2, z3 ); - typové parametry - metasymboly possible autoboxing C00

Syntaxe interfejsu [ public | protected | private ] [ strictfp ] [ static ] [ abstract ] interface JménoInterfejsu [ <~> ] // hlavička interfejsu [ extends JménoNadInterfejsu [ <~> ] , ... ] { // tělo interfejsu // [ public static final ] atributy inicializované již v definici // [ public abstract ] metody ale ne static final strictfp native // [ public ] [ static | default ] konkrétní metody Java 8 // vnořené a vnitřní třídy // výčty enum // vnořené interfejsy // anotace } Metody týchž signatur kolidují jen při nekompatibilitě návratových typů. Interfejs označený public, má atributy také public - což netřeba uvádět. Při vícečetném dědění stejnojmenných atributů nastane kolize. Java 8 bere SAM (Single Abstract Method) interfejsy s jedinou abstraktní metodou jako funkcionální interfejs - i bez @FunctionalInterface. - jen pro vnořené - typové parametry - meta symboly PJV02

Syntaxe anonymní třídy Anonymní třída nemá hlavičku třídy, tedy ani jméno, nemůže mít potomka. Slouží k vytvoření jediného objektu. Má však jediného přímého předka: - buď nefinální třídu ( tedy i abstraktní ), - anebo interfejs ( pak je její nadtřídou java.lang.Object ). TypT t = new Třída ( ... ) { // tělo anonymní třídy // nestatické atributy, inicializátory, metody a třídy } TypT může být Třída či její nadtypy. TypZ z = new Interfejs ( ) { // tělo anonymní třídy TypZ může být Interfejs či jeho nadinterfejsy či java.lang.Object. PJV02

Dědictví tříd V nově definované třídě lze: - zdědit od nadtřídy jen nestatické členy, které jsou public či protected a patří-li potomek do stejného balíčku, pak i default “friend” členy. Privátní členy se nedědí. - konstruktory se nedědí. - přidat nové členy. - překrýt ( override ) zděděné metody novými metodami, nelze však překrýt statickou nestatickou ani nestatickou statickou. - zastínit zděděné atributy stejnojmennými novými atributy ( shadow ), - definovat vlastní konstruktory a inicializátory. Zdědit abstraktních metody, není " výhodné dědictví ", leč břemeno, se kterým se může třída vyrovnat jedním z těchto způsobů: - překrýt všechny zděděné abstraktní metody konkrétními, - ponechat některé abstraktní - a bude tudíž abstraktní třídou s modifikátorem abstract . PJV02

Dědictví interfejsu Při dědění metod nemůže dojít ke kolizi, neb všechny jsou abstraktní (nemají tělo – místo něho mají středník). Při dědění stejnojmenných atributů od více předků-interfejsů dojde k víceznačnosti - a to i když jsou inicializovány na stejnou hodnotu. Ke kolizi dojde i při dědění do třídy stejnojmenných atributů z nadtřídy a z interfejsu či jen z více interfejsů. Dědictví z interfejsů do třídy se neuplatní tehdy, je-li ve třídě jméno atributu definováno ( ne zděděno ). Může záležet i na pořadí v jakém jsou interfejsy uvedeny v implements. PJV02

Zastínění a překrytí Zděděný atribut, lze v potomkovi zastínit stejnojmenným atributem, přičemž na typech a modifikátorech přístupu nezáleží. Nefinální statickou metodu lze zastínit. Statické atributy a metody jsou přístupné přes jméno třídy. Překrytí metod ( overriding ) ve třídě Nevyhovuje-li potomkovi zděděná nefinální, nestatická metoda, lze v potomkovi deklarovat metodu, která: - má shodnou signaturu, má kovariantní návratový typ, typ či subtyp – avšak ne primitivní, nemění statičnost – nestatičnost, nezužuje modifikátor přístupu, nerozšiřuje stigma: množinu kontrolovaných výjimek za throws. Překrytím metody v potomkovi se metoda v předkovi nezmění. Překrytá nestatická metoda je přístupná z přímého potomka pomocí klíčového slova super. PJV02

Dědění versus kompozice Vytvářet bohatší třídy lze: Děděním tj. přidáváním zejména metod, např.: class B extends A { // relace: B is A void m1( ... ) { ... } void m2( ... ) { ... } } Kompozicí tj. přidávání zejména referenčních atributů class C { // relace: C has B and C B b = new B( ... ); C c = new C( ... ); class B { Doporučuje se dávat přednost kompozici, dědění používat obezřetně. PJV02

Zapouzdření ( encapsulation ) Ve třídách a objektech lze ukrýt atributy, metody, konstruktory, vnitřní třídy a vnitřní interfejsy a tím podpořit spořádanost a bezpečnost. Inicializátory (statické i nestatické ) jsou skryté již tím, že nemají jméno. Míru zapouzdření určuje modifikátor viditelnosti členu či konstruktoru. modifikátor viditelnost public - odevšad protected - ve vlastním balíčku a v potomcích v jiných balíčcích “default” - modifikátor se nepíše, chápe se jako package private tj. viditelný ve vlastním balíčku ( “friend” v C/C++ ) private - jen ve vlastní třídě ( a i z vnitřních tříd ) K nedostupným členům nějaké třídy lze přistupovat z jiné třídy jen pomocí neprivátních metod oné třídy. V interfejsech lze zapouzdřovat jen atributy jen úrovní “default”. PJV02

Getry a setry Dobrovolná jmenná konvence přístupových metod typicky k privátnímu atributu, které jeho hodnotu vydávají či mění, což umožňuje tvorbu nadstavbového softwaru - např. Java beans. private int unitPrice = … ; // atribut public int getUnitPrice( ) { return unitPrice; } // getter or accessor public void setUnitPrice ( int unitPrice ) { // setter or mutator .... this. unitPrice = unitPrice; // s případnými kontrolami } Pro jednorozměrná pole: private String[ ] line = { "A" , "B" , "C" } ; public String[ ] getLine( ) { return line ; } public String getLine( int i ) { return line[ i ] ; } public void setLine( String[ ] line ) { this.line = line ; } public void setLine( int i, String element ) { this.line[ i ] = element ; } Getry typu boolean mohou začínat “is” / “has” – např.: isUp( ) / hasNext( ). PJV02

Inicializace statických atributů Když JVM zavede třídu či interfejs do paměti, inicializuje jejich statické atributy. U tříd i tzv. statickými inicializátory - ty připomínají metody bez hlavičky, mají přístup jen ke statickému kontextu, nic nevracejí, nemají signaturu, nevyznačují vyhazování výjimek a provádějí se jen jednou a to v pořadí zápisu. Nelze je volat, nejsou členy třídy a nedědí se. Syntakticky jsou velmi prosté: static { ... } class Example { static int j = 10, k, n; static { String value1 = System.getProperty( "key1" ) ; n = Integer.parseInt( value1 ) ; k = Integer.parseInt( System.getProperty( "key2" ) ) ; } static Color[ ] c = new Color[ n ] ; static { for ( int i = 0; i < c.length; i++ ) c[ i ] = new Color( i, j, 0 ); } // Execute as: java -Dkey1=value1 -Dkey2=value2 mypack.MyProgram PJV02