Jáva | |
---|---|
Jazyková třída | multiparadigmatický programovací jazyk ,a software JVM |
Objevil se v | 1995 |
Autor | James Gosling a Sun Microsystems |
Vývojář | Sun Microsystems a Oracle |
Přípona souboru | .java, .class, .jar, .jadnebo.jmod |
Uvolnění | Java SE 18.0.2.1 ( 18. srpna 2022 ) |
Byl ovlivněn | C++ , C , Ada , Simula 67 , Smalltalk , Objective-C , Object Pascal , Oberon , Eiffel , Modula-3 , Mesa , Simula , C# , UCSD Pascal , wrapper , Variable function , Java anotace , Nicklaus Wirth , Patrick Naughton [d] a foreach |
Licence | GNU GPL [1] |
webová stránka | oracle.com/ru/java/ |
Mediální soubory na Wikimedia Commons |
Java [cca. 1] je silně typovaný obecný objektově orientovaný programovací jazyk vyvinutý společností Sun Microsystems (později koupenou společností Oracle ). Vývoj je řízen komunitou organizovanou prostřednictvím Java Community Process ; jazyk a základní technologie, které jej implementují, jsou distribuovány pod licencí GPL . Práva na ochranné známky jsou majetkem společnosti Oracle Corporation .
Java aplikace jsou obvykle přeloženy do speciálního bajtkódu , takže mohou běžet na libovolné počítačové architektuře , pro kterou existuje implementace Java Virtual Machine . Oficiální datum vydání je 23. května 1995. Zaujímá přední místo v žebříčku oblíbenosti programovacích jazyků (2. místo v žebříčku IEEE Spectrum (2020) [2] a TIOBE (2021) [3] ).
Jazyk se původně jmenoval Oak ("Dub"), vyvinutý Jamesem Goslingem pro programování zařízení spotřební elektroniky. Protože jazyk s tímto názvem již existoval, byl Oak přejmenován na Javu [4] . Pojmenováno po kávové značce Java, která zase dostala název stejnojmenného ostrova ( Java ), takže oficiální znak jazyka zobrazuje šálek horké kávy. Existuje další verze původu názvu jazyka, spojená s narážkou na kávovar jako příklad domácího zařízení pro programování, pro který byl jazyk původně vytvořen. V souladu s etymologií byl název jazyka v ruskojazyčné literatuře od konce dvacátého století do prvních let dvacátého prvního století často překládán jako Java, nikoli přepisován.
Výsledkem projektu bylo, že svět viděl zásadně nové zařízení, kapesní osobní počítač Star7 [5] , který předběhl dobu o více než 10 let, ale vzhledem k vysokým nákladům 50 USD nemohl způsobit revoluci svět technologií a byl zapomenut.
Zařízení Star7 nebylo populární, na rozdíl od programovacího jazyka Java a jeho prostředí. Další etapou v životě jazyka byl vývoj interaktivní televize. V roce 1994 se ukázalo, že interaktivní televize byla chyba.
Od poloviny 90. let se tento jazyk stal široce používaným pro psaní klientských aplikací a serverového softwaru. Současně si získala určitou oblibu technologie Java appletů , grafických Java aplikací vložených do webových stránek; S příchodem schopností dynamických webových stránek v roce 2000 se tato technologie stala méně používanou.
Vývoj webu používá Spring Framework ; pro dokumentaci se používá obslužný program Javadoc .
Java programy jsou přeloženy do Java bytecode , který je spouštěn Java Virtual Machine (JVM), což je program, který zpracovává bajtový kód a předává instrukce hardwaru jako interpret .
Výhodou tohoto způsobu spouštění programů je naprostá nezávislost bajtkódu na operačním systému a hardwaru , což umožňuje spouštět Java aplikace na jakémkoli zařízení, pro které existuje odpovídající virtuální stroj. Další důležitou vlastností technologie Java je flexibilní bezpečnostní systém, ve kterém je provádění programu zcela řízeno virtuálním strojem. Jakákoli operace, která překročí nastavená oprávnění programu (například pokus o neoprávněný přístup k datům nebo připojení k jinému počítači), způsobí okamžité přerušení.
Mezi nevýhody konceptu virtuálního stroje často patří snížení výkonu. Řada vylepšení mírně zvýšila rychlost programů Java:
Podle webu shootout.alioth.debian.org je u sedmi různých úloh doba provádění v Javě v průměru jedenapůlkrát až dvakrát delší než u C/C++, v některých případech je Java rychlejší a v v některých případech je 7x pomalejší [6] . Na druhou stranu u většiny z nich byla spotřeba paměti Java stroje 10 až 30krát větší než u programu v C/C++. Pozoruhodná je také studie společnosti Google , podle které je v testovacích případech v Javě výrazně nižší výkon a vyšší spotřeba paměti oproti podobným programům v C ++ [7] [8] [9] .
Myšlenky za konceptem a různými implementacemi prostředí virtuálního stroje Java inspirovaly mnoho nadšenců k rozšíření seznamu jazyků, které by mohly být použity k vytváření programů běžících na virtuálním stroji [10] . Tyto myšlenky jsou také vyjádřeny ve specifikaci Common Language Infrastructure ( CLI ) , která je základem platformy .NET společnosti Microsoft .
Vývoj Java začal v roce 1990, první oficiální verze - Java 1.0 - byla vydána až 21. ledna 1996.
Druhá verze byla vydána 19. února 1997 [11] .
Datum vydání 8. prosince 1998 [12] . Kódové jméno hřiště. V tomto případě je zmatek. Vyšly knihy, například Beginning Java 2 od Ivora Hortona (březen 1999), ve skutečnosti na J2SE 1.2 (dříve nazývané Java 2). Dodnes však vycházejí takové knihy např.: H. M. Deitel, P. J. Deitel, S. I. Santry. Java Programming Technologies 2. Distribuované aplikace (2011).
V době, kdy je známo, že Java 2 byla historicky nahrazena následnými vydáními, jsou takové názvy knih zavádějící, pokud jde o to, o jaké verzi Javy se vlastně píše. Pokud je J2SE 1.2 považováno za Java 2, ale autoři knih o Java 2 přijímají JDK 7, vede to k naprostému zmatku.
Datum vydání 8. května 2000. Krycí jméno Kestrel.
Datum vydání 6. února 2002. Krycí jméno Merlin.
Specifikace Java 5.0 byla vydána 30. září 2004 s kódovým označením Tiger. Od této verze bylo změněno oficiální indexování, místo Java 1.5 je správnější volat Java 5.0. Vnitřní indexování Sunu zůstává stejné – 1.x. Drobné změny jsou nyní zahrnuty beze změny indexování, k tomu se používá slovo "Update" nebo písmeno "u", například Java Development Kit 5.0 Update 22. Předpokládá se, že aktualizace mohou zahrnovat jak opravy chyb, tak drobné doplňky API, JVM.
V této verzi vývojáři provedli řadu zásadních vylepšení jazyka:
Verze byla vydána 11. prosince 2006 s kódovým označením Mustang. Oficiální indexování bylo změněno - místo očekávané 6.0 je verze uvedena jako 6. Drobné změny, jako v Javě 5.0, jsou provedeny v pravidelných aktualizacích verzí, například Java Standard Edition Development Kit 6 Update 27. Následující změny byl vyroben:
Datum vydání 8. října 2013.
JavaFX 2.2 je součástí aktualizace Java SE 7 update 6 [15] . Od verze 11 je modul dodáván odděleně od JDK [16] .
Datum vydání 10. října 2013. Kódové označení Micro Edition.
Verze byla vydána 28. července 2011 s kódovým označením Dolphin [17] . Finální verze Java Standard Edition 7 neobsahovala všechny dříve plánované změny. Podle plánu rozvoje (plán „B“) [18] , bude zařazení inovací rozděleno do dvou částí: Java Standard Edition 7 (bez lambda kalkulu , projekt Jigsaw a část vylepšení projektu Coin [ 19] ) a Java Standard Edition 8 (vše ostatní), naplánované na konec roku 2012.
V nové verzi s názvem Java Standard Edition 7 (Java Platform, Standard Edition 7) bylo kromě opravy velkého množství chyb představeno několik novinek. Tedy například nikoli proprietární balíček JDK , ale jeho otevřená implementace OpenJDK byla použita jako referenční implementace Java Standard Edition 7 a vydání nové verze platformy bylo připraveno v úzké spolupráci mezi inženýry Oracle a členy globálního ekosystému Java, výboru JCP (Java Community Process) a komunity OpenJDK . Všechny binární soubory referenční implementace Java Standard Edition 7 dodávané společností Oracle jsou postaveny na kódové základně OpenJDK a samotná referenční implementace je plně open-source pod licencí GPLv2 s výjimkami GNU ClassPath, které umožňují dynamické propojení s proprietárními produkty. Mezi další inovace patří integrace sady malých vylepšení jazyka Java vyvinutá projektem Coin, přidaná podpora pro dynamicky typované programovací jazyky jako Ruby , Python a JavaScript , podpora načítání tříd podle URL , aktualizovaný zásobník XML , který obsahuje JAXP. 1.4, JAXB 2.2a a JAX-WS 2.2 a další [20] .
Během 5 dnů před vydáním Java Standard Edition 7 bylo objeveno několik závažných chyb v optimalizaci horké smyčky, která je ve výchozím nastavení povolena a způsobuje pád Java Virtual Machine. Specialisté Oracle nedokázali nalezené chyby opravit v tak krátké době, ale slíbili, že budou opraveny ve druhé aktualizaci (Java 7 Update 2) a částečně v první [21] .
Seznam inovacíVerze byla vydána 19. března 2014. Krycí jméno Octopus.
Seznam inovacíKvůli potížím s implementací modulárního systému v rámci projektu Jigsaw bylo vydání verze, původně plánované na 22. září 2016, několikrát odloženo: nejprve se datum přesunulo na 23. března 2017 , poté na 27. července 2017 , a poté do 21. července 2017. září 2017 [25] [26] [27] .
Poslední datum se stalo oficiálním datem vydání verze [28] .
Seznam inovacíDatum vydání: 20. března 2018 [38] .
Seznam inovacíOficiální částečný seznam funkcí a plán vydání se nachází na webu OpenJDK .
Oficiální částečný seznam funkcí a plán vydání se nachází na webu OpenJDK . Datum vydání je 25. září 2018.
Seznam inovacíV Javě existuje několik hlavních rodin technologií:
Microsoft vyvinul vlastní implementaci JVM nazvanou Microsoft Java Virtual Machine.(MSJVM) [58] , který byl obsažen v různých operačních systémech počínaje Windows 98 (od verze 3 zahrnut i v Internet Exploreru , což umožnilo používat MSJVM ve Windows 95 a Windows NT 4 po instalaci IE3 + na tyto OS).
MSJVM měl významné rozdíly od Sun Java, v mnoha ohledech porušoval základní koncept přenositelnosti programů mezi různými platformami:
Úzká integrace Javy s DCOM a Win32 zpochybnila paradigma jazyka napříč platformami . Následně to byl důvod žalob od Sun Microsystems proti Microsoftu. Soud se přiklonil na stranu Sun Microsystems. Nakonec došlo mezi oběma společnostmi k dohodě o možnosti prodloužení doby oficiální podpory pro uživatele nestandardního Microsoft JVM do konce roku 2007 [58] .
V roce 2005 společnost Microsoft představila jazyk J# podobný Javě pro platformu .NET , který neodpovídá oficiální specifikaci jazyka Java a následně byl vyloučen ze standardní sady vývojářských nástrojů Microsoft Visual Studio , počínaje Visual Studio 2008 [59] .
Jazyk Java se aktivně používá k tvorbě mobilních aplikací pro operační systém Android. Současně jsou programy kompilovány do nestandardního bajtkódu pro použití jejich virtuálním strojem Dalvik (od Androidu 5.0 Lollipop byl virtuální stroj nahrazen ART ). Pro takovou kompilaci se používá další nástroj, a to Android SDK ( Software Development Kit ), vyvinutý společností Google .
Vývoj aplikací lze provádět v aplikacích Android Studio , NetBeans , Eclipse pomocí pluginu Android Development Tools (ADT) nebo IntelliJ IDEA . Verze JDK musí být 5.0 nebo vyšší.
8. prosince 2014 bylo Android Studio uznáno společností Google jako oficiální vývojové prostředí pro OS Android.
Pomocí technologií Java ( J2EE ) byly realizovány následující úspěšné projekty : RuneScape , Amazon [60] [61] , eBay [62] [63] , LinkedIn [64] , Yahoo! [65] .
Na technologie Java ( J2EE- ) se zaměřují především následující společnosti : SAP , IBM , Oracle . Konkrétně Oracle Database DBMS obsahuje jako svoji komponentu JVM, která poskytuje možnost přímo programovat DBMS v jazyce Java, včetně např. uložených procedur [66] .
Programy napsané v Javě mají pověst, že jsou pomalejší a zabírají více RAM než programy napsané v C [6] . Rychlost provádění programů napsaných v jazyce Java se však výrazně zlepšila s vydáním takzvaného JIT kompilátoru ve verzi 1.1 v letech 1997-1998, kromě dalších jazykových funkcí pro podporu lepší analýzy kódu (jako jsou vnitřní třídy, třídy StringBuffer[doc 5] , zjednodušené logické výpočty a tak dále). Navíc došlo k optimalizaci virtuálního stroje Java - od roku 2000 k tomu slouží virtuální stroj HotSpot . Od února 2012 je kód Java 7 přibližně 1,8krát pomalejší než kód C [67] .
Některé platformy nabízejí podporu spouštění hardwaru pro Javu [68] . Například mikrokontroléry, které spouštějí kód Java v hardwaru namísto softwarového JVM, a procesory založené na ARM, které podporují spouštění bajtového kódu Java prostřednictvím možnosti Jazelle.
V Javě je pouze 8 primitivních (skalárních, jednoduchých) typů : boolean, byte, char, short, int, long, float, double. Existuje také pomocný devátý primitivní typ - void, nicméně proměnné a pole tohoto typu nelze deklarovat v kódu a samotný typ se používá pouze k popisu třídy, která mu odpovídá, pro použití v reflexi : například pomocí Void[doc. 6] můžete zjistit, zda je určitá metoda typu void: Hello.class.getMethod("main", String[].class).getReturnType() == Void.TYPE.
Délky a rozsahy hodnot primitivních typů jsou definovány standardem, nikoli implementací, a jsou uvedeny v tabulce. Typ char byl vytvořen dvoubajtový pro usnadnění lokalizace (jeden z ideologických principů Javy): když byl standard vytvořen, Unicode -16 již existoval, ale ne Unicode-32. Protože v důsledku toho nezůstal žádný jednobajtový typ, byl přidán nový typový bajt a v Javě na rozdíl od jiných jazyků není bez znaménka. Typy floata doublemohou mít speciální hodnoty a „ne číslo“ ( NaN ). Pro dvojitý typ se označují , , ; pro typ - totéž, ale s předponou místo . Minimální a maximální hodnoty akceptované typy a jsou také standardizovány. Double.POSITIVE_INFINITYDouble.NEGATIVE_INFINITYDouble.NaNfloatFloatDoublefloatdouble
Typ | Délka (v bajtech) | Rozsah nebo sada hodnot |
---|---|---|
booleovský | 1 v polích, 4 v proměnných [69] | pravda, nepravda |
byte | jeden | −128..127 |
char | 2 | 0..2 16 −1 nebo 0..65535 |
krátký | 2 | −2 15 ..2 15 −1 nebo −32768..32767 |
int | čtyři | −2 31 ..2 31 −1 nebo −2147483648..2147483647 |
dlouho | osm | −2 63 ..2 63 −1 nebo přibližně −9.2 10 18 ..9.2 10 18 |
plovák | čtyři | -(2-2 −23 ) 2 127 ..(2-2 −23 ) 2 127 , nebo přibližně −3.4 10 38 ..3.4 10 38 , a také , , NaN |
dvojnásobek | osm | -(2-2 −52 ) 2 1023 ..(2-2 −52 ) 2 1023 , nebo přibližně −1.8 10 308 ..1.8 10 308 , stejně jako , , NaN |
Taková rigidní standardizace byla nezbytná k tomu, aby byl jazyk nezávislý na platformě, což je jeden z ideologických požadavků na Javu. Jeden malý problém s nezávislostí na platformě však stále zůstává. Některé procesory používají 10bajtové registry pro dočasné ukládání výsledků nebo zlepšují přesnost výpočtů jinými způsoby. Aby byla Java co nejvíce interoperabilní mezi různými systémy, byl v dřívějších verzích zakázán jakýkoli způsob, jak zlepšit přesnost výpočtů. To však mělo za následek pomalejší výkon. Ukázalo se, že zhoršení přesnosti kvůli nezávislosti na platformě málokdo potřebuje, zvláště když na to musí doplácet zpomalením práce programů. Po četných protestech byl tento zákaz zrušen, ale bylo přidáno klíčové slovo strictfp, které zakazuje zvyšovat přesnost.
Transformace v matematických operacíchJazyk Java má následující pravidla:
Tento způsob implicitní konverze vestavěných typů se zcela shoduje s převodem typů v C / C++ [70] .
Jazyk Java má pouze dynamicky vytvářené objekty. Proměnné typu objektu a objekty v Javě jsou zcela odlišné entity. Proměnné typu objektu jsou odkazy , tedy analogy ukazatelů na dynamicky vytvářené objekty. To je zdůrazněno syntaxí deklarace proměnných. Takže kód C++ může vypadat takto:
dvojité a [ 10 ][ 20 ] ; foo b ( 30 );Ale totéž v Javě bude vypadat úplně jinak:
double [][] a = new double [ 10 ][ 20 ] ; Foo b = nový Foo ( 30 );Během přiřazování, předávání do podprogramů a porovnávání se objektové proměnné chovají jako ukazatele, to znamená, že adresy objektů jsou přiřazovány, kopírovány a porovnávány. A při přístupu k datovým polím nebo metodám objektu s objektovou proměnnou nejsou vyžadovány žádné speciální dereferenční operace – přístup se provádí, jako by objektová proměnná byla objektem samotným.
Objektové proměnné jsou proměnné jakéhokoli typu, kromě primitivních. V Javě nejsou žádné explicitní ukazatele. Na rozdíl od ukazatelů v C, C++ a dalších programovacích jazycích jsou reference v Javě vysoce bezpečné kvůli přísným omezením jejich použití.
Díky takto speciálně zavedeným omezením je přímá manipulace s pamětí na úrovni fyzických adres v Javě nemožná (ačkoliv hodnota reference směřující k ničemu je definována: null).
Pokud je potřeba ukazatel na primitivní typ, použijí se obalové třídy primitivních typů: Boolean, Byte, Character, Short, Integer, Long, Float, Double.
Duplikování odkazů a klonováníPři přiřazování se objekt nekopíruje, protože objektové proměnné jsou referenční proměnné. Pokud tedy napíšete
Foo foo , bar ; ... bar = foo ;pak bude adresa zkopírována z proměnné foodo proměnné bar. To znamená fooa barbude ukazovat na stejnou paměťovou oblast, tedy na stejný objekt; pokus o změnu polí objektu odkazovaného proměnnou foozmění objekt odkazovaný proměnnou bara naopak. Pokud je potřeba získat ještě jen jednu kopii původního objektu, použijí buď metodu (členskou funkci, v terminologii C++) clone (), která vytvoří kopii objektu, nebo (méně často) kopírovací konstruktor (konstruktory v Javě nemůže být virtuální, takže instance třídy potomka bude nesprávně zkopírována konstruktorem třídy předka; metoda clone vyvolá požadovaný konstruktor a tím toto omezení obchází).
Metoda clone()[doc. 7] vyžaduje třídu pro implementaci rozhraní Cloneable[doc. 8] . Pokud třída implementuje rozhraní Cloneable, ve výchozím nastavení clone()zkopíruje všechna pole ( mělká kopie ). Pokud chcete klonovat pole (stejně jako jejich pole atd.) namísto kopírování, musíte přepsat clone(). Definování a použití metody clone()je často netriviální úkol [72] .
Inicializace proměnnéVšechny proměnné buď vyžadují explicitní definici, nebo jsou automaticky vyplněny nulami (0, null, false). Zmizí tak heisenbugy spojené s náhodným použitím neinicializované paměti, charakteristické pro jazyky nižší úrovně, jako je C.
Odvoz odpaduV jazyce Java není možné explicitně odstranit objekt z paměti - místo toho je implementován garbage collection . Tradičním trikem, jak dát sběrači odpadků „nápovědu“, jak uvolnit paměť, je nastavit proměnnou na null null, což může být efektivní, když potřebujete uvolnit objekt, který již není potřeba a na který se odkazuje v objektu s dlouhou životností [73 ] . To však neznamená, že objekt nahrazený hodnotou nullbude jistě a okamžitě smazán, ale existuje záruka, že tento objekt bude v budoucnu smazán. Tato technika pouze odebere odkaz na objekt, to znamená, že odpojí ukazatel od objektu v paměti. V tomto případě je třeba mít na paměti, že objekt garbage collector nesmaže, pokud na něj ukazuje alespoň jedna reference z použitých proměnných nebo objektů. Existují také metody pro iniciaci vynuceného shromažďování odpadu, ale není zaručeno, že budou volány běhovým prostředím a nejsou doporučeny pro běžné použití.
Java není procedurální jazyk: jakákoli funkce může existovat pouze v rámci třídy. To je zdůrazněno terminologií jazyka Java, kde neexistují pojmy „funkce“ nebo „členská funkce“ ( anglicky member function ), ale pouze metoda . Standardní funkce se také staly metodami. Například v Javě neexistuje žádná funkce , ale existuje sin()metoda Math.sin()třídy Math(obsahující kromě sin()metod cos(), exp(), sqrt(), abs()a mnoho dalších). Konstruktory v Javě nejsou považovány za metody. V Javě nejsou žádné destruktory a metoda finalize()by v žádném případě neměla být považována za analogickou s destruktorem.
KonstruktéřiKonstruktor je speciální metoda, která se nutně volá při vytvoření nového objektu, to znamená, že objekt (instanci třídy) nelze vytvořit bez volání konstruktoru třídy. Není vždy vhodné inicializovat všechny proměnné třídy, když je instanciována, takže proměnné instance jsou často deklarovány uvnitř těla konstruktoru, ale jsou inicializovány jako argumenty konstruktoru, když je třída konkretizována. Někdy je snazší nechat některé hodnoty vytvořit ve výchozím nastavení při vytváření objektu. V tomto případě jsou proměnné deklarovány a inicializovány uvnitř těla konstruktoru.
Konstruktor inicializuje objekt přímo v době vytvoření. Název konstruktoru je stejný jako název třídy, včetně velikosti písmen, a syntaxe konstruktoru je podobná syntaxi metody bez návratové hodnoty.
private int Cat (); // takto vypadá metoda pojmenovaná Cat jako Cat (); // takto vypadá konstruktor třídy CatNa rozdíl od metody konstruktor nikdy nic nevrací.
Konstruktor definuje akce, které se mají provést, když je vytvořen objekt třídy, a je důležitou součástí třídy. Programátoři se zpravidla snaží explicitně specifikovat konstruktor. Pokud neexistuje žádný explicitní konstruktor, Java jej automaticky vytvoří (prázdný) pro výchozí použití.
Jako příklad zvažte třídu Box, která představuje popis krabice. Konstruktor třídy jednoduše nastaví počáteční rozměry krabice.
classBox { int width ; _ // šířka pole int výška ; // výška pole int hloubka ; // hloubka krabice // Box konstruktoru ( int a , int b ) { width = a ; výška = b ; hloubka = 10 ; } // výpočet objemu krabice int getVolume () { return šířka * výška * hloubka ; } } Statické metody a poleJava (stejně jako C++) používá statická pole a statické metody ( statická metoda - v teorii programování se jim také říká metody tříd), které se specifikují pomocí klíčového slova . Statická pole (proměnné třídy) mají stejný význam jako v C++: každé takové pole je vlastnictvím třídy, takže pro přístup ke statickým polím nemusíte vytvářet instance odpovídající třídy. static
Například matematické funkce implementované ve třídě Math[doc. 9] jsou pouze statické metody této třídy. Proto je lze volat přímo ze třídy, aniž byste vytvořili její instanci, například:
double x = Matematika . hřích ( 1 );Vytváření instance statické třídy je zakázáno pomocí soukromého konstruktoru. Například vytvoření instance třídy Mathbude mít za následek chybu při kompilaci:
Matematika m = nová Matematika (); // Chyba: Math() má soukromý přístup v java.lang.Math double x = m . hřích ( 1 ); // Objekt by neměl metodu sin, protože je statickýProtože statické metody existují nezávisle na objektech (instancích třídy), nemají přístup k běžným (nestatickým) polím a metodám dané třídy. Zejména při implementaci statické metody NESMÍTE používat identifikátor this.
Funkce statického importu umožňuje volat statické funkce a konstanty bez zadání třídy. Příklad bez statického importu:
double x = Matematika . sin ( Math . tan ( Math . sqrt ( y )) + Math . floor ( 24.5 )) + Math . cos ( 42 * Math . PI );Stejný příklad, ale se statickými importy:
import static java.lang.Math.* ; ... double x = sin ( tan ( sqrt ( y )) + podlaha ( 24,5 )) + cos ( 42 * PI ); Dokončení (konečné)Klíčové slovo final(final) má při popisu pole, metody nebo třídy různé významy.
V Javě jsou metody, které nejsou explicitně deklarovány jako static, finalnebo private, v terminologii C++ virtuální : volání metody definované odlišně v základních a dědicích třídách vždy provádí kontrolu za běhu.
Abstraktní metoda ( modifikátor abstract) v Javě je metoda, která má parametry a návratový typ, ale nemá tělo. V odvozených třídách je definována abstraktní metoda. Analogem abstraktní metody v C++ je čistě virtuální funkce. Aby třída mohla popisovat abstraktní metody, musí být za abstraktní deklarována i samotná třída. Objekty abstraktní třídy nelze vytvořit.
RozhraníNejvyšším stupněm abstrakce v Javě je rozhraní (modifikátor interface). Rozhraní obsahuje převážně abstraktní metody, které mají úroveň veřejného přístupu: deskriptory abstracta publicnejsou pro ně ani vyžadovány. Od Java 8 a 9 však byla zavedena možnost použití v rozhraních.
- Java 8: statické ( static) metody a výchozí metody ( default);
- Java 9: metody s úrovní přístupu private.
Tyto metody obsahují tělo, což znamená, že nejsou abstraktní, ale v konkrétní implementaci rozhraní lze default-metody přepsat.
Rozhraní v Javě není považováno za třídu, i když je to ve skutečnosti zcela abstraktní třída. Třída může zdědit/ rozšířit ( extends) další třídu nebo implementovat ( implements) rozhraní. Rozhraní také může zdědit/rozšířit ( extends) další rozhraní.
V Javě nemůže třída dědit z více než jedné třídy, ale může implementovat více rozhraní. Vícenásobná dědičnost rozhraní není zakázána, to znamená, že jedno rozhraní lze zdědit z několika.
Jako typy parametrů metody lze použít rozhraní. Rozhraní nelze vytvořit instanci.
Rozhraní značekJava má rozhraní, která neobsahují metody pro implementaci, ale JVM s nimi zachází zvláštním způsobem: Cloneable, Serializable, RandomAccess, Remote.
Šablony v Javě (generika)Počínaje Javou 5.0 se v jazyce objevil generický programovací mechanismus – šablony, které jsou navenek blízké šablonám C++. Pomocí speciální syntaxe v popisu tříd a metod můžete zadat parametry typu, které lze použít v popisu jako typy polí, parametrů a návratových hodnot metod.
// Obecná deklarace třídy class GenericClass < E > { E getFirst () { ... } void add ( E obj ) { ... } } // Použití generické třídy v kódu GenericClass < String > obj = new GenericClass <> (); obj _ přidat ( "qwerty" ); Řetězec p = obj . getFirst ();Obecná deklarace tříd, rozhraní a metod je povolena. Syntaxe navíc podporuje deklarace omezených parametrů typu: specifikování konstrukce typu v deklaraci <T extends A & B & C...>vyžaduje, aby parametr typu T implementoval rozhraní A, B, C atd.
Na rozdíl od C# šablon nejsou Java šablony runtime podporovány - kompilátor jednoduše vytvoří bytecode, ve kterém již žádné šablony nejsou. Implementace šablon v Javě se zásadně liší od implementace podobných mechanismů v C++: kompilátor negeneruje samostatnou variantu třídy nebo šablonové metody pro každý případ použití šablony, ale jednoduše vytvoří implementaci jednoho bajtového kódu obsahující potřebné typové kontroly a přestavby. To vede k řadě omezení používání šablon v programech Java.
Kontrola členství ve tříděV Javě můžete explicitně zkontrolovat, do které třídy objekt patří. Výraz foo instanceof Fooje stejný true, pokud objekt foopatří do třídy Foonebo jejího potomka nebo implementuje rozhraní Foo(nebo obecněji zdědí třídu, která implementuje rozhraní, které zdědí Foo).
Dále funkce getClass()[doc. 10] , definovaný pro všechny objekty, vytváří objekt typu Class<?>. Pro každou třídu je vytvořen maximálně jeden objekt typu, který ji popisuje Class, takže lze tyto objekty porovnávat. Například foo.getClass() == bar.getClass()to bude pravda, pokud objekty fooa barpatří do stejné třídy.
Kromě toho lze objekt Class<?>libovolného typu získat takto: Integer.class, Object.class.
Přímé srovnání tříd není vždy nejlepším prostředkem pro kontrolu příslušnosti ke třídě. Často se místo toho používá funkce isAssignableFrom(). Tato funkce je definována na typovém objektu a jako parametr Classbere typový objekt . Class<?>Volání Foo.class.isAssignableFrom(Bar.class)se tedy vrátí true, pokud Fooje předkem třídy Bar. Protože všechny objekty jsou potomky typu Object, volání Object.class.isAssignableFrom()se vždy vrátí true.
Ve spojení se zmíněnými funkcemi typu objekt Classjsou funkce isInstance[doc. 11] (ekvivalent instanceof), stejně jako cast()(převede parametr na objekt vybrané třídy).
Zpracování chyb v Javě je podobné zpracování chyb v C++ s výjimkou potřeby finally. Tento rozdíl je způsoben tím, že Java se nemůže držet konceptu RAII kvůli přítomnosti garbage collectoru a k automatickému uvolňování zdrojů v destruktoru může docházet v nepředvídatelném pořadí v libovolných intervalech.
Zpracování chyb se provádí pomocí tryoperátorů catcha finally. Vyhozená chyba je popsána objektem určité třídy, který dědí z Throwable[doc. 12] a odpovídající typu chyby. Uvnitř bloku tryje kód, který může vyvolat výjimku, a blok catchzachytí typy chyb určené programátorem. V tomto případě můžete zadat více než jeden blok catchpro zpracování různých tříd chyb nebo multi-catch pro zpracování více chyb. Blok je volitelný, ale pokud je přítomen, je proveden bez ohledu na výskyt chyby a je určen k uvolnění zdrojů finallypřidělených během provozu bloku .try
Od Java 7 je rozhraní AutoCloseable[doc. 13] , který umožňuje implementovat třídy, které automaticky uvolňují zdroje. Objekty takových tříd musí být vytvořeny v závorkách před try. Jednoduchým příkladem automatického dealokace prostředků je čtení obsahu souboru:
import java.io.* ; public class Hlavní { public static void main ( String [] args ) vyvolá IOException { if ( argumenty . délka < 2 ) { Systém . chyba . println ( "Není zadán název souboru." ); vrátit se ; } String filename = args [ 1 ] ; // Otevřený soubor bude omylem automaticky uzavřen try ( BufferedReader reader = new BufferedReader ( new FileReader ( filename ))) { Řetězec ; _ for ( int n = 1 ; ( řádek = čtenář . readLine ()) != null ; ++ n ) { Systém . ven . println ( n + ": " + řádek ); } } catch ( FileNotFoundException e ) { Systém . chyba . println ( "Zadaný soubor nebyl nalezen." ); } // Konečně { // reader.close(); // automatické uzavření zdroje // } } }Java dodržuje koncept povinného specifikování chybových tříd, které může metoda vyvolat. To se provádí pomocí klíčového slova throwsza popisem metody. Pokud metoda neurčuje třídu výjimky (nebo jejího předka), kterou lze z metody vyvolat, způsobí to chybu kompilace. Koncept měl zajistit, aby se kód sám dokumentoval, označoval, které výjimky může konkrétní metoda vyvolat, ale v praxi se to zřídka ospravedlňuje, protože kvůli různým okolnostem může programátor specifikovat třídu jako výjimku, která má být vyvolána, Exceptionnebo uzavřít problematickou části metody v bloku try... catchignorovat jednotlivé chyby, nebo - v bloku try... finally, skrýt všechny možné chyby. Nevýhodou konceptu je také to, že programátor sám musí definovat a předepisovat výjimky, které může metoda vyhodit [74] .
Myšlenka jmenných prostorů je ztělesněna v balíčcích Java .
Název balíku Java je latinský (malá a velká písmena) s čísly (ne první na řádku) a podtržítkem (ne první ani poslední), což nejsou jazykové instrukce (pozn if. , null), oddělené tečkami .
Příklady správných jmen:
Příklady nesprávných jmen:
Balíčky obsahují třídy, rozhraní, výčty, anotace (atd.), jejichž názvy jsou latinské (malá a velká písmena) s čísly (nikoli první na řádku). V jednom souboru může být pouze jedna veřejná třída, rozhraní (atd.). Název veřejné třídy, rozhraní (atd.) v souboru se musí shodovat s názvem souboru. Každá třída má svůj vlastní jmenný prostor pro funkce, proměnné a podtřídy, podrozhraní (atd.) a podtřídu třídy můžete získat pomocí OuterClass.InnerClass, nebo můžete použít OuterClass$InnerClass, takže použití symbolu dolaru v názvu třídy se nedoporučuje.
Programový kód "Ahoj, světe!" .
třída ahoj svět { public static void main ( String [] args ) { Systém . ven . println ( "Ahoj světe!" ); } } Příklad použití generik import java.util.List ; import java.util.ArrayList ; public class Sample { public static void main ( String [] args ) { // Vytvoření objektu ze šablony. List < String > strings = new ArrayList <> (); struny . přidat ( "Ahoj" ); struny . přidat ( "svět" ); struny . přidat ( "!" ); for ( var string : strings ) { System . ven . print ( string + " " ); } } }odraz :
Příklad použití odrazu import java.lang.reflect.Field ; import java.lang.reflect.Metoda ; class TestClass { private int value ; public int getValue () { návratová hodnota ; } public void setValue ( int valueIn ) { this . hodnota = hodnotaIn ; } } public class Main { public static void main ( String [] args ) { var testClass = new TestClass (); for ( var pole : testClass . getClass (). getDeclaredFields ()) { System . ven . printf ( "jméno:%s, typ:%s \n" , pole .getName (), pole .getType (). getCanonicalName ( ) ); } for ( var metoda : testClass . getClass (). getDeclaredMethods ()) { System . ven . printf ( "jméno:%s, návratový typ:%s \n" , metoda .getName (), metoda .getReturnType (). getCanonicalName ( ) ); } } }Anotace :
Příklad anotace import java.lang.annotation.ElementType ; import java.lang.annotation.Retention ; import java.lang.annotation.RetentionPolicy ; import java.lang.annotation.Target ; @Retention ( RetentionPolicy . RUNTIME ) @Target ( ElementType . TYPE ) public @interface MyAnnotation { public boolean value () default false ; } @MyAnnotation ( value = true ) public class TestClass { } public class Main { public static void main ( String [] args ) { var testClass = new TestClass (); var myAnnotation = testClass . getClass (). getAnnotation ( MyAnnotation . class ); if ( myAnnotation != null ) { System . ven . printf ( "hodnota:%s \n" , mojeAnotace . hodnota ()); } } }V sociálních sítích | ||||
---|---|---|---|---|
Tematické stránky | ||||
Slovníky a encyklopedie | ||||
|
Jáva | |
---|---|
Platformy | |
Sun Technologies | |
Klíčové technologie třetích stran | |
Příběh |
|
Vlastnosti jazyka | |
Skriptovací jazyky |
|
Java konference |
|
Programovací jazyky | |
---|---|
|