Jáva | |
---|---|
Nyelvóra | többparadigmás programozási nyelv , JVM nyelv és szoftver |
Megjelent | 1995 |
Szerző | James Gosling és a Sun Microsystems |
Fejlesztő | Sun Microsystems és Oracle |
Fájlkiterjesztés _ | .java, .class, .jar, .jadvagy.jmod |
Kiadás | Java SE 18.0.2.1 ( 2022. augusztus 18. ) |
Befolyásolva | C++ , C , Ada , Simula 67 , Smalltalk , Objective-C , Object Pascal , Oberon , Eiffel , Modula-3 , Mesa , Simula , C# , UCSD Pascal , wrapper , Változó függvény , Java annotáció , Nicklaus annotáció Wirth , Patrick Naughton [d] és foreach |
Engedély | GNU GPL [1] |
Weboldal | oracle.com/ru/java/ |
Médiafájlok a Wikimedia Commons oldalon |
Java [kb. 1] egy erősen tipizált általános célú objektum-orientált programozási nyelv , amelyet a Sun Microsystems fejlesztett ki (később az Oracle szerezte meg ). A fejlesztést a Java közösségi folyamaton keresztül szervezett közösség hajtja ; a nyelvet és az azt megvalósító mögöttes technológiákat a GPL licenc alatt terjesztik . A védjegyjogok az Oracle Corporation tulajdonát képezik .
A Java-alkalmazásokat általában speciális bájtkódra fordítják , így bármely olyan számítógép-architektúrán futhatnak, amelyhez létezik a Java virtuális gép megvalósítása . A hivatalos megjelenési dátum 1995. május 23. A programozási nyelvek népszerűségi rangsorában előkelő helyet foglal el (2. hely az IEEE Spectrum (2020) [2] és a TIOBE (2021) [3] rangsorban .
A nyelv eredeti neve Oak ("tölgy"), amelyet James Gosling fejlesztett ki fogyasztói elektronikai eszközök programozására. Mivel egy ilyen nevű nyelv már létezett, az Oak-ot Java-ra nevezték át [4] . A Java kávémárkáról kapta a nevét , amely viszont az azonos nevű sziget ( Java ) nevet kapta, így a nyelv hivatalos emblémáján egy csésze forró kávé látható. A nyelv nevének eredetének van egy másik változata is, amely egy kávéfőzőre való utaláshoz kapcsolódik, mint egy háztartási programozási eszköz példájára, amely nyelvet eredetileg létrehozták. Az etimológiának megfelelően az orosz nyelvű irodalomban a huszadik század végétől a huszonegyedik század első éveiig a nyelv nevét gyakran Java-nak fordították, és nem írták át.
A projekt eredményeként a világ egy alapvetően új eszközt, a Star7 pocket személyi számítógépet [5] látott a világban , amely több mint 10 évvel megelőzte korát, de a magas, 50 dolláros költsége miatt nem tudott forradalmasítani. a technológia világát, és feledésbe merült.
A Star7 készülék nem volt népszerű, ellentétben a Java programozási nyelvvel és környezetével. A nyelv életének következő szakasza az interaktív televíziózás fejlődése volt. 1994-ben világossá vált, hogy az interaktív televíziózás tévedés.
Az 1990-es évek közepe óta a nyelvet széles körben használják kliens alkalmazások és szerverszoftverek írására . Ugyanakkor a Java kisalkalmazások , a weboldalakba ágyazott grafikus Java alkalmazások technológiája némi népszerűségre tett szert; A dinamikus weboldal -képességek megjelenésével a 2000-es években a technológia egyre kevésbé terjedt el.
A webfejlesztés a Spring Framework -et használja ; a Javadoc segédprogramot használják a dokumentációhoz .
A Java programokat Java bájtkódra fordítják , amelyet a Java Virtual Machine (JVM) hajt végre , egy olyan program, amely feldolgozza a bájtkódot, és tolmácsként utasításokat ad át a hardvernek .
A programok végrehajtásának ezen módjának az az előnye, hogy a bájtkód teljesen független az operációs rendszertől és a hardvertől , ami lehetővé teszi Java alkalmazások futtatását bármely olyan eszközön, amelyhez van megfelelő virtuális gép. A Java technológia másik fontos jellemzője a rugalmas biztonsági rendszer, amelyben a program végrehajtását teljes mértékben a virtuális gép vezérli. Minden olyan művelet, amely meghaladja a program beállított engedélyeit (például megkísérli az adatokhoz való jogosulatlan hozzáférést vagy csatlakozni egy másik számítógéphez), azonnali megszakítást okoz.
A virtuális gép koncepciójának hátrányai gyakran a teljesítmény romlása. Számos fejlesztés némileg növelte a Java programok sebességét:
A shootout.alioth.debian.org oldal szerint hét különböző feladat esetén a Java végrehajtási ideje átlagosan másfél-kétszer hosszabb, mint a C / C ++ esetében, bizonyos esetekben a Java gyorsabb, és egyes esetekben 7-szer lassabb [6] . Másrészt a legtöbbjüknél egy Java gép memóriafelhasználása 10-30-szor nagyobb volt, mint egy C/C++ programé. Szintén figyelemre méltó a Google által végzett tanulmány , amely szerint Java tesztesetekben lényegesen kisebb teljesítmény és nagyobb memóriafogyasztás tapasztalható a C ++ hasonló programjaihoz képest [7] [8] [9] .
A Java virtuálisgép-környezet koncepciójában és különféle megvalósításaiban rejlő ötletek sok rajongót inspiráltak arra, hogy bővítsék azon nyelvek listáját, amelyek segítségével virtuális gépeken futó programok hozhatók létre [10] . Ezeket az ötleteket a Common Language Infrastructure ( CLI ) specifikáció is kifejezi, amely a Microsoft .NET platformjának alapját képezte .
A Java fejlesztése 1990-ben kezdődött, az első hivatalos verzió - a Java 1.0 - csak 1996. január 21-én jelent meg.
A második verzió 1997. február 19-én jelent meg [11] .
Megjelenés dátuma: 1998. december 8. [12] . Codename Playground. Ebben az esetben zavar van. Könyvek jelentek meg, például a Beginning Java 2, Ivor Horton (1999. március), valójában a J2SE 1.2-n (korábbi nevén Java 2). Azonban a mai napig ilyen könyveket adnak ki, például: H. M. Deitel, P. J. Deitel, S. I. Santry. Java programozási technológiák 2. Elosztott alkalmazások (2011).
Abban az időben, amikor a Java 2-t történelmileg felváltották a későbbi kiadások, az ilyen könyvcímek félrevezetőek a tekintetben, hogy a Java melyik verziójáról írnak valójában. Ha a J2SE 1.2-t Java 2-nek tekintik, de a Java 2 könyvek szerzői elfogadják a JDK 7-et, ez teljes zűrzavarhoz vezet.
Megjelenés dátuma: 2000. május 8. Kestrel kódnév.
Megjelenés dátuma: 2002. február 6. Merlin kódnév.
A Java 5.0 specifikáció 2004. szeptember 30-án jelent meg Tiger kódnéven. Ettől a verziótól kezdve a hivatalos indexelés megváltozott, a Java 1.5 helyett helyesebb Java 5.0-nak hívni. A Sun belső indexelése változatlan marad – 1,x. A kisebb módosításokat most az indexelés megváltoztatása nélkül tartalmazza, ehhez az "Update" szót vagy az "u" betűt használják, például a Java Development Kit 5.0 22. frissítése. Feltételezzük, hogy a frissítések tartalmazhatnak hibajavításokat és kis kiegészítéseket is a API, JVM.
Ebben a verzióban a fejlesztők számos alapvető kiegészítést tettek a nyelven:
A verzió 2006. december 11-én jelent meg Mustang kódnéven. A hivatalos indexelés módosult - a várt 6.0 helyett a 6-os verzió szerepel. A Java 5.0-hoz hasonlóan kisebb változtatásokat hajtanak végre a rendszeres verziófrissítéseken, például a Java Standard Edition Development Kit 6 27. frissítésén. készültek:
Megjelenés dátuma: 2013. október 8.
A JavaFX 2.2 a Java SE 7 6. frissítésében található [15] . A 11-es verziótól a modult a JDK-tól külön szállítjuk [16] .
Megjelenés dátuma: 2013. október 10. Codename Micro Edition.
A verzió 2011. július 28-án jelent meg, kódnéven Dolphin [17] . A Java Standard Edition 7 végleges verziója nem tartalmazta az összes korábban tervezett változtatást. A fejlesztési terv („B” terv) [18] szerint az innovációk beépítése két részre oszlik: Java Standard Edition 7 ( lambda kalkulus nélkül , Jigsaw projekt, valamint a Coin projekt fejlesztéseinek egy része [ 19] ) és a Java Standard Edition 8 (az összes többi), a tervek szerint 2012 végére.
Az új, Java Standard Edition 7 (Java Platform, Standard Edition 7) verzióban a nagyszámú hiba kijavítása mellett számos újítást is bevezettek. Így például a Java Standard Edition 7 referencia implementációjaként nem a saját fejlesztésű JDK -csomagot , hanem annak nyílt implementációját , az OpenJDK -t használták, a platform új verziójának kiadását pedig az Oracle mérnökei és a szervezet tagjai között szoros együttműködésben készítették elő. globális Java ökoszisztéma, a JCP bizottság (Java Community Process) és az OpenJDK . Az Oracle által biztosított Java Standard Edition 7 referenciamegvalósítási binárisok mindegyike az OpenJDK kódbázisra épül , és maga a referenciaimplementáció teljesen nyílt forráskódú a GPLv2 licenc alatt , GNU ClassPath kivételekkel, hogy lehetővé tegye a védett termékekhez való dinamikus hivatkozást. Az egyéb újítások közé tartozik a Coin projekt által kifejlesztett kis Java nyelvi fejlesztések integrálása, a dinamikusan tipizált programozási nyelvek, például a Ruby , a Python és a JavaScript hozzáadott támogatása , az osztályok URL szerinti betöltésének támogatása, a JAXP -t is tartalmazó frissített XML - verem . 1.4, JAXB 2.2a és JAX-WS 2.2 és mások [20] .
A Java Standard Edition 7 megjelenése előtti 5 napban több komoly hibát fedeztek fel a hot loop optimalizálásban, amely alapértelmezés szerint engedélyezve van, és a Java virtuális gép összeomlását okozza. Az Oracle szakemberei a talált hibákat ilyen rövid időn belül nem tudták kijavítani, de megígérték, hogy a második frissítésben (Java 7 Update 2), részben pedig az elsőben javítják [21] .
Újítások listájaA verzió 2014. március 19-én jelent meg. Kódnév Octopus.
Újítások listájaA Jigsaw projekten belüli moduláris rendszer bevezetésének nehézségei miatt az eredetileg 2016. szeptember 22-re tervezett verzió megjelenését többször is elhalasztották: először a dátumot 2017. március 23- ra, majd 2017. július 27- re helyezték át. , majd 2017. július 21. 2017. szeptember [25] [26] [27] .
A legújabb dátum a verzió hivatalos megjelenési dátuma lett [28] .
Újítások listájaMegjelenés dátuma: 2018. március 20. [38] .
Újítások listájaA szolgáltatások és a kiadási terv hivatalos részlistája az OpenJDK webhelyén található .
A szolgáltatások és a kiadási terv hivatalos részlistája az OpenJDK webhelyén található . A megjelenés dátuma: 2018. szeptember 25.
Újítások listájaA Java-n belül számos nagy technológiacsalád létezik:
A Microsoft kifejlesztette saját JVM implementációját Microsoft Java Virtual Machine néven .(MSJVM) [58] , amely a Windows 98 - tól kezdve a különböző operációs rendszerekbe bekerült (a 3-as és újabb verzióktól kezdve az Internet Explorerbe is bekerült , ami lehetővé tette az MSJVM használatát Windows 95 és Windows NT 4 rendszerben az IE3+ telepítése után ezekre OS-ek).
Az MSJVM jelentős különbségeket mutatott a Sun Java-hoz képest, sok tekintetben megtörte a programok különböző platformok közötti hordozhatóságának alapvető koncepcióját:
A Java szoros integrációja a DCOM-mal és a Win32 -vel megkérdőjelezte a nyelv többplatformos paradigmáját. Ezt követően a Sun Microsystems pert indított a Microsoft ellen. A bíróság a Sun Microsystems oldalán állt. Végül megállapodás született a két vállalat között a nem szabványos Microsoft JVM felhasználóinak nyújtott hivatalos támogatási időszak 2007 végéig történő meghosszabbításának lehetőségéről [58] .
2005-ben a Microsoft bevezetett egy Java-szerű J# nyelvet a .NET platformhoz , amely nem felel meg a Java nyelv hivatalos specifikációjának, és ezt követően a Visual Studio 2008-tól kezdve kizárták a szabványos Microsoft Visual Studio fejlesztői eszközkészletéből [59]. .
A Java nyelvet aktívan használják mobil alkalmazások létrehozására Android operációs rendszerhez. Ugyanakkor a programokat nem szabványos bájtkódba fordítják Dalvik virtuális gépük számára (az Android 5.0 Lollipoptól kezdve a virtuális gépet az ART váltotta fel ). Az ilyen összeállításhoz egy további eszközt használnak, mégpedig az Android SDK-t ( Software Development Kit ), amelyet a Google fejlesztett ki .
Az alkalmazásfejlesztés az Android Stúdióban , a NetBeansben , az Eclipse -ben az Android Development Tools (ADT) beépülő modul vagy az IntelliJ IDEA segítségével történhet . A JDK verziónak 5.0-s vagy újabbnak kell lennie.
2014. december 8-án a Google elismerte, hogy az Android Studio az Android operációs rendszer hivatalos fejlesztői környezete.
Java ( J2EE ) technológiákkal a következő sikeres projektek valósultak meg : RuneScape , Amazon [60] [61] , eBay [62] [63] , LinkedIn [64] , Yahoo! [65] .
A következő cégek elsősorban a Java ( J2EE- ) technológiákra koncentrálnak: SAP , IBM , Oracle . Az Oracle Database DBMS komponensként tartalmaz egy JVM-et, amely lehetővé teszi a DBMS közvetlen programozását Java nyelven, beleértve például a tárolt eljárásokat [66] .
A Java nyelven írt programok lassabbak és több RAM-ot foglalnak el, mint a C-ben írottak [6] . A Java nyelven írt programok végrehajtási sebessége azonban jelentősen javult az úgynevezett JIT fordító 1.1-es verziójának 1997-1998-as kiadásával, a jobb kódelemzést támogató egyéb nyelvi szolgáltatások mellett (például belső osztályok, osztály StringBuffer[doc 5] , egyszerűsített logikai számítások és így tovább). Emellett a Java virtuális gépet is optimalizálták - 2000 óta a HotSpot virtuális gépet használják erre . 2012 februárjában a Java 7 kód körülbelül 1,8-szor lassabb, mint a C kód [67] .
Egyes platformok hardveres végrehajtási támogatást kínálnak a Java számára [68] . Például olyan mikrovezérlők, amelyek hardverben Java kódot futtatnak a szoftveres JVM helyett, és ARM-alapú processzorok, amelyek támogatják a Java bájtkód végrehajtását a Jazelle opción keresztül.
A Java-ban mindössze 8 primitív (skaláris, egyszerű) típus létezik : boolean, byte, char, short, int, long, float, double. Létezik egy kiegészítő kilencedik primitív típus is - void, azonban az ilyen típusú változók és mezők nem deklarálhatók a kódban, és maga a típus csak a neki megfelelő osztály leírására szolgál, reflexiós használatra : pl. Void[doc. 6] megtudhatja, hogy egy bizonyos módszer a következő típusú-e void: Hello.class.getMethod("main", String[].class).getReturnType() == Void.TYPE.
A primitív típusok hosszát és értéktartományát a szabvány határozza meg, nem az implementáció, és a táblázat tartalmazza. A char típust a lokalizáció kényelme érdekében kétbájtosra tették (a Java egyik ideológiai alapelve): a szabvány megalkotásakor a Unicode -16 már létezett, de a Unicode-32 nem. Mivel ennek eredményeként nem maradt egybájtos típus, új típusú bájt került hozzáadásra, amely Java-ban a többi nyelvtől eltérően nem előjel nélküli. floatA és típusok doublespeciális értékekkel és „nem számmal” ( NaN ) rendelkezhetnek. A kettős típusnál , , ; típushoz - ugyanaz, de előtag helyett . A és típusok által elfogadott minimális és maximális értékek szintén szabványosak. Double.POSITIVE_INFINITYDouble.NEGATIVE_INFINITYDouble.NaNfloatFloatDoublefloatdouble
Típusú | Hossz (bájtban) | Értéktartomány vagy értékkészlet |
---|---|---|
logikai érték | 1 a tömbökben, 4 a változókban [69] | igaz hamis |
byte | egy | −128..127 |
char | 2 | 0..2 16 −1, vagy 0..65535 |
rövid | 2 | −2 15 ..2 15 −1 vagy −32768..32767 |
int | négy | −2 31 ..2 31 −1 vagy −2147483648..2147483647 |
hosszú | nyolc | −2 63 ..2 63 −1, vagy körülbelül −9,2 10 18 ..9,2 10 18 |
úszó | négy | -(2-2 -23 ) 2 127 ..(2-2 -23 ) 2 127 , vagy körülbelül -3,4 10 38 ..3,4 10 38 , valamint , , NaN |
kettős | nyolc | -(2-2 -52 ) 2 1023 ..(2-2 -52 ) 2 1023 vagy körülbelül -1,8 10 308 ..1,8 10 308 , valamint , , NaN |
Ilyen merev szabványosításra volt szükség ahhoz, hogy a nyelv platformfüggetlen legyen, ami a Java egyik ideológiai követelménye. A platformfüggetlenséggel kapcsolatban azonban továbbra is fennáll egy kis probléma. Egyes processzorok 10 bájtos regisztereket használnak az eredmények közbenső tárolására, vagy más módon javítják a számítások pontosságát. Annak érdekében, hogy a Java a lehető legjobban átjárható legyen a különböző rendszerek között, a korai verziókban tilos volt a számítások pontosságának javítása. Ez azonban lassabb teljesítményt eredményezett. Kiderült, hogy a platformfüggetlenség érdekében keveseknek kell a pontosság romlása, főleg, ha a programok munkájának lelassításával kell fizetni érte. Számos tiltakozás után ezt a tiltást törölték, de hozzáadták a kulcsszót strictfp, amely tiltja a pontosság növelését.
Transzformációk a matematikai műveletekbenA Java nyelv a következő szabályokkal rendelkezik:
A beépített típusok implicit konverziójának ez a módszere teljesen egybeesik a C / C++ típuskonverzióval [70] .
A Java nyelv csak dinamikusan létrehozott objektumokat tartalmaz. Az objektum típusú változók és objektumok a Java-ban teljesen különböző entitások. Az objektumtípusok változói hivatkozások , azaz a dinamikusan létrehozott objektumokra mutató mutatók analógjai. Ezt hangsúlyozza a változók deklarációjának szintaxisa . Tehát a C++ kód így nézhet ki:
dupla a [ 10 ][ 20 ] ; foo b ( 30 );De ugyanaz a dolog Java-ban nagyon másképp fog kinézni:
double [][] a = új kettős [ 10 ][ 20 ] ; Foo b = új Foo ( 30 );A hozzárendelések, a szubrutinoknak való átadás és az összehasonlítások során az objektumváltozók mutatóként viselkednek, vagyis az objektumok címeit hozzárendeli, másolja és összehasonlítja. És amikor objektumváltozóval hozzáférünk egy objektum adatmezőihez vagy metódusaihoz, nincs szükség különleges hivatkozási műveletekre – a hozzáférés úgy történik, mintha az objektumváltozó maga lenne az objektum.
Az objektumváltozók bármilyen típusú változók, kivéve a primitíveket. A Java-ban nincsenek kifejezett mutatók. A C, C++ és más programozási nyelvek mutatóival ellentétben a Java hivatkozások rendkívül biztonságosak a használatukra vonatkozó szigorú korlátozások miatt.
Az ilyen speciálisan bevezetett korlátozásoknak köszönhetően a fizikai címek szintjén történő közvetlen memóriamanipuláció lehetetlen Java-ban (bár a semmire mutató hivatkozás értéke definiálva van: null).
Ha egy primitív típusra van szükség, akkor a primitív típusok burkolóosztályait használjuk: Boolean, Byte, Character, Short, Integer, Long, Float, Double.
Hivatkozások sokszorosítása és klónozásaHozzárendeléskor az objektum nem másolódik, mivel az objektumváltozók referenciaváltozók. Szóval, ha írsz
Foo foo , bár ; ... bár = foo ;fooakkor a cím változóból változóba lesz másolva bar. Vagyis fooés barfog mutatni ugyanarra a memóriaterületre, vagyis ugyanarra az objektumra; Ha megpróbálja megváltoztatni a változó által hivatkozott objektum mezőit, fooakkor a változó által hivatkozott objektum megváltozik , barés fordítva. Ha csak még egy példányt kell beszerezni az eredeti objektumból, akkor vagy olyan metódust (tagfüggvényt, C ++ terminológiában) használnak clone (), amely másolatot készít az objektumról, vagy (ritkábban) másolat konstruktort (konstruktorokat Java-ban ) nem lehet virtuális, így egy leszármazott osztály példányát helytelenül másolja át az ősosztály konstruktora; a klón módszer meghívja a kívánt konstruktort, és ezzel megkerüli ezt a korlátozást).
Módszer clone()[doc. 7] egy osztályt igényel egy interfész megvalósításához Cloneable[doc. 8] . Ha egy osztály megvalósítja az interfészt Cloneable, akkor alapértelmezés szerint az clone()összes mezőt másolja ( sekély másolás ). Ha másolás helyett klónozni szeretne mezőket (valamint azok mezőit és így tovább), felül kell írnia a clone(). Egy módszer meghatározása és használata clone()gyakran nem triviális feladat [72] .
Változó inicializálásaMinden változó vagy explicit definíciót igényel, vagy automatikusan nullákkal (0, null, false) kerül kitöltésre. Így az alacsony szintű nyelvekre, például a C -re jellemző inicializálatlan memória véletlen használatához kapcsolódó heisenbugok eltűnnek .
SzemétgyűjtésA Java nyelvben nem lehet kifejezetten törölni egy objektumot a memóriából – ehelyett a szemétgyűjtés valósul meg . Hagyományos trükk arra, hogy a szemétgyűjtőnek "tippeket" adjon a memória felszabadítására, egy változó nullra állítása null, ami akkor lehet hatékony, ha olyan objektumot kell felszabadítani, amelyre már nincs szükség, és amelyre egy hosszú élettartamú objektumban hivatkoznak [73 ] . Ez azonban nem jelenti azt, hogy az értékkel helyettesített objektum nullminden bizonnyal és azonnal törlődik, de garancia van arra, hogy a jövőben törlésre kerül. Ez a technika csak az objektumra való hivatkozást távolítja el, azaz leválasztja a mutatót a memóriában lévő objektumról. Ebben az esetben figyelembe kell venni, hogy az objektumot addig nem törli a szemétgyűjtő, amíg a használt változókból vagy objektumokból legalább egy hivatkozás rá mutat. Léteznek módszerek a kényszeres szemétszállítás kezdeményezésére is, de ezeket nem garantáltan hívja a futtatókörnyezet, és normál használatra sem ajánlott.
A Java nem procedurális nyelv: bármely függvény csak egy osztályon belül létezhet. Ezt hangsúlyozza a Java nyelv terminológiája, ahol a "function" vagy a "member function" ( angol tagfüggvény ) fogalma nincs , hanem csak metódus . A standard függvények is metódusokká váltak. Például a Java-ban nincs függvény , de van egy osztálymetódus (amely a , , , és még sok más sin()metódusokat is tartalmazza ). A Java konstruktorait nem tekintjük metódusnak. A Java-ban nincsenek destruktorok, és egy metódust semmiképpen sem szabad a destruktorral analógnak tekinteni. Math.sin()Mathsin()cos()exp()sqrt()abs()finalize()
KonstruktorokA konstruktor egy speciális metódus, amely szükségszerűen meghívódik egy új objektum létrehozásakor, vagyis egy objektum (egy osztály példánya) nem hozható létre az osztálykonstruktor meghívása nélkül. Nem mindig kényelmes inicializálni az osztály összes változóját, amikor példányosodik, ezért a példányváltozókat gyakran a konstruktor törzsében deklarálják, de konstruktor argumentumaként inicializálják az osztály példányosítása során. Néha könnyebb bizonyos értékeket alapértelmezés szerint létrehozni az objektum létrehozásakor. Ebben az esetben a változók deklarálása és inicializálása a konstruktor törzsében történik.
A konstruktor közvetlenül a létrehozáskor inicializálja az objektumot. A konstruktor neve megegyezik az osztály nevével, beleértve a kis- és nagybetűket is, és a konstruktor szintaxisa hasonló a visszatérési érték nélküli metóduséhoz.
magán int Cat (); // így néz ki a Cat nevű metódus, mint a Cat (); // így néz ki a Cat osztály konstruktoraA metódusokkal ellentétben a konstruktor soha nem ad vissza semmit.
A konstruktor meghatározza az osztály objektumának létrehozásakor végrehajtandó műveleteket, és az osztály fontos része. A programozók általában megpróbálnak kifejezetten megadni egy konstruktort. Ha nincs kifejezett konstruktor, akkor a Java automatikusan létrehoz egyet (üres) az alapértelmezett használatra.
Példaként vegyünk egy osztályt Box, amely egy doboz leírását reprezentálja. Az osztálykonstruktor egyszerűen beállítja a doboz kezdeti méreteit.
classBox { int szélesség ; _ // doboz szélessége int magasság ; // doboz magassága mélységben ; // dobozmélység // Konstruktor Box ( int a , int b ) { width = a ; magasság = b ; mélység = 10 ; } // a doboz térfogatának kiszámítása in getVolume ( ) { return szélesség * magasság * mélység ; } } Statikus módszerek és mezőkA Java (valamint a C++) statikus mezőket és statikus metódusokat használ ( static method - a programozáselméletben osztálymetódusoknak is nevezik), amelyeket a kulcsszóval adunk meg . A statikus mezőknek (osztályváltozóknak) ugyanaz a jelentése, mint a C++-ban: minden ilyen mező az osztály sajátja, így a statikus mezők eléréséhez nem kell példányokat létrehoznia a megfelelő osztályból. static
Például az osztályban megvalósított matematikai függvények Math[doc. 9] csak statikus metódusai ennek az osztálynak. Ezért közvetlenül hívhatók az osztályból anélkül, hogy példányt hoznának létre belőle, például:
double x = matematika . bűn ( 1 );Tilos statikus osztály példányának létrehozása privát konstruktor használatával. Például egy osztály példányának létrehozása Mathfordítási idejű hibát eredményez:
Math m = új matematika (); // Hiba: A Math() privát hozzáféréssel rendelkezik a java.lang.Math double x = m -ben . bűn ( 1 ); // Az objektumnak nem lenne sin metódusa, mivel statikusMivel a statikus metódusok az objektumoktól (egy osztály példányaitól) függetlenül léteznek, nem férnek hozzá az adott osztály szabályos (nem statikus) mezőihez és metódusaihoz. Különösen statikus metódus implementálásakor NEM SZABAD használni az azonosítót this.
A statikus importálás funkció lehetővé teszi statikus függvények és konstansok meghívását osztály megadása nélkül. Példa statikus import nélkül:
double x = matematika . sin ( Math . tan ( Math . sqrt ( y )) + Math . floor ( 24,5 )) + Math . cos ( 42 * Math . PI );Ugyanez a példa, de statikus importálással:
import statikus java.lang.Math.* ; ... dupla x = sin ( barna ( sqrt ( y )) + padló ( 24,5 )) + cos ( 42 * PI ); Befejezés (végleges)A (final) kulcsszó finaleltérő jelentéssel bír egy mező, metódus vagy osztály leírásakor.
Java-ban a nem kifejezetten static, finalvagy private-ként deklarált metódusok a C++ terminológiában virtuálisak : az alap- és az öröklődő osztályokban eltérő módon definiált metódusok meghívása mindig futási ellenőrzést hajt végre.
A Java absztrakt metódusa ( módosító abstract) olyan metódus, amely paraméterekkel és visszatérési típussal rendelkezik, de nincs törzse. Az absztrakt metódusokat származtatott osztályokban határozzák meg. A C++ absztrakt metódusának analógja egy tisztán virtuális függvény. Ahhoz, hogy egy osztály le tudjon írni absztrakt metódusokat, magát az osztályt is absztraktnak kell nyilvánítani. Absztrakt osztályobjektumok nem hozhatók létre.
InterfészekA Java legmagasabb absztrakciós foka az interfész (módosító interface). A felület többnyire absztrakt metódusokat tartalmaz, amelyek nyilvános hozzáférési szinttel rendelkeznek: leírók abstract, és publicnem is szükségesek hozzájuk. A Java 8 és 9 óta azonban bevezették az interfészekben való használat lehetőségét.
- Java 8: statikus ( static) metódusok és alapértelmezett metódusok ( default);
- Java 9: hozzáférési szinttel rendelkező módszerek private.
Ezek a metódusok tartalmaznak egy törzset, ami azt jelenti, hogy nem absztraktak, de az interfész egy adott megvalósításában a default-metódusok felülbírálhatók.
A Java interfészt nem tekintik osztálynak, bár valójában egy teljesen absztrakt osztályról van szó. Egy osztály örökölhet/ kibővíthet ( extends) egy másik osztályt, vagy megvalósíthat ( implements) egy interfészt. Ezenkívül egy interfész örökölhet/kibővíthet ( extends) egy másik interfészt.
Java-ban egy osztály nem örökölhet több osztályból, de több interfészt is megvalósíthat. Az interfészek többszörös öröklése nem tilos, vagyis egy interfész többről is örökölhető.
Az interfészek metódusparaméter-típusként használhatók. Az interfészek nem példányosíthatók.
Marker interfészekA Java olyan felületekkel rendelkezik, amelyek nem tartalmaznak implementációs metódusokat, de a JVM speciális módon kezeli őket: Cloneable, Serializable, RandomAccess, Remote.
Javasablonok (általános)A Java 5.0-tól kezdve egy általános programozási mechanizmus jelent meg a nyelvben - olyan sablonok, amelyek külsőleg közel állnak a C ++ sablonokhoz. Speciális szintaxist használva az osztályok és metódusok leírásában megadhat típusparamétereket, amelyek a leíráson belül használhatók mezőtípusként, paraméterként és metódusok visszatérési értékeként.
// Általános osztály deklaráció class GenericClass < E > { E getFirst () { ... } void add ( E obj ) { ... } } // Általános osztály használata a kódban GenericClass < String > obj = new GenericClass <> (); obj . add ( "qwerty" ); Karakterlánc p = obj . getFirst ();Az osztályok, interfészek és metódusok általános deklarációja megengedett. Ezenkívül a szintaxis támogatja a korlátozott típusú paraméterek deklarációit: egy típuskonstrukció megadása a deklarációban <T extends A & B & C...>megköveteli, hogy a T típusparaméter megvalósítsa az A, B, C és így tovább interfészeket.
A C#-sablonokkal ellentétben a Java-sablonokat a futási környezet nem támogatja - a fordító egyszerűen bájtkódot hoz létre, amelyben már nincsenek sablonok. A sablonok Java-ban való megvalósítása alapvetően különbözik a hasonló mechanizmusok C ++-ban való megvalósításától: a fordító nem generál egy-egy osztály- vagy sablonmetódus külön változatát minden egyes sablonhasználati esethez, hanem egyszerűen egyetlen bájtkódos implementációt hoz létre, amely tartalmazza a szükséges típusellenőrzéseket és átalakításokat. Ez számos korlátozáshoz vezet a sablonok Java programokban való használatára vonatkozóan.
Az osztálytagság ellenőrzéseJava nyelven kifejezetten ellenőrizheti, hogy egy objektum melyik osztályba tartozik. A kifejezés foo instanceof Fooakkor egyenlő true, ha az objektum fooegy osztályhoz Foovagy annak leszármazottjához tartozik, vagy interfészt valósít meg Foo(vagy általánosabban örököl egy osztályt, amely egy interfészt valósít meg, amely örökli a -t Foo).
Továbbá a függvény getClass()[doc. 10] , az összes objektumhoz definiált, egy típusú objektumot állít elő Class<?>. Minden osztályhoz legfeljebb egy, azt leíró típusú objektum jön létre Class, így ezek az objektumok összehasonlíthatók. Így például foo.getClass() == bar.getClass()igaz lesz, ha az objektumok fooés az objektumok barugyanabba az osztályba tartoznak.
Ezen túlmenően Class<?>bármilyen típusú objektum beszerezhető így: Integer.class, Object.class.
Az osztályok közvetlen összehasonlítása nem mindig a legjobb módszer az osztálytagság ellenőrzésére. Gyakran egy függvényt használnak helyette isAssignableFrom(). Ez a függvény egy típusú objektumon van definiálva, Classés egy típusobjektumot vesz Class<?>paraméterként. Így a hívás Foo.class.isAssignableFrom(Bar.class)akkor tér vissza true, ha Fooaz osztály őse Bar. Mivel minden objektum a típus leszármazottja Object, a hívás Object.class.isAssignableFrom()mindig visszatér true.
A típusú objektum említett funkcióival együtt Classa függvények isInstance[doc. 11] (egyenértékű a -val instanceof), valamint cast()(a paramétert a kiválasztott osztály objektumává alakítja).
A Java hibakezelése hasonló a C++ hibakezeléséhez, kivéve egy finally. Ez a különbség abból adódik, hogy a Java nem tud ragaszkodni a RAII koncepcióhoz a szemétgyűjtő jelenléte miatt, és az erőforrások automatikus felszabadítása a destruktorban előre nem látható sorrendben, tetszőleges időközönként megtörténhet.
A hibakezelés a try, catchés operátorokkal történik finally. A kidobott hibát egy bizonyos osztályú objektum írja le, amely a Throwable[doc. 12] és a hiba típusának megfelelő. A blokkon belül tryolyan kód található, amely kivételt tud dobni, és a blokk catchelkapja a programozó által megadott típusú hibákat. Ebben az esetben egynél több blokkot is megadhat catcha különböző hibaosztályok kezelésére, vagy több fogást több hiba kezelésére. A blokk nem kötelező, de ha van, akkor a hiba előfordulásától függetlenül lefut, és célja finallya blokk működése során lefoglalt tryerőforrások felszabadítása.
A Java 7 óta az interfész AutoCloseable[doc. 13] , amely lehetővé teszi olyan osztályok megvalósítását, amelyek automatikusan felszabadítják az erőforrásokat. Az ilyen osztályok objektumait zárójelben kell létrehozni a try. Az automatikus erőforrás-felszabadítás egyszerű példája egy fájl tartalmának beolvasása:
import java.io.* ; public class Fő { public static void main ( String [ ] args ) IOException { if ( args . hossz < 2 ) { Rendszer . hiba . println ( "Nincs megadva fájlnév." ); visszatérés ; } String fájlnév = args [ 1 ] ; // A megnyitott fájl véletlenül automatikusan bezárul try ( BufferedReader olvasó = new BufferedReader ( new FileReader ( fájlnév ))) { Húrvonal ; _ for ( int n = 1 ; ( sor = olvasó . readLine ()) != null ; ++ n ) { Rendszer . ki . println ( n + ": " + sor ); } } catch ( FileNotFoundException e ) { Rendszer . hiba . println ( "A megadott fájl nem található." ); } // végül { // reader.close(); // automatikus erőforrás bezárás // } } }A Java ragaszkodik ahhoz a koncepcióhoz, hogy kötelező megadni azokat a hibaosztályokat, amelyeket egy metódus dobhat. Ez egy kulcsszó használatával történik throwsa metódus leírása után. Ha a metódus nem ad meg a metódusból kidobható kivételosztályt (vagy annak elődjét), akkor ez fordítási hibát okoz. A koncepciónak a kódot öndokumentálóvá kellett volna tennie, jelezve, hogy egy adott metódus milyen kivételeket dobhat, de a gyakorlatban ez ritkán igazolja magát, mert a különféle körülmények miatt a programozó megadhat egy osztályt kivételként, amelyet ki kell dobni, Exceptionvagy problémásnak zárhat be. metódus részei egy blokkban try... catchaz egyes hibák figyelmen kívül hagyására, vagy - a blokkban try... finally, az összes lehetséges hiba elrejtése. A koncepció hátránya az is, hogy a programozónak magának kell meghatároznia és előírnia azokat a kivételeket, amelyeket a metódus dobhat [74] .
A névterek gondolatát a Java csomagok testesítik meg .
A Java csomag neve latin (kis- és nagybetű), számokkal (nem az első a sorban) és aláhúzással (nem az első és nem az utolsó), amelyek nem nyelvi utasítások (megjegyzés if, null), pontokkal elválasztva. .
Példák a helyes névre:
Példák helytelen névre:
A csomagok osztályokat, felületeket, felsorolásokat, megjegyzéseket (stb.) tartalmaznak, amelyek neve latin (kis- és nagybetű), számokkal (nem az első a sorban). Egy fájlban csak egy nyilvános osztály, interfész (stb.) lehet. A fájlban található nyilvános osztály, interfész (stb.) nevének meg kell egyeznie a fájl nevével. Minden osztálynak megvan a saját névtere a függvények, változók és alosztályok, alinterfészek (stb.) számára, és egy osztály alosztályát a OuterClass.InnerClass, vagy használhatja OuterClass$InnerClass, így a dollár szimbólum használata az osztály nevében nem ajánlott.
Programkód "Hello, world!" .
class hello world { public static void main ( String [ ] args ) { Rendszer . ki . println ( "Szia, világ!" ); } } Példa a generikumok használatára import java.util.List ; import java.util.ArrayList ; public class Minta { public static void main ( String [] args ) { // Objektum létrehozása sablonból. Lista < String > strings = new ArrayList <> (); húrok . add ( "Hello" ); húrok . add ( "világ" ); húrok . add ( "!" ); for ( var string : strings ) { System . ki . print ( string + " " ); } } }Reflexió :
Példa a reflexió használatára import java.lang.reflect.Field ; import java.lang.reflect.Method ; class TestClass { private int value ; public int getValue () { return value ; } public void setValue ( int valueIn ) { this . érték = valueIn ; } } public class Main { public static void main ( String [] args ) { var testClass = new TestClass (); for ( var mező : testClass . getClass (). getDeclaredFields ()) { System . ki . printf ( "név:%s, típus:%s \n" , mező .getName (), mező .getType (). getCanonicalName ( ) ); } for ( var metódus : testClass . getClass (). getDeclaredMethods ()) { System . ki . printf ( "név:%s, visszatérési típus:%s \n" , metódus .getName (), metódus .getReturnType (). getCanonicalName ( ) ); } } } Annotációs példa 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 logikai érték () alapértelmezett false ; } @MyAnnotation ( érték = igaz ) 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 . ki . printf ( "érték:%s \n" , myAnnotation . value ()); } } }A közösségi hálózatokon | ||||
---|---|---|---|---|
Tematikus oldalak | ||||
Szótárak és enciklopédiák | ||||
|
Jáva | |
---|---|
Platformok | |
Sun Technologies | |
Harmadik fél kulcsfontosságú technológiái | |
Sztori |
|
Nyelvi tulajdonságok | |
Szkriptnyelvek |
|
Java konferenciák |
|
Programozási nyelvek | |
---|---|
|