Statické členy a statický modifikátor. Co je statické

Statika je globální stav. Statická metoda nebo statická proměnná absolutně ne jinak z globální proměnné, protože ani statická, ani globální proměnná nebyly nikde a žádným způsobem předány jako argumenty, což znamená, že pocházejí z globálního prostoru.

Jak může být statická energie nebezpečná?
Představte si, že píšete nástroj pro stahování obrázků. A nyní nastala chvíle, kdy je potřeba určit parametry ořezu pro náhledy. Staticky by to mohlo vypadat takto:

Veřejná funkce upload() ( $width = Config::read("width"); $height = Config::read("height"); // .. Nahrát.. )
(Poznámka: CakePHP je plný takových přístupů)
Problémy s tímto přístupem?

1. Musíte vědět a být si naprosto jisti, že statická třída Config byla inicializována někde daleko. Co když to nebylo inicializováno?

2. Co když se rozhodnete změnit zdroj konfigurace? Přečtěte si například, to není vše z třídy `Config`, ale odněkud z REST? Budeme muset všechno přepsat a pak to znovu otestovat. Tento problém je známý jako silný vaz.

3. Zkuste na to napsat test na jednotku, bez hacků a nadužívaných berliček. Koneckonců, abychom mohli tuto metodu otestovat, musíme inicializovat `Config` někde v globálním prostoru a poté se ujistit, že funguje.

4. Skryté závislosti.

Například při inicializaci třídy v případě statiky:

$uploader = nový Uploader(); $uploader->upload(...);

Vy a vaši uživatelé nevidíte, jaké závislosti má třída a na čem obecně závisí. Problém je zvláště patrný, když píšete knihovnu nebo komponentu.

Ale proč jsou tak populární frameworky jako Yii nebo Laravel kompletně pokryty statikou?

Abyste pochopili důsledky statiky, zkuste použít alespoň jednu komponentu rámce Yii samostatně. Pokud například potřebujete pouze CAPTCHA, nebudete jej moci odtamtud dostat bez přepsání téměř celé komponenty, protože všude uvnitř je globální stav ve tvaru `Yii::$app-> `. To znamená, že pro použití pouze captcha budete muset propojit celý framework a všechny jeho vnitřní mechanismy, když to není absolutně nutné.

Pokud jde o Laravel, je zde méně statického, protože některé komponenty, jako je Eloquent, lze použít samostatně. Statika je v Laře, na mnoha místech existuje jako obal, ale ne jako implementace, na rozdíl od Yii.

Obecně se podívejte, jak se řeší problémy v Zend / Symfony
Tam téměř všude všechny závislosti jsou předávány jako argumenty, což je dobré, volně spojené a testovatelné.

Variabilní počet parametrů metody

Někdy není počet argumentů, které budou předány metodě, znám až za běhu. Například potřebujete třídu, která nakreslí čáru do grafu s posloupností souřadnic x a y. Tato třída musí obsahovat metodu, která přebírá jeden argument – ​​objekt typu Bod, představující hodnoty souřadnic x a y. Tato metoda musí uložit každý objekt typu Bod v propojeném seznamu nebo v prvcích pole, dokud volající program nezadá příkaz k vytištění celé sekvence bodů. Toto řešení však nemusí být příliš efektivní, protože vyžaduje propojený seznam ve třídě. Existuje však pouze jedna metoda, kterou lze použít: DrawLine kteří tento seznam možná nepotřebují . Tento problém je efektivně řešen metodou proměnných argumentů.

Této metodě lze zadat proměnný počet argumentů prostřednictvím klíčového slova parametry ve formě pole. Podívejme se na příklad třídy Schéma, napsaný v C#, umožňující uživateli získat a zobrazit libovolný počet objektů jedním voláním Bod:

pomocí systému;

class Bod //Třída bodu

public Point(int x, int y) ( this.x = x; this.y = y; )

public int x; veřejné int y;

class Chart //Třída zásuvek

public void DrawLine(Grafika g, parametry Bod p)

Console.WriteLine("\nTato metoda umožňuje nakreslit čáru " +

"v následujících bodech:");

for (int i = 0; i< p.GetLength(0); i++)

( Console.WriteLine("(0); (1)". p[i].x, p[i].y); )

třída ChartApp

public static void Main()

Bod p1 = nový Bod(5,10);

Bod p2 = nový Bod(5, 15);

Bod p3 = nový Bod(5, 20);

Chart chart = new Chart();

chart.DrawLine(p1, p2, p3);

Metoda DrawLineříká kompilátoru C#, že může přijmout proměnný počet objektů typu Bod. Pak za běhu metoda používá jednoduchou smyčku pro projít všechny objekty Bod a zobrazení všech bodů.

Statická metoda je metoda, která existuje ve třídě jako takové, a nikoli v jejích jednotlivých instancích. Stejně jako u jiných statických členů je hlavní výhodou statických metod to, že jsou umístěny mimo konkrétní instance třídy, aniž by znečišťovaly globální prostor aplikace. Zároveň neporušují principy OOP, protože jsou spojeny s konkrétní třídou.

Klíčové slovo umožňuje definovat metodu jako statickou statický. Uživatel pak použije syntaxi jako Třída. Metoda. Tato syntaxe je vyžadována, i když má uživatel odkaz na instanci třídy.


Statické ( statický) metody nebo metody třídy lze volat bez vytvoření instance objektu. Takto se metoda používá Hlavní.

veřejná třída Ukázka

veřejný statický int a;

public int b;

public static void DoubleA() ( a *= 2; )

public void SetB() ( b = a; )

aplikace veřejné třídy

public static void Main()

Sample sc1 = new Sample(), sc2 = new Sample();

Vzorek.a = 1;

sc1.SetB();

Vzorek.a = 2;

sc2.SetB();

Console.WriteLine("sc1.b = (0), sc2.b = (1)", sc1.b, sc2.b);

Posledním bodem o statických metodách je pravidlo, které určuje, ke kterým členům třídy lze přistupovat ze statické metody. Jak můžete hádat, statická metoda může přistupovat k libovolnému statickému členu ve třídě, ale nemůže přistupovat k členu instance.

Statický modifikátor se aplikuje na proměnné, metody a dokonce i liché části kódu, které nejsou součástí metody. Statické fragmenty kódu nepatří do objektu třídy, ale do celé třídy.

Podívejme se na příklad jednoduché třídy s jednou statickou proměnnou:

1. třída Extatická(
2. statický int x = 0;
3. Ecstatic() ( x++; )
4. }

Proměnná x je deklarována jako statická. To znamená, že nezáleží na tom, kolik objektů Extatických v tuto chvíli existuje – existuje pouze jedno x. Při načítání třídy Ecstatic jsou pro proměnnou x alokovány 4 bajty. A k jeho inicializaci (viz řádek č. 2) dochází také v okamžiku načtení třídy. A pokaždé, když je vytvořen objekt Ecstatic, x se zvýší. Tato technika vám umožňuje znát přesný počet vytvořených objektů třídy Ecstatic.

Ke statickým proměnným lze přistupovat dvěma způsoby:

  • Prostřednictvím libovolného objektu třídy: objekt.proměnný.
  • Prostřednictvím samotné třídy: třída.proměnná.

První metoda je však považována za špatnou formu, protože je velmi zavádějící. Podívejme se na to na příkladu:



3. e1.x = 100;
4. e2.x = 200;
5. opravduDůležitáProměnná = e1.x;

Pokud předem nevíte, že x je statická proměnná, můžete si myslet, že na řádku 5 je proměnné skutečněDůležitáVariable přiřazeno 100. Ale ve skutečnosti je jí přiřazeno 200, protože e1.xa e2.x jsou všechny stejné. stejná proměnná x.

Proto je lepší přistupovat ke statickým proměnným prostřednictvím názvu třídy. Zde je fragment kódu ekvivalentní předchozímu:

1. Extatické e1 = new Extatické();
2. Extatické e2 = new Extatické();
3. Extatický.x = 100; // Zbytečná akce
4. Extatický.x = 200;
5. opravduDůležitáProměnná = Ecstatic.x;

Nyní vše zapadá na své místo: řádek 3 nedává žádný smysl - je to jen operace navíc a na řádku 5 je proměnné skutečněImportantVariable přiřazeno 200 najednou.


Statické metody nemohou používat nestatické členy (proměnné a metody) své třídy, ale mohou používat jiné statické členy. Statické metody nepatří k žádnému objektu třídy. Proto je lze obecně volat před vytvořením instance třídy.

Každá Java aplikace obsahuje statickou metodu main():

1. třída SomeClass (
2. statický int i = 48;
3. int j = 1;
4.
5. public static void main(String args) (
6. i+= 100;
7. // j*= 5; Pokud jej odkomentujete, dojde k chybě
8. }
9. }

Když se aplikace spustí (to znamená, že někdo zavolá javu SomeClass z příkazového řádku), žádný objekt třídy SomeClass neexistuje. Existuje však proměnná i, která je inicializována na řádku 2 a inkrementována na řádku 6. A pokud bychom odkomentovali 7. řádek, dostali bychom obecně chybu při kompilaci, protože statická metoda nemůže používat nestatické proměnné třídy.

Statický modifikátor v Javě přímo souvisí s třídou, pokud je pole statické, pak patří do třídy, pokud je metoda statická, podobně patří do třídy. Na základě toho můžete přistupovat ke statické metodě nebo poli pomocí názvu třídy. Pokud je například pole count ve třídě Counter statické, můžete k proměnné přistupovat pomocí dotazu jako: Counter.count. Samozřejmě je třeba vzít v úvahu modifikátory přístupu. Například soukromá pole jsou dostupná pouze v rámci třídy, ve které jsou deklarována. Chráněná pole jsou dostupná pro všechny třídy v rámci balíčku ( balík), stejně jako všechny podřízené třídy mimo balíček. Další podrobnosti najdete v článku „soukromé vs. chráněné vs. veřejné“. Předpokládejme, že ve třídě Counter existuje statická metoda increment(), jejímž úkolem je zvýšit počet čítačů. K volání této metody můžete použít volání jako Counter.increment() . Pro přístup ke statickému poli nebo metodě není potřeba vytvářet instanci třídy Counter. To je základní rozdíl mezi statickými a NEstatickými objekty (členy třídy). Důležitá poznámka. Pamatujte, že členové statické třídy přímo patří do třídy, nikoli do její instance. To znamená, že hodnota počtu statické proměnné bude stejná pro všechny objekty typu Counter. V tomto článku se podíváme na základní aspekty používání statického modifikátoru v Javě a také na některé funkce, které vám pomohou pochopit klíčové programovací koncepty.

Co by měl každý programátor vědět o modifikátoru Static v Javě.

V této části se podíváme na základy používání statických metod, polí a tříd. Začněme s proměnnými.

    NEMŮŽETE přistupovat k nestatickým členům třídy v rámci statického kontextu, jako je metoda nebo blok. Kompilace níže uvedeného kódu bude mít za následek chybu:

    public class Counter ( private int count; public static void main (String args) ( System. out. println (count) ; //compile time error ) )

    Toto je jedna z nejčastějších chyb programátorů Java, zejména nováčků. Vzhledem k tomu, že hlavní metoda je statická a proměnná count nikoli, v tomto případě metoda println uvnitř hlavní metody vyvolá „Chyba času kompilace“.

    Na rozdíl od lokálních proměnných, statická pole a metody NEJSOU v Javě bezpečné pro vlákna. V praxi jde o jednu z nejčastějších příčin problémů souvisejících s bezpečností vícevláknového programování. Vzhledem k tomu, že každá instance třídy má stejnou kopii statické proměnné, je třeba takovou proměnnou chránit – „uzamknout“ třídou. Při použití statických proměnných se proto ujistěte, že jsou správně synchronizovány, abyste předešli problémům, jako jsou podmínky závodu.

    Statické metody mají výhodu v použití, protože... pro přístup k takovým metodám není nutné pokaždé vytvářet nový objekt. Statická metoda může být volána pomocí typu třídy, ve které jsou metody definovány. Proto jsou tyto metody ideálně vhodné jako tovární metody a užitkové metody. Třída java.lang.Math je skvělým příkladem, ve kterém jsou téměř všechny metody statické, což je stejný důvod, proč jsou třídy obslužných programů v Javě konečné.

    Dalším důležitým bodem je, že nemůžete přepsat statické metody. Pokud stejnou metodu deklarujete v podtřídě, tzn. metodou se stejným názvem a podpisem, pouze „skryjete“ metodu nadtřídy namísto jejího přepsání. Tento jev je známý jako metody skrývání. To znamená, že při volání statické metody, která je deklarována v nadřazené i podřízené třídě, bude metoda vždy volána v době kompilace na základě typu proměnné. Na rozdíl od přepisování se takové metody nebudou provádět, když je program spuštěn. Podívejme se na příklad:

    třída Vozidlo ( public static void kmToMiles (int km) ( System. out. println ( "Uvnitř rodičovské třídy/statická metoda"); ) ) třída Auto rozšiřuje Vozidlo ( public static void kmToMiles (int km) ( System. out. println ("Uvnitř podřízené třídy / statické metody"

    );

    ) ) public class Demo ( public static void main ( String args ) ( Vehicle v = new Car ( ) ; v. kmToMiles ( 10 ) ; ) )

    Výstup konzole:

    Třídu můžete také deklarovat jako statickou, s výjimkou tříd nejvyšší úrovně. Takové třídy jsou známé jako vnořené statické třídy. Jsou užitečné pro reprezentaci vylepšených spojení. Ukázkovým příkladem vnořené statické třídy je HashMap.Entry, která poskytuje datovou strukturu uvnitř HashMap. Stojí za zmínku, že stejně jako každá jiná vnitřní třída se vnořené třídy nacházejí v samostatném souboru .class. Pokud byste tedy ve své hlavní třídě deklarovali pět vnořených tříd, měli byste 6 souborů s příponou .class. Dalším příkladem použití je deklarování vlastního komparátoru, například AgeComparator ve třídě Zaměstnanec.

    Statický modifikátor lze také deklarovat ve statickém bloku, lépe známém jako blok statického inicializátoru, který se spustí při načtení třídy. Pokud takový blok nedeklarujete, Java shromáždí všechna statická pole do jednoho seznamu a spustí jej po načtení třídy. Statický blok však nemůže házet zachycené výjimky, ale může házet nezachycené. V tomto případě se objeví „Chyba inicializátoru výjimky“. V praxi bude jakákoliv výjimka vyvolaná během provádění a inicializace statických polí obalena touto chybou Java. Toto je také nejčastější příčina „Nenalezena chyba třídy Def“, protože... třída nebyla v paměti, když k ní bylo přistupováno.

    Je užitečné vědět, že statické metody jsou vázány v době kompilace, na rozdíl od vazebných virtuálních nebo nestatických metod, které jsou vázány za běhu na skutečný objekt. Proto statické metody nelze v Javě přepsat, protože runtime polymorfismus se na ně nevztahuje. Toto je důležité omezení, které je třeba vzít v úvahu při deklarování metody jako statické. To má smysl pouze tehdy, když neexistuje žádná možnost nebo potřeba přepsat takovou metodu třídami dědice. Dobrými příklady použití statického modifikátoru jsou tovární metody a užitkové metody. Joshua Bloch nastínil několik výhod použití statické tovární metody oproti konstruktoru ve své knize Effective Java, kterou si musí přečíst každý programátor jazyka.

    Důležitou vlastností statického bloku je inicializace. Statická pole nebo proměnné jsou inicializovány po načtení třídy do paměti. Pořadí inicializace je shora dolů ve stejném pořadí, jaké je popsáno ve zdrojovém souboru třídy Java. Protože jsou statická pole inicializována způsobem bezpečným pro vlákna, používá se tato vlastnost také k implementaci vzoru Singleton. Pokud z toho či onoho důvodu nepoužíváte seznam Enum jako Singleton, pak je tu pro vás dobrá alternativa. V tomto případě je ale nutné počítat s tím, že se nejedná o „línou“ inicializaci. To znamená, že statické pole bude inicializováno PŘEDTÍM, než o to někdo „požádá“. Pokud je objekt náročný na zdroje nebo se používá zřídka, jeho inicializace ve statickém bloku nebude fungovat ve váš prospěch.

    Během serializace, stejně jako přechodné proměnné, nejsou statická pole serializována. Pokud skutečně uložíte nějaká data do statického pole, pak po deserializaci bude nový objekt obsahovat svou primární (výchozí) hodnotu, například pokud bylo statické pole proměnnou typu int, pak jeho hodnota po deserializaci bude nula, pokud typ float je 0,0, pokud je typ objektu null. Upřímně řečeno, toto je jedna z nejčastějších otázek týkajících se serializace v rozhovorech v Javě. Neukládejte nejdůležitější data o objektu do statického pole!

    A nakonec si promluvme o statickém importu . Tento modifikátor má mnoho společného se standardním příkazem import, ale na rozdíl od něj umožňuje importovat jednoho nebo všechny statické členy třídy. Při importu statických metod k nim lze přistupovat, jako by byly definovány ve stejné třídě, podobně při importu polí k nim můžeme přistupovat bez uvedení názvu třídy. Tato funkce byla zavedena v Javě verze 1.5 a při správném použití zlepšuje čitelnost kódu. Tento design se nejčastěji vyskytuje v testech JUnit, protože Téměř všichni vývojáři testů používají statické importy pro metody stvrzení, jako je například sustainEquals() a jejich přetížené duplikáty. Pokud není nic jasné, uvítáme další informace.

    To je vše. Všechny výše uvedené body o modifikátoru statický Každý programátor musí znát Javu. Tento článek obsahuje základní informace o statických proměnných, polích, metodách, inicializačních blocích a importech. Včetně některých důležitých vlastností, jejichž znalost je při psaní a pochopení programů v Javě zásadní. Doufám, že každý vývojář zdokonalí své dovednosti v používání statických konceptů, protože... To je velmi důležité pro seriózní programování."

V objektově orientovaném programování je metoda pojmenovaný blok kódu, který je deklarován v rámci třídy a lze jej znovu použít. Pokud jste obeznámeni s procedurálním programováním (Pascal, Basic), zapamatujte si, co je funkce – z hlediska principu fungování má ona a metoda mnoho společného.

Dobře napsaná metoda řeší jeden praktický problém: najde druhou odmocninu čísla (jako standardní metoda sqrt() v Javě), převede číslo na řetězec (metoda toString()), přiřadí hodnoty polím objektů, a tak dále.

Nejprve je deklarována a definována nová metoda, poté je volána na požadovaný objekt nebo třídu.

Standardní - vestavěné - jazykové metody pracují s objekty služeb. Například metoda tisku v Javě vytiskne hodnoty do konzoly. Nazvěte to takto:

Systém. ven. print("Ahoj světe!" );

Věnujte pozornost struktuře: třída System má pole out - vstupní/výstupní proud. Pole je také objekt a má metodu print(), kterou voláme.

Existuje také metoda println(), která při výstupu hodnot automaticky přesune vozík na další řádek. To eliminuje potřebu vkládat "\n" na konec řádku.

Aby Java aplikace fungovala, musí deklarovat hlavní metodu ve své základní třídě.

public static void main(String args) ( // zde je hlavní kód a volání dalších metod }

Jak vidíte, main bere jako parametr pole řetězců, v tomto případě spouštěcí parametry.

Deklarace a definování metody v Javě

Metody mohou nebo nemusí vracet hodnoty a mohou být volány s parametry nebo bez nich. Návratový datový typ je uveden při deklaraci metody - před jejím názvem.

V níže uvedeném příkladu metoda potřebuje najít větší ze dvou celých čísel, takže návratový typ je int:

public static int maxFinder(int a, int b) ( //záhlaví metody //níže je tělo metody int max;< b) max = b; else max = a; return max; }

pokud (a

V těle metody vytvoříme proměnnou max, kam pak zapíšeme větší číslo. Dále porovnáme hodnoty, opravíme větší v max a vrátíme.

Upozorňujeme, že return může fungovat nejen s jednou proměnnou, ale také s výrazem. Pokud bychom hodnoty neporovnávali, ale sčítali, výsledek by se mohl vrátit bez další vnitřní proměnné. Tělo metody by mělo pouze jeden řádek:

návrat a+ b;

Když by metoda neměla nic vracet, návratový typ je zadán jako void. A pokud metoda nepotřebuje vstupní parametry, aby fungovala, závorky jsou ponechány prázdné:

static void theWarning() ( System. out. println( "Nic nepotřebuji a nic ode mě nedostaneš."); }

Jak volat metodu v Javě

Metodu s modifikátorem public lze volat z jakékoli třídy, včetně tříd umístěných v externím souboru. Pokud chcete, aby byla metoda přístupná výhradně v rámci její třídy, použijte modifikátor private. Existuje také měkčí verze omezení přístupu: metody s chráněným modifikátorem jsou dostupné pro podtřídy jejich třídy a další třídy ze stejného balíčku. Čím obtížnější je přístup k metodě zvenčí, tím je bezpečnější – tím menší je riziko chyb.

Statická metoda v Javě patří do třídy, nikoli do objektů (a instancí) třídy. Proto se volá bez vytvoření instance.

Pro jednoduchost jsme udělali metody veřejné a statické a umístili je do hlavní třídy programu.

Metody se volají dvěma způsoby – podle toho, jestli něco vracejí nebo ne. Pokud ano, dosadíme hodnotu tam, kde ji potřebujeme:

public static void main(String args) ( System . out . print(maxFinder(3 ,8 )); )

Zavolali jsme maxFinder a výsledek jeho práce okamžitě zobrazili na obrazovce. Pro tento příklad jsou čísla nastavena ručně jako nepojmenované konstanty, ale v reálných aplikacích obvykle porovnávají hodnoty proměnných.

Metoda po zavolání řídí program až do konce své práce: dokud se v jejím těle nespustí operátor návratu či přerušení, nebo dokud se neprovedou všechny instrukce v ní obsažené.

Zavolejte Varování, které nic nevrací:

public static void main(String args) ( theWarning(); System . out. print("Upozornění dokončilo svou práci. Pojďme dál."); )

Tato metoda se obejde bez pomocníků – dělá, co má, a předává řízení následnému kódu.

Volání metody z jiné třídy

Co kdyby byl maxFinder v samostatné třídě a nebyl statický? Abyste jej mohli zavolat, museli byste nejprve vytvořit objekt třídy, ve které se nachází. Řekněme, že metoda je ve třídě SampleClass. voláme:

public void main(String args) ( SampleClass sc= new SampleClass (); System. out. print(sc. maxFinder(5,8)); )

Statická metoda je volána přes tečku jménem třídy - takto:

Systém. ven. print(SomeClass . maxFinder(5 ,8 ));

Metoda přetížení v Javě

Co když potřebujeme porovnávat nejen celá čísla, ale i čísla s plovoucí desetinnou čárkou? Přetížení metody to pomůže implementovat. Zkopírujte a vložte metodu maxFinder do stejné třídy, nahraďte typy všech zahrnutých hodnot dvojitým:

public static double maxFinder(double a, double b) ( double max; //zbytek těla metody ponechá beze změny }

Název metody neměníme! To je přetížení: kompilátor si sám vybere, kterou verzi metody použije, podle toho, jaký typ hodnot porovnáváme.

Klíčové slovo this v metodách Java

Klíčové slovo this vám umožňuje odkazovat na instance třídy: jejich proměnné, metody a konstruktory. Použijte to pouze uvnitř konstruktoru metody nebo instance. Takto můžete například spojit vstupní parametry metody se stejnými parametry konkrétní instance třídy:

class UserData ( int id, age, phone; void setProfileData ( int id , int age , int phone ) ( this . id= id; this . age= age; this . phone= phone; ) )

Dalším příkladem je volání jednoho konstruktoru z jiného:

class ProfileData (int id; ProfileData () ( toto (100); ) ProfileData (int id) ( this . id = id; ) )

Toto se nazývá "explicitní volání konstruktoru".

Abstraktní metody v Javě

Abstraktní metoda je metoda, která je deklarována bez implementace – nemá tělo ani složené závorky. Před názvem takové metody je uveden modifikátor abstraktní:

abstract void jmeno metody();

Proč je takový potřeba? Jako šablona pro další metody z jiných tříd. Zde máme abstraktní třídu „Building“ a v ní je abstraktní metoda „build“. Tyto abstrakce je třeba implementovat prostřednictvím několika neabstraktních odvozených tříd a jejich metod. Příklad: třída „Hut“ – metoda „buildHut“, třída „Bridge“ – metoda „buildBridge“ atd.

balíček ru.your.classes ; abstraktní třída Construction ( abstract void build_it (String msg1 ); abstract void sell_it (String msg2 ); ) veřejná třída Hut extends Construction ( // neabstraktní třída@Přepsat // přepíše metodu void build_it (String msg1) ( System . out . println ( "Chalupa je postavena!"); ) @Override void sell_it (String msg2) ( System . out . println ("Kabina byla prodána." ); ) ) public abstract class Bridge extends Construction ( @Override void build_it (String msg1 ) ( System . out . println ( "Most je postaven!" ); ) // Řekněme, že objekty třídy Bridge se nemají prodávat.// Potom nemusíme znovu definovat sell_it.

// Ale určitě vytvoříme abstraktní podřízenou metodu:




Mapa stránek