Je možné vytvořit objekt rozhraní Java. Proč potřebujeme rozhraní v Javě? JavaFX: pojďme si poslechnout nějakou hudbu

Akademik A.N. Krylov byl v roce 1931 jedním z prvních, kdo navrhl poměrně pohodlnou metodu pro odhalení determinantu (2).

Podstatou metody A.N. Krylova je transformace determinantu D() do tvaru

Rovnost determinantu D() k nule je nutná a dostatečný stav aby homogenní systém lineární algebraické rovnice

měl řešení x1, x2, ..., xn, odlišné od nuly.

Transformujme soustavu (2) následovně. Vynásobme první rovnici a nahraďme x1,...,xn jejich výrazy (2) až x1,..., xn.

Opakováním tohoto procesu (n-1) krát přejdeme ze systému (2) do systému

jejichž koeficienty budou určeny opakujícími se vzorci

Je zřejmé, že determinant systému (5) bude mít tvar (1).

Systém lineárních algebraických rovnic (5) má nenulové řešení pro všechny hodnoty splňující rovnici D()=0. Tedy D1()=0 pro všechny splňující rovnici D()=0.

Pojďme si to ukázat

Nechť všechny kořeny D() jsou různé. Protože všechny kořeny D() jsou kořeny D1(), pak se D1() dělí D(). Protože jsou navíc mocniny D1() a D() stejné, musí být podíl konstantní. Porovnáním koeficientů pro n dostaneme

Pokud má D() více kořenů, rovnost (8) zůstává pravdivá.

Uvažujme nyní koeficienty bik, které určují D1(). Zaveďme vektory Bi se složkami bi1, bi2, …, bin. Rovnosti

ukazují, že Bi=ABi-1, kde A je matice transponovaná na danou. Z toho vyplývá, že

Bi=A i-1B1, B1=AB0, (9)

kde B0=(1,0,…,0)

Jestliže C0, pak rovnice D1()=0 a D()=0 jsou ekvivalentní. Pokud C = 0, pak tato transformace nedává nic. A.N. Krylov nabízí v tomto případě speciální techniku, o níž je řeč níže. Vezměme libovolný vektor B0 = (bi1,bi2,…,bin) jako vektor B0 a použijeme jej k získání vektorů Bi pomocí vzorců (9).

Nechť u=b01x1+b02x2+…+b0nxn (10)

kde x1,x2,…xn jsou řešení soustavy (1/). Poté opakováním předchozí úvahy dostaneme:

Řešením této soustavy jako soustavy lineárních homogenních rovnic s n+1 neznámými u,x1,x2,…xn dostaneme, že nenulové řešení je možné právě tehdy, když

Opakováním předchozí úvahy zjistíme, že

je-li C10, pak koeficienty pi charakteristického polynomu jsou definovány jako poměry, kde Di - algebraické sčítání prvky n-i v determinantu D().

Ale podstatou Krylovovy metody je najít tyto koeficienty bez počítání nezletilých.

Použijme Hamiltonovu-Cayleyovu větu, že matice je kořenem její charakteristické rovnice, tj.

(A) n+p1(A)n-1+…+pn-1A+pnE=0, (14)

kde pi jsou koeficienty charakteristického polynomu.

Vynásobením rovnosti (14) b0 dostaneme:

bn+p1bn-1+p2bn-2+…+pn-1b1+pnb0=0 (15)

Tato vektorová rovnost dává systém lineárních algebraických rovnic pro určení koeficientů charakteristického polynomu. Determinant tohoto systému je roven C1. Výsledný systém lze vyřešit kteroukoli ze známých metod, například Gaussovou metodou.

Pro samotnou matici A by bylo možné aplikovat Hamiltonovu-Cayleyovu větu a pak bychom získali systém

сn+p1сn-1+p2сn-2+…+pn-1с1+pnc0=0 (15/)

zde ci=Aic0, c0

Libovolný počáteční vektor.

Příklad. Nechť matice A má tvar:

jako vektor B0 vezmeme vektor B0=(1,0,0,0). Pak dostaneme vektory

B1=AB0, B2=A2B0= AB1, B3=A3B0=AB2, B4=A4B0=AB3:

Soustava lineárních algebraických rovnic pro určení koeficientů charakteristického polynomu má tvar:

Po vyřešení tohoto systému dostaneme: p1=-11, p2=7, p3=72, p4=-93. Proto charakteristický polynom bude mít tvar:

D()= 4-113 + 72 + 72-93.

V uvedeném příkladu C10.

Pokud C = 0, takový systém neumožní určit koeficienty charakteristické rovnice. Matice A a matice A do ní transponované splňují její charakteristickou rovnici D(A)=0. Může se ale ukázat, že existují polynomy () stupně menšího než n, pro které také platí rovnost (A)=(A)=0. Mezi takovými polynomy existuje jediný polynom s vedoucím koeficientem 1, který má nejmenší stupeň. Tento polynom se nazývá minimální. Pokud se minimální polynom matice neshoduje s charakteristickým polynomem, pak C = 0 pro jakoukoli volbu počátečního vektoru. V tomto případě AC0=0 a vektory C0, AC0, ..., Аn-1C0 jsou lineárně závislé.

V praxi při použití Krylovovy metody může taková situace nastat pouze za zvláštních okolností.

Rozhraní je smlouva, ve které části programu, často napsané různými lidmi, interagují mezi sebou a navzájem externí aplikace. Rozhraní pracují s vrstvami služeb, zabezpečením, DAO atd. To vám umožní tvořit modulární návrhy, ve kterém pro změnu jednoho prvku nemusíte sahat na ostatní.

Nováčci se často ptají, jak se rozhraní liší od abstraktní třídy?. Rozhraní v Javě tento nedostatek vynahrazují vícenásobné dědictví třídy. Potomek třídy může mít pouze jednu abstraktní nadřazenou třídu, ale třída může používat (implementovat) tolik rozhraní, kolik chce.

Rozhraní v Javě je deklarováno v podstatě stejným způsobem jako třída:

veřejné rozhraní MyInterface ( void do_something ()( // ... ) default void say_goodbye (String userName) ( System. out. println("Sbohem, " + userName+ "! Come again." ); ) )

Třída implementující rozhraní musí implementovat všechny metody poskytované rozhraním, s výjimkou výchozích metod.

Výchozí metody se poprvé objevily v Javě 8. Jsou označeny výchozím modifikátorem. V našem příkladu se jedná o metodu say_goodbye, jejíž implementace je zapsána přímo v rozhraní. Výchozí metody jsou zpočátku připraveny k použití, ale v případě potřeby je lze přepsat ve třídách, které používají rozhraní.

Funkční rozhraní Java

Pokud má rozhraní pouze jednu abstraktní metodu, máme funkční rozhraní. Obvykle je označena anotací @FunctionalInterface, která říká kompilátoru, aby ohlásil chybu, pokud v tomto rozhraní narazí na druhou abstraktní metodu. Rozhraní může mít mnoho standardních (výchozích) metod, včetně těch, které patří do třídy java.lang.Object.

Jak vypadá funkční rozhraní v Javě:

@FunctionalInterface veřejné rozhraní GaMechanic ( void new_deck(); výchozí int deal_cards(int num_of_players) ( // tělo metody ) default int check_your_cards(int hand) ( //... ) default int battle(Card player1_Card, Card player2_Card) ( / /...))

Funkční rozhraní byla představena v Javě 8. Poskytovala podporu pro výrazy lambda, jejichž použití činí kód stručným a srozumitelným:

Tlačítko. setOnAction(událost - > // pokud dojde k události Systém. ven. println( "Zpracováváme kliknutí na tlačítko."));

Stejná verze představila balíčky vestavěných rozhraní: java.util.function a java.util.stream.

Implementace rozhraní pomocí tříd Java

Řekněme, že existuje rozhraní Jedlé, které používají třídy Ovoce, Zelenina, Ryby. Instance těchto tříd lze vytvořit takto:

Jedlé a1 = nové Ovoce („Jablko“, „Antonovka“); Jedlé a2 = nová ryba ( "Mírně solený losos sockeye", “Tichý oceán”, 150 );

Za dobrou formu se považuje dávat rozhraním názvy končící na -able/-ible – to ukazuje, že můžete něco dělat s objekty, které implementují rozhraní: Jedlé (můžete jíst), Pohyblivé (můžete se pohybovat), Klikací (reaguje na kliknutí). ), atd. .d.

Všimněte si prosím rozdílu v konstruktérech: pro ovoce nastavujeme název a odrůdu, pro ryby - název, lovnou oblast a hmotnost porce v gramech. Odkazy na oba objekty ale ukládáme do proměnných stejného typu – „Jedlé“.

Rozhraní a polymorfismus

Výše uvedený příklad ilustruje jeden ze tří základních principů OOP – polymorfismus. Stejný fenomén - poživatelnost - jsme odhalili prostřednictvím několika tříd, jejichž vlastnosti a metody jsou částečně odlišné. Výkon různé formy jeden jev - to je polymorfismus. V případě potřeby lze takový systém vždy rozšířit a upravit. V našem případě je to přidání nových druhů potravin a způsobů jejich přípravy.

V Javě lze polymorfismus implementovat pomocí:

  • dědičnost - s nadřazenými parametry a metodami základní třída;
  • abstraktní třídy - šablony pro samostatnou implementaci v různé třídy;
  • rozhraní - pro implementaci po třídách.

Rozhraní přichází na pomoc v situaci, kdy při vytváření proměnné nevíme, jaký objekt třídy jí bude přiřazen.

Rozhraní Java jsou navržena tak, aby podporovala dynamické rozlišení metod během provádění programu. Rozhraní jsou podobná třídám, ale na rozdíl od nich nemají rozhraní proměnné zástupce a deklarace metod postrádají implementaci. Třída může mít libovolný počet rozhraní. Vše, co musíte udělat, je implementovat ve třídě kompletní sada metody všech rozhraní. Signatury takových metod třídy musí přesně odpovídat signaturám metod rozhraní implementovaného v této třídě. Rozhraní mají svou vlastní hierarchii, která nezasahuje do hierarchie dědičnosti tříd. To umožňuje implementovat stejné rozhraní v různých třídách, které nejsou nijak propojeny v hierarchii dědičnosti tříd. Zde vstupuje do hry hlavní síla rozhraní.

8.2.1. operátor rozhraní

Definování rozhraní je podobné definici třídy, s tím rozdílem, že rozhraní nemá data nebo deklarace konstruktoru. Obecná podoba rozhraní je uvedena níže:

rozhraníJméno (
typ_výsledku název_metody1 (seznam parametrů);
zadejte jméno_finále_proměnná = hodnota;
}

Upozorňujeme, že metody deklarované v rozhraní nemají operátory těla. Deklarace metod končí symbolem „;“ (středník). Proměnné lze také deklarovat v rozhraní, ale jsou implicitně deklarovány jako konečné proměnné. To znamená, že implementační třída nemůže měnit jejich hodnoty. Navíc při deklaraci proměnných v rozhraní musí být inicializovány konstantními hodnotami. Níže je uveden příklad definice rozhraní obsahující jedinou metodou s názvem callback a jedním parametrem typu int.

rozhraní Callback (
void zpětné volání(int param);
}

8.2.2. implementuje operátor

Příkaz implements je doplňkem k definici třídy, která implementuje nějaké rozhraní.
třídajméno třídy [rozšiřujesupertřída]
[ nářadírozhraní0 [, rozhraní 1...]]
(tělo třídy)

Pokud třída implementuje několik rozhraní, jejich názvy jsou odděleny čárkami. Níže je uveden příklad třídy, která implementuje rozhraní, které jsme definovali:

class Klient implementuje Callback (
zrušit zpětné volání (int p) (
System.out.println("zpětné volánívolalS" + p);
}
}

V dalším příkladu je metoda zpětného volání rozhraní definovaného dříve volána prostřednictvím odkazu proměnné na rozhraní:

třída Testface(
public static void main (string args)
{

přepínač (výsledek) (
případ NE:
System.out.println("OnT");
přerušení;
případ ANO:
System.out.println("DA");
přerušení;
případ MOŽNÁ:
System.out.println("PoaETbýt");
přerušení;
případ POZDĚJI:
System.out.println("Později");
přerušení;
případ BRZY:
System.out.priniln("CNaopo");
přerušení;
pouzdro NIKDY:
System.out.println("Nikdy");
přerušení;
}
}

public static void main(String args) (
Otázka q = nová otázka();
odpověď(q.zeptat se());
odpověď(q.zeptat se());
odpověď(q.zeptat se());
odpověď(q. požádat());
}
}

Upozorňujeme, že výsledky se mezi různými běhy programu liší, protože ke generování náhodných čísel používá třídu Random balíčku java.util.

Později
Brzy
Žádný
Ano

barva veřejné prázdnoty (grafika g)

// Nakreslete obrázek typu Image

g.drawlmage(obrazek, 35, 35, tento ); // toto - odkaz na applet sám na sebe

Když potřebujete odlišit použití dvou proměnných se stejným názvem, z nichž jedna je pole třídy a druhá místní proměnná.

Odkaz na pole třídy v tomto případě: this.class_field_name

 super - používá se jako odkaz na instanci nadtřídy za účelem poskytnutí přístupu k nestatické pole a metody nadtřídy.

Přístup k supertřídní pole je zajištěno výrazem: super.class_field_name

třída ClassA ( float x;

třída TřídaB rozšiřuje třídu A ( int x;

metoda public void l(int x) (

int iX1 = x; // přiřazení hodnoty parametru metody int iX2 = this.x; // přiřazení hodnoty poli této třídy float fX = super.x; // přiřazení hodnoty poli nadtřídy

Přístup k metodě nadtřídy poskytuje výraz: super.class_method_name()

Možnost kontaktování metoda nadtřídy užitečné při přepisování metody. V případě potřeby můžete v těle přepsané metody v podřízené třídě zorganizovat volání kódu staré metody z nadtřídy. Například:

metoda public void2() (...) ...

třída Třída B rozšiřuje třídu A (

public void metoda2() ( super.method2();

Použití tohoto a super v konstruktorech- viz příklad ConstrDemo.java s komentáři.

Rozhraní v Javě

Technologie vícenásobné dědictví, implementovaný v C++, umožňuje některé třídě dědit různé sady vlastnosti z několika nadtříd, nicméně vytváří mnoho problémů pro vývojáře kompilátorů a často způsobuje, že se v programech objevují skryté chyby. Na Vývoj v Javě Specialisté Sunu raději vyloučili z tohoto jazyka možnost přímého vícenásobného dědění tříd a používali rozhraní.

Rozhraní je jako abstraktní třída, zvláštní druh třídy bez implementace. Rozhraní

implementované třídou.

Objekty stejné třídy sdílejí společné chování (metody). Rozhraní umožňuje přidat popis chování objekt s novou funkčností, deklarující sadu metod, které by třída měla podporovat,

provádění toto rozhraní. Metody jsou implementovány ve třídě, nikoli v rozhraní.

Staženo z webu http://ivc.clan.su

Rozhraní je soubor metod bez implementace(bez těl), které mohou být později implementovány třídou. Rozhraní ukazuje Co některá třída by to měla udělat, ale ne

jak to dělá. Pro implementaci rozhraní musí třída definovat kompletní sadu metod,

které jsou deklarovány v rozhraní. V tomto případě může třída implementovat metody rozhraní jakýmkoli způsobem, který je pro vývojáře třídy nejvýhodnější.

Třída v Javě může implementovat více rozhraní a jedno rozhraní může používat více tříd.

Rozhraní lze tedy použít k poskytování specifických funkčnost(jinými slovy, schopnosti - "schopnost" - vykonávat určité funkce) do široké škály tříd: obě třídy,

které spolu zpočátku zcela nesouvisejí, ani se třídami propojenými hierarchií dědičnosti . Java má mnoho rozhraní, jejichž názvy mají charakteristickou příponu " schopný “ (například Runnable).

Definice rozhraní, stejně jako definice třídy v Javě, obsahuje dvě komponenty:

reklama a tělo.

Deklarace rozhraní vypadá takto:

Rozhraní Název_rozhraní *rozšíří seznam superrozhraní+

1. Modifikátory rozhraní

Public - specifikátor přístupu - označuje, že k tomuto rozhraní lze přistupovat z jiných balíčků. V případě nedostatek veřejného specifikátoru, přístup je povolen pouze v rámci balíčku, ve kterém je rozhraní umístěno.

Stejně jako veřejné třídy musí být veřejné rozhraní deklarováno v souboru s názvem InterfaceName.java.

Předpokládá se, že každé rozhraní má abstraktní implementační modifikátor. která se při vyhlašování neuvádí.

2. Název rozhraní

Jsou tvořeny podle stejných pravidel, která jsou akceptována pro názvy tříd. Doporučuje se, aby název jakéhokoli rozhraní, například třídy, začínal velkým písmenem!

3. Specifikace superrozhraní

Superrozhraní jsou specifikována pomocí klíčového slova extends.

Odvozené rozhraní by nemělo obsahovat popisy implementací nejen vlastních metod, ale ani metod superrozhraní.

Jakákoli třída, která implementuje odvozené rozhraní, musí definovat těla všech metod deklarovaných jak v tomto odvozeném rozhraní, tak v superrozhraní (nadrozhraních).

Tělo rozhraní je uzavřeno v – a může obsahovat pouze deklarace metody a deklarace konstant(statické finále pole).

Neustálá prohlášení

Každá proměnná rozhraní (pole) je standardně považována za proměnnou s modifikátory public , static a final . Tyto modifikátory nemusí být při deklaraci specifikovány, ale v praxi je užitečné je výslovně uvést jako neustálou připomínku stavu pole.

(veřejná statická konstanta) sobě a ostatním programátorům.

Konstanty jsou inicializovány, když jsou deklarovány.

Protože jsou konstanty veřejné, lze je použít v jakékoli třídě, která implementuje toto rozhraní. Pokud je rozhraní deklarováno jako veřejné, konstanty jsou dostupné jakékoli třídě bez ohledu na balíček.

Volání konstanty: Název_rozhraní.Konstantní_název

Prohlášení o metodě

Deklarování metody následované znakem ";" , má tvar:

.getTitle() + ", jednotková cena: "+ zboží[i].getPrice(1) + ", popis: " + zboží[i].getDescription() + "." );

)

Pomocí rozhraní je programátor schopen specifikovat popis „co třída dělá“, aniž by se staral o podrobnosti „jak to dělá“. Každá třída, která implementuje rozhraní, si může vybrat své vlastní metody implementace.

Programovací techniky: příklad použití rozhraní

Předpokládejme, že náš program má objekt, který monitoruje aktuální čas a každou minutu (když se změní čas) na to „upozorní“ ostatní objekty. To je velmi logické a pohodlný způsob organizování programu, ve kterém objekty musí něco udělat, když nastane určitý čas (nebo událost). Mnohem lepší než učit každý předmět sledovat čas.

Jeden objekt může něco „sdělit“ jinému objektu voláním jeho metody. Nechte metodu sayTime(int hours, int minutes) zpracovat časovou informaci. Aby bylo možné volat tuto metodu na objektu, musíte si být jisti, že taková metoda je popsána ve třídě tohoto objektu. Můžete definovat rozhraní, řekněme TimeListener, a implementovat ho do všech tříd, které potřebují sledovat čas, aniž byste zasahovali do základní hierarchie těchto tříd. A pak můžeme mít jakéhosi chytrého psa, který štěká úderem půlnoci, a jakési tlačítko, které se po určité době může automaticky vypnout.

Třída, která sleduje čas, bude mít interní seznam objektů typu TimeListener , metody pro přidávání a odebírání objektů do tohoto seznamu (tyto objekty, které „chtějí“ sledovat čas, budou volat tuto metodu) a každou minutu objekt typu tato třída (jeden takový objekt na celý program) zavolá metodu sayTime(int hours, int minutes) pro každý z objektů v tomto seznamu.

Balíčky a rozsahy

Balíčky

Balíček je skupina příbuzných tříd. Vztah může být libovolného typu: třídy, které spolu úzce spolupracují, třídy, které provádějí stejné funkce, nebo třídy od stejného vývojáře.*

Každý balíček má Jméno. Jméno je běžný Java identifikátor. Zvláštností je, že tento název je zároveň názvem složky, ve které jsou uloženy soubory třídy obsažené v balíčku. A tečka v názvu se převede na oddělovač jmen souborový systém. To znamená, že balíček s názvem java.util bude reprezentován složkou util umístěnou ve složce java.

Složka obsahuje soubory s příponou .java obsahující popisy tříd obsažených v balíčku. Na začátku takového souboru by měl být příkaz balíčku, za nímž následuje název balíčku.

Import balíků

Celý název třídy sestává z identifikátoru specifikovaného za klíčovým slovem class a před kterým je uveden název balíčku, ve kterém se třída nachází. Třídy ClassA a ClassB popsané v package1 jsou plně kvalifikovány jako package1.ClassA a package1.ClassB.

Třídy umístěné uvnitř stejného balíčku mohou navzájem používat zkrácené názvy (což jsme doposud vždy dělali). V jedné z metod třídy ClassA můžete definovat třídní proměnná ClassB , vytvořte objekt třídy ClassB a zavolejte jeho metodu (například f()) pomocí příkazů:

ClassB varb = new ClassB();

varb.f();

místo příkazů:

Package1.ClassB varb = new package1.ClassB();

varb.f();

Pokud jsou třídy v různých balíčcích, musí používat plně kvalifikované názvy, aby na sebe odkazovaly. Toto omezení lze obejít importem požadované třídy z jiného balíčku. Chcete-li importovat třídu, použijte klíčové slovo následuje import

celé jméno

. Můžete například importovat třídu Vector z balíčku java.util:

import java.util.Vector;

Nyní můžete místo java.util.Vector používat název Vector.

Chcete-li importovat balíček jako celek (to znamená, že na všechny třídy v balíčku lze odkazovat pomocí zkráceného názvu), za název balíčku se umístí tečka a hvězdička. Ano, tým

import java.util.*; importuje všechny soubory z balíčku java.util. Tuto metodu však nedoporučujeme používat, protože může importovat soubory se stejnými názvy z různých balíčků.* Eclipse usnadňuje vývojářům život. Pokud váš program používá třídu s neznámým názvem, zobrazí se na okrajích editoru kódu ikona upozornění na chybu. Klepnutím na tuto ikonu zobrazíte možnosti řešení problému. Například vytvořit nová třída. Nebo importujte existující (tím se zobrazí seznam všech dostupné balíčky obsahující třídu s tímto názvem). Pokud vyberete možnost "Importovat", odpovídající

dovozní směrnice bude automaticky přidán na začátek balíčku. Všechny třídy ve stejném balíčku musí mít

Pokud tedy importujete více balíčků, které obsahují třídy se stejným názvem, mohou se názvy zaměnit. Java se však s tímto problémem vypořádává tak, že zkrácený název „dává“ první z importovaných tříd. Můžete odkazovat na jinou třídu pomocí jejího celého názvu.

Pokud se názvy balíčků a tříd shodují, problém bude neřešitelný. A protože programátor může používat mnoho balíčků různí vývojáři, taková situace je dost pravděpodobná, pokud se vývojáři nedohodnou. Proto existuje konvence pro pojmenování balíčků (zejména těch, které lze později distribuovat).

Pro název balíčku se doporučuje použít adresu webu vývojáře. Téměř všichni seriózní vývojáři softwaru mají adresy webových stránek (a co je nejdůležitější, adresy webových stránek nemohou být stejné). Doporučuje se napsat adresu webu pozpátku. To znamená, že pokud je adresa sun.com, pak název balíčku musí začínat com.sun. Mimochodem, takových balíčků je ve vašem systému poměrně hodně, dodává je Sun Microsystems, vývojář jazyka Java.

Struktura souborů projektu Java

Projekt Java se tedy může skládat z několika balíčků. Každý balíček v struktura souboru operační systém odpovídá jedna složka.

Balíček může obsahovat třídy a rozhraní. Jsou uloženy v souborech s příponou .java.

Každý soubor s příponou .java musí popisovat jednu třídu nebo rozhraní, jejichž název odpovídá názvu tohoto souboru. Musí být deklarováno jako veřejné (klíčové slovo public je uvedeno před deklarací třídy). Všechny ostatní třídy a rozhraní z tohoto souboru jsou soukromé – nelze je používat mimo tento balíček (ani dlouho, ani krátké jméno). S třídou Pes, kterou jsme vyvinuli v minulé lekci, tedy můžete pracovat výhradně v jejím balíčku.

Všechny třídy a rozhraní, které mají být následně použity v jiných balíčcích, musí být deklarovány jako veřejné (a tedy umístěny v samostatných souborech).

Eclipse vytváří nový soubor s příponou .java automaticky, pokud spustíte příkaz Nový --> Třída nebo Nový --> Rozhraní .

Soubor s příponou .java je běžný textový soubor. Lze jej otevřít a upravit pomocí Eclipse nebo jakéhokoli jiného textový editor(i v poznámkovém bloku).

Pro každou třídu (veřejnou nebo soukromou) Java vytvoří soubor s příponou .class. Tento binární soubor, který ukládá příkazy na interní jazyk Java. Tyto soubory nelze v Eclipse upravovat (pokud se je pokusíte otevřít, Eclipse ve skutečnosti otevře odpovídající soubor .java). Aby vám nepřekážely, můžete je skrýt pomocí filtru. Chcete-li to provést, v zobrazení Navigátor klikněte na malé trojúhelníkové tlačítko vpravo (nabídka) a vyberte Filtry... V okně, které se otevře, zaškrtněte políčko vedle přípony .class, abyste skryli odpovídající soubory z Navigátoru. panel.

Rozsahy tříd

Rozsah třídy je část programu, ve které lze deklarovat proměnné a vytvářet objekty této třídy.

o objektech „neviditelných“ tříd

Objekt vytvořený v rámci jeho třídy může nadále existovat mimo něj. Ale proměnné typu „neviditelné“ třídy nelze deklarovat, takže k takovému objektu lze přistupovat pouze pomocí variabilní typy„viditelné“ třídy předků. V důsledku toho můžete volat pouze ty metody objektu, které jeho třída zdědila od odpovídajícího předka.

Běžná třída je v jejím balíčku vždy viditelná. Je-li třída veřejná, je viditelná také z jiných balíčků (v takovém případě je nutné na ni odkazovat pomocí svého celého jména nebo, pokud byl balíček dříve importován, zkráceného názvu).

Vnořené třídy deklarované bez modifikátoru public jsou viditelné pouze v metodách obsahující třídu. Třídy popsané v metodách jsou viditelné pouze v rámci těchto metod.

Anonymní třídy jsou viditelné pouze v týmu, který je vytvořil.

Rozsahy členů třídy

Členové třídy (metody a atributy) deklarované jako veřejné jsou viditelné všude tam, kde je viditelná samotná třída.

Členové třídy deklarované jako chráněné jsou viditelné v samotné třídě a jejích potomcích.

Členové třídy deklarovaní jako soukromí jsou viditelní pouze v rámci třídy.

Pokud na člena třídy není aplikován žádný z modifikátorů public , private , protected, je viditelný v aktuálním balíčku.

"Viditelnost" pole znamená, že jej lze použít ve výrazech, předat jako argument metodám a jeho hodnotu změnit pomocí přiřazení.

"Viditelnost" metody znamená, že ji lze volat.

K odkazování na pole a metody třídy se používá plně kvalifikovaný název, který se skládá z názvu objektu odpovídající třídy a skutečného názvu atributu nebo metody. V těle metody stejné třídy lze název objektu vynechat (pokud je tím myšlen - objekt, pro který je tato metoda volána).

Variabilní rozsahy

Proměnné deklarované v těle metody jsou viditelné od bodu deklarace do konce bloku, ve kterém se deklarace nachází. Hranice bloku jsou určeny složenými závorkami (). Proto v následujícím příkladu:

( int x = 0; ) ( int x = 2; )

jsou použity dvě různé proměnné x (první proměnná rovna 0 přestane existovat za hranicemi svého bloku).

Proměnné, které jsou parametry metody, jsou viditelné v celém těle metody.

Vyjmenované proměnné jsou volány lokální proměnné. Neměly by existovat dvě místní proměnné se stejnými názvy a překrývajícími se rozsahy. Nemůžete například deklarovat dvě proměnné takto:

int x = 0;

( int x = 2; )

Zejména nemůžete deklarovat proměnnou v těle metody, která odpovídá (podle názvu) jednomu z parametrů metody.

Konflikty jmen

Ke konfliktu názvů dochází, pokud existují dva objekty se stejnými názvy ve stejném oboru a tato situace je v jazyce povolena (jinak se nejedná o konflikt názvů, ale o chybu v programu).

Ke konfliktu názvů dochází, když jsou importovány dva balíčky obsahující třídy se stejným názvem.

V tomto případě Java upřednostňuje třídu, která byla importována jako první. Chcete-li odkazovat na jiné třídy, použijte jejich celé názvy. Java „vyhledává“ názvy tříd v následujícím pořadí. Nejprve jsou třídy importovány jednotlivě. Potom - třídy definované v tento balíček

. Nakonec jsou třídy z balíčků importovány zcela v pořadí příkazů importu.

Ke konfliktu názvů dochází také tehdy, když se název jednoho z parametrů metody shoduje s názvem jednoho z atributů stejné třídy. Tato situace nastává poměrně často, protože u metody, která mění hodnotu tohoto atributu, je pojmenování parametru tímto způsobem zcela jasné. Například:

třída Pes ( int věk; ... public void setAge(int age) ( ... ); ... )

Tato hlavička metody setAge(int age) je lepší než metoda setAge(int a), kterou jsme použili v minulé lekci, protože nám okamžitě umožňuje posoudit účel parametru. Nabízí se však otázka: k čemu bude v těle této metody odkazovat název věk - atribut nebo parametr.

Odpověď: k parametru. Název parametru "přepíše" název atributu.

Chcete-li odkazovat na atribut, musíte použít plně kvalifikovaný název (tj. ukazatel na tento objekt).

Implementace metody by měla vypadat takto: public void setAge(int age) ( this .age = age; };
Další čtení

1. Vjazovik N.A. Programování v Javě. (kapitola 8)

2. Khabibullin I.Sh. Výukový program Java 2 (kapitola 3)




Nahoru