Java | |
---|---|
Kieliluokka | moniparadigma ohjelmointikieli , JVM-kieli ja ohjelmisto |
Esiintyi | 1995 |
Tekijä | James Gosling ja Sun Microsystems |
Kehittäjä | Sun Microsystems ja Oracle |
Tiedostotunniste _ | .java,,, .class_ .jar_ .jad_.jmod |
Vapauta | Java SE 18.0.2.1 ( 18. elokuuta 2022 ) |
Vaikutettu | C++ , C , Ada , Simula 67 , Smalltalk , Objective-C , Object Pascal , Oberon , Eiffel , Modula-3 , Mesa , Simula , C# , UCSD Pascal , wrapper , Variable function , Java-merkintä , Nicklaus Wirth , Patrick Naughton [D] ja Foreach |
Lisenssi | GNU GPL [1] |
Verkkosivusto | Oracle.com/ru/java/ |
Mediatiedostot Wikimedia Commonsissa |
Java [noin 1] on vahvasti tyypitetty yleiskäyttöinen olio-ohjelmointikieli , jonka on kehittänyt Sun Microsystems (myöhemmin hankkinut Oracle ). Kehitystä ohjaa Java Community Processin kautta organisoitu yhteisö ; kieli ja sen toteuttavat taustateknologiat jaetaan GPL-lisenssin alaisena . Tavaramerkkioikeudet omistaa Oracle Corporation .
Java-sovellukset käännetään yleensä erityiseksi tavukoodiksi , joten niitä voidaan käyttää missä tahansa tietokonearkkitehtuurissa , jolle on olemassa Java Virtual Machine -toteutus . Virallinen julkaisupäivä on 23. toukokuuta 1995. Se sijoittuu korkealle ohjelmointikielten suosiossa (2. sija IEEE Spectrum (2020) [2] ja TIOBE (2021) [3] rankingissa ).
Kieli kutsuttiin alun perin Oak ("Oak"), jonka on kehittänyt James Gosling ohjelmoimaan kuluttajaelektronisia laitteita. Koska kieli, jolla oli nimeä jo olemassa, Oak nimettiin uudelleen Javalle [4] . Kahvimerkki Java, joka puolestaan sai samannimisen saaren nimen ( Java ), joten kielen virallinen tunnus näyttää kupin kuumaa kahvia . Kielen nimen alkuperästä on toinen versio, joka liittyy viittaukseen kahvinkeittimeen esimerkkinä kotitalouslaitteesta, jonka ohjelmointi on alun perin luotu. Venäjän tarkistavan kirjallisuuden etymologian mukaisesti kahdennenkymmenennenkymmenennen vuoden lopusta kahdenkymmenen vuosisadan ensimmäisiin vuosiin käännettiin usein Javaksi, eikä niitä ole kirjoitettu.
Projektin seurauksena maailma näki pohjimmiltaan uuden laitteen, Star7 Pocket -tietokoneen [5] , joka oli aikansa edellä yli 10 vuotta, mutta 50 dollarin korkeiden kustannusten vuoksi se ei voinut mullistaa tekniikan maailma ja unohdettiin.
Star7 -laite ei ollut suosittu, toisin kuin Java -ohjelmointikieli ja sen ympäristö. Kielen elämän seuraava vaihe oli interaktiivisen television kehitys. Vuonna 1994 kävi selväksi, että interaktiivinen televisio oli virhe.
1990-luvun puolivälistä lähtien kieltä on käytetty laajasti asiakassovellusten ja palvelinohjelmistojen kirjoittamiseen . Samanaikaisesti Java -sovelmien tekniikka , graafiset Java -sovellukset, jotka on upotettu verkkosivuille, saivat suosion; 2000 -luvulla dynaamisten verkkosivuominaisuuksien myötä tekniikkaa käytettiin vähemmän laajasti.
Verkkokehitys käyttää kevään kehystä ; Javadoc -apuohjelmaa käytetään dokumentointiin .
Java -ohjelmat käännetään Java -tavukoodiksi , jonka suorittaa Java Virtual Machine (JVM), ohjelma, joka käsittelee tavukoodia ja välittää ohjeet laitteistolle tulkkina .
Ohjelmien toteuttamistavan etuna on tavukoodin täydellinen riippumattomuus käyttöjärjestelmästä ja laitteistosta , jonka avulla voit suorittaa Java -sovelluksia kaikissa laitteissa, joille on olemassa vastaava virtuaalikone. Toinen tärkeä Java -tekniikan ominaisuus on joustava tietoturvajärjestelmä, jossa virtuaalikone hallitsee ohjelman kokonaan. Kaikki toimenpiteet, jotka ylittävät ohjelman asettamat käyttöoikeudet (kuten luvattoman pääsyn yrittäminen tietoihin tai yhteyden muodostaminen toiseen tietokoneeseen), aiheuttaa välittömän keskeytyksen.
Usein virtuaalikonekonseptin haitat sisältävät suorituskyvyn heikkenemisen. Useat parannukset lisäsivät hieman Java -ohjelmien nopeutta:
Sivuston ampuma.alioth.debian.org mukaan seitsemälle eri tehtävälle JAVA: n toteutusaika on keskimäärin puolitoista tai kaksi kertaa pidempään kuin C / C ++: lla, joissain tapauksissa Java on nopeampi ja In Sissa Joitakin tapauksia se on 7 kertaa hitaampi [6] . Toisaalta suurimmalle osalle Java -koneen muistin kulutus oli 10–30 kertaa suurempi kuin C/C ++ -ohjelman. Myös huomionarvoinen on Googlen suorittama tutkimus, jonka mukaan suorituskyky on huomattavasti pienempi ja korkeampi muistin kulutus testitapauksissa Java -tapauksissa verrattuna samanlaisisiin ohjelmiin C ++ : ssa [7] [8] [9] .
Java -virtuaalikoneympäristön konseptin ja erilaisten toteutusten taustalla olevat ideat ovat inspiroineet monia harrastajia laajentamaan kielten luetteloa, joita voitaisiin käyttää virtuaalikoneessa toimivien ohjelmien luomiseen [10] . Nämä ideat ilmaistaan myös CLI: n yleisen kielen infrastruktuurin ( CLI ) eritelmässä , joka tuki Microsoftin .NET -alustan .
Java -kehitys alkoi vuonna 1990, ensimmäinen virallinen versio - Java 1.0 - julkaistiin vasta 21. tammikuuta 1996.
Toinen versio julkaistiin 19. helmikuuta 1997 [11] .
Julkaisupäivä 8. joulukuuta 1998 [12] . Codename Playground. Tässä tapauksessa on hämmennystä. Kirjoja on julkaissut esimerkiksi Ivor Hortonin Beginning Java 2 (maaliskuu 1999), itse asiassa J2SE 1.2:lla (aiemmin Java 2). Kuitenkin tähän päivään asti tällaisia kirjoja on julkaistu, esimerkiksi: H. M. Deitel, P. J. Deitel, S. I. Santry. Java-ohjelmointitekniikat 2. Hajautetut sovellukset (2011).
Aikana, jolloin Java 2: n tiedetään olevan historiallisesti korvaavat myöhemmät julkaisut, tällaiset kirjan otsikot ovat harhaanjohtavia siitä, mistä Java -versiosta ne todella kirjoitetaan. Jos J2SE 1.2: n katsotaan olevan Java 2, mutta Java 2 -kirjojen kirjoittajat hyväksyvät JDK 7, tämä johtaa täydelliseen sekaannukseen.
Julkaisupäivä 8. toukokuuta 2000. Koodinimi Kestrel.
Julkaisupäivä 6.2.2002. Koodinimi Merlin.
Java 5.0 -määritys julkaistiin 30. syyskuuta 2004, koodinimeltään Tiger. Tämän version jälkeen virallista indeksointia on muutettu Java 1.5: n sijasta, on oikeampaa soittaa Java 5.0: lle. Sunin sisäinen indeksointi pysyy samana - 1.x. Pienet muutokset ovat nyt mukana muuttamatta indeksointia, tähän käytetään sanaa "Päivitä" tai kirjainta "u", esimerkiksi Java Development Kit 5.0 Update 22. Oletetaan, että päivitykset voivat sisältää sekä virheenkorjauksia että pieniä lisäyksiä API, JVM.
Tässä versiossa kehittäjät ovat tehneet joukon perustavanlaatuisia lisäyksiä kieleen:
Versio julkaistiin 11. joulukuuta 2006 koodinimellä Mustang. Virallista indeksointia on muutettu - odotetun 6.0:n sijasta versio on listattu numerolla 6. Pieniä muutoksia, kuten Java 5.0:ssa, tehdään tavallisiin versiopäivityksiin, esimerkiksi Java Standard Edition Development Kit 6 -päivitykseen 27. Seuraavat muutokset on tehty:
Julkaisupäivä 8.10.2013.
Javafx 2.2 sisältyy Java SE 7 -päivitykseen 6 [15] . Versiosta 11 moduuli lähetetään erikseen JDK: sta [16] .
Julkaisupäivä 10.10.2013. Koodinimi Micro Edition.
Versio julkaistiin 28. heinäkuuta 2011, koodinimi Dolphin [17] . Java Standard Edition 7:n lopullinen versio ei sisältänyt kaikkia aiemmin suunniteltuja muutoksia. Kehittämissuunnitelman (suunnitelma "B") [18] mukaan innovaatioiden sisällyttäminen jaetaan kahteen osaan: Java Standard Edition 7 (ilman lambda-laskentaa , Jigsaw-projekti ja osa Coin-projektin parannuksista [ 18]). 19] ) ja Java Standard Edition 8 (kaikki loput), jotka on määrä julkaista vuoden 2012 lopussa.
Uudessa versiossa, nimeltään Java Standard Edition 7 (Java Platform, Standard Edition 7), lukuisten virheiden korjaamisen lisäksi esiteltiin useita innovaatioita. Joten esimerkiksi Java Standard Edition 7:n referenssitoteutuksena ei käytetty omaa JDK -pakettia , vaan sen avointa toteutusta OpenJDK :ta , ja alustan uuden version julkaisua valmisteltiin tiiviissä yhteistyössä Oraclen insinöörien ja organisaation jäsenten välillä. globaali Java-ekosysteemi, JCP -komitea (Java Community Process) ja OpenJDK . Kaikki Oraclen toimittamat Java Standard Edition 7 -viitetoteutusbinaarit on rakennettu OpenJDK -koodikannan päälle , ja itse viitetoteutus on täysin avoimen lähdekoodin GPLv2 - lisenssin alainen GNU ClassPath-poikkeuksilla, jotta dynaaminen linkitys mahdollistaa patentoituihin tuotteisiin. Muita innovaatioita ovat Coin-projektin kehittämien pienten Java-kielen parannusten integrointi, lisätty tuki dynaamisesti kirjoitetuille ohjelmointikielille, kuten Ruby , Python ja JavaScript , tuki luokkien lataamiselle URL -osoitteen perusteella, päivitetty XML - pino, joka sisältää JAXP :n. 1.4, JAXB 2.2a ja JAX-WS 2.2 ja muut [20] .
За 5 дней до выхода релиза Java Standard Edition 7 было обнаружено несколько серьёзных ошибок в горячей оптимизации циклов, которая включена по умолчанию и приводит виртуальную машину Java к краху. Специалисты Oracle найденные ошибки за столь короткий срок исправить не могли, но пообещали, что они будут исправлены во втором обновлении (Java 7 Update 2) и частично в первом [21] .
Versio julkaistiin 19. maaliskuuta 2014. Koodinimi Octopus.
Jigsaw-projektin modulaarisen järjestelmän käyttöönotossa ilmenneiden vaikeuksien vuoksi alun perin 22. syyskuuta 2016 suunnitellun version julkaisua lykättiin useita kertoja: ensin päivämäärä siirrettiin 23. maaliskuuta 2017 , sitten 27. heinäkuuta 2017. , ja sen jälkeen 21. heinäkuuta 2017. Syyskuuhun 2017 [25] [26] [27] .
Последняя дата стала официальной датой релиза версии [28] .
Julkaisupäivä: 20. maaliskuuta 2018 [38] .
Официальный частичный список нововведений и план релиза расположен на сайте OpenJDK .
Virallinen osittainen luettelo ominaisuuksista ja julkaisusuunnitelmasta löytyy OpenJDK:n verkkosivustolta . Julkaisupäivä on 25.9.2018.
Внутри Java существует несколько основных семейств технологий:
Компанией Microsoft была разработана собственная реализация JVM под названием Microsoft Java Virtual Machine(MSJVM) [58] , включавшаяся в состав различных операционных систем , начиная с Windows 98 (также входила в Internet Explorer от версии 3 и выше, что позволяло использовать MSJVM в ОС Windows 95 и Windows NT 4 после установки IE3+ на данные ОС).
MSJVM имела существенные отличия от Sun Java, во многом ломающие основополагающую конмрагающую конмрагамлаѶжАмцепцию перенос
Javan tiukka integraatio DCOM:n ja Win32 :n kanssa on kyseenalaistanut kielen cross-platform paradigman. Myöhemmin tämä oli syynä Sun Microsystemsin Microsoftin vastaisiin kanteisiin. Tuomioistuin oli Sun Microsystemsin puolella. Lopulta yhtiöt pääsivät sopimukseen mahdollisuudesta jatkaa epätyypillisen Microsoft JVM:n käyttäjien virallisen tuen ajanjaksoa vuoden 2007 loppuun asti [58] .
В 2005 году компанией Microsoft для платформы .NET был представлен Java-подобный язык J# , не соответствующий официальной спецификации языка Java и исключённый впоследствии из стандартного инструментария разработчика Microsoft Visual Studio , начиная с Visual Studio 2008 [59] .
Java-kieltä käytetään aktiivisesti mobiilisovellusten luomiseen Android-käyttöjärjestelmään. Samaan aikaan ohjelmat käännetään epästandardiksi tavukoodiksi Dalvik -virtuaalikoneensa käyttöön ( Android 5.0 Lollipopista alkaen virtuaalikoneen on korvattu ART :lla ). Tällaiseen kokoamiseen käytetään lisätyökalua, nimittäin Googlen kehittämää Android SDK:ta ( Software Development Kit ) .
Sovelluskehitys voidaan tehdä Android Studiossa , NetBeansissa , Eclipsessä Android Development Tools (ADT) -laajennuksella tai IntelliJ IDEA :lla . JDK-version on oltava 5.0 tai uudempi.
Google tunnusti Android Studion 8. joulukuuta 2014 Android-käyttöjärjestelmän viralliseksi kehitysympäristöksi.
Seuraavat onnistuneet projektit on toteutettu Java ( J2EE ) -teknologioilla: RuneScape , Amazon [60] [61] , eBay [62] [63] , LinkedIn [64] , Yahoo! [65] .
Seuraavat yritykset keskittyvät pääasiassa Java ( J2EE- ) teknologioihin: SAP , IBM , Oracle . Erityisesti Oracle Database DBMS sisältää komponenttina JVM:n, joka mahdollistaa DBMS:n suoraan ohjelmoinnin Java-kielellä, mukaan lukien esimerkiksi tallennetut proseduurit [66] .
Javalla kirjoitetuilla ohjelmilla on maine hitaampina ja enemmän RAM-muistia vievinä kuin C-kielellä kirjoitetut [6] . Java-kielellä kirjoitettujen ohjelmien suoritusnopeus parani kuitenkin merkittävästi, kun ns. JIT-kääntäjä julkaistiin vuosina 1997-1998 versiossa 1.1, muiden parempaa koodianalyysiä tukevien kieliominaisuuksien lisäksi (kuten sisäluokat, luokka StringBuffer[doc 5] , yksinkertaistetut logiikkalaskelmat ja niin edelleen). Lisäksi Java-virtuaalikonetta on optimoitu - vuodesta 2000 lähtien tähän on käytetty HotSpot - virtuaalikonetta . Helmikuusta 2012 lähtien Java 7 -koodi on noin 1,8 kertaa hitaampi kuin C-koodi [67] .
Jotkut alustat tarjoavat laitteiston suoritustukea Javalle [68] . Esimerkiksi mikro-ohjaimet, jotka käyttävät Java-koodia laitteistossa ohjelmiston JVM:n sijaan, ja ARM-pohjaiset prosessorit, jotka tukevat Java-tavukoodin suorittamista Jazelle-vaihtoehdon kautta.
Javassa on vain 8 primitiivistä (skalaari, yksinkertainen) tyyppiä : boolean, byte, char, short, int, long, float, double. On olemassa myös apuyhdeksäs primitiivityyppi - void, tämän tyyppisiä muuttujia ja kenttiä ei kuitenkaan voida ilmoittaa koodissa, ja itse tyyppiä käytetään vain kuvaamaan sitä vastaavaa luokkaa, käytettäväksi heijastuksessa : esim. Void[doc. 6] voit selvittää, onko tietty menetelmä tyyppiä void: Hello.class.getMethod("main", String[].class).getReturnType() == Void.TYPE.
Alkuperäisten tyyppien arvojen pituudet ja alueet määräytyvät standardin, ei toteutuksen, mukaan, ja ne on annettu taulukossa. Koska seurauksena ei ollut yksitavuista tyyppiä, he lisäsivät uuden tyyppisen tavun, ja Javassa, toisin kuin muissa kielissä, se ei ole laitonta. Tyypeillä voi olla erikoisarvoja ja "ei numeroa" ( NAN ). Double -tyypin osalta ne on merkitty ,, ; Tyypille - sama, mutta sen sijaan etuliitteellä . Tyyppikohtaiset vähimmäis- ja maksimiarvot ovat myös standardoituja. floatdoubleDouble.POSITIVE_INFINITYDouble.NEGATIVE_INFINITYDouble.NaNfloatFloatDoublefloatdouble
Tyyppi | Pituus (tavuina) | Arvoalue tai joukko |
---|---|---|
boolean | 1 taulukoissa, 4 muuttujissa [69] | totta, valhetta |
tavu | yksi | −128...127 |
hiiltyä | 2 | 0..2 16 −1, или 0..65535 |
lyhyt | 2 | −2 15 ..2 15 −1, или −32768..32767 |
int | neljä | −2 31 ..2 31 −1 tai −2147483648..2147483647 |
pitkä | kahdeksan | −2 63 ..2 63 −1 eli noin −9,2 · 10 18 ..9,2 · 10 18 |
kellua | neljä | -(2-2 −23 ) 2 127 .. (2-2 −23 ) 2 127 tai suunnilleen −3,4 10 38 ..3,4 10 38 ja myös , nan |
kaksinkertainen | kahdeksan | -(2-2 −52 )·2 1023 ..(2-2 −52 )·2 1023 , tai esim. −1,8·10 308 ..1,8·10 308 , а также , , NaN |
Tämä johti kuitenkin suorituskyvyn heikkenemiseen.strictfp
Matemaattisten operaatioiden muutoksetJava-kielellä on seuraavat säännöt:
Tämä rakennetun tyypin implisiittinen muuntamismenetelmä on täysin samaan aikaan kuin tyyppien muuntaminen Si / C ++ : ksi [70] .
Java -kielellä on vain dynaamisesti luotuja esineitä. Objektityyppi ja Java -objektit ovat täysin erilaisia kokonaisuuksia. Objektityyppimuuttujat ovat linkkejä , ts . Indikaattorien analogit dynaamisesti luotuihin objekteihin. Tätä korostaa muuttujien kuvauksen syntaksi . Joten C ++ : n koodi voi näyttää seuraavasti:
Double a [ 10 ] [ 20 ] ; FOO B ( 30 );Mutta sama asia Javassa näyttää täysin erilaiselta:
Kaksinkertainen [] [] a = uusi kaksinkertainen [ 10 ] [ 20 ] ; Foo b = uusi Foo ( 30 );Tehtävien, siirron alaryhmiin ja vertailuihin siirtäminen, objektimuuttujat käyttäytyvät osoittimina, ts. Ne osoitetaan, kopioidaan ja verrataan objektien osoitteisiin . Ja kun pääset objektimuuttujan avulla objektin tietokenttiin tai menetelmiin, erityisiä laajennustoimintoja ei tarvita - tämä pääsy suoritetaan ikään kuin objektimuuttuja olisi itse objekti.
Objektit ovat kaiken tyyppisiä muuttujia, paitsi primitiivisiä. Javassa ei ole ilmeisiä indikaattoreita.
Благодаря таким специально введённым ограничениям в Java невозможно прямое манипулирование памятью на уровне физических адресов (хотя определено значение ссылки, не указывающей ни на что: null).
Если нужен указатель на примитивный тип, используются классы-обёртки примитивных типов : Boolean, Byte, Character, Short, Integer, Long.FloatDouble
Linkkien kopiointi ja kloonausMääritettäessä objektia ei kopioida, koska objektimuuttujat ovat viittauksia. Eli jos kirjoitat
Foo Foo , baari ; ... baari = foo ;Eli ne osoittavat saman muistialueen, eli saman kohteen; Yritys muuttaa sen objektin kenttiä, johon muuttuja viittaa , muuttaa objektia, johon muuttuja liittyy , ja päinvastoin. Jos aloitusobjektista on hankittava toinen kopio , käytä joko menetelmää (jäsenfunktio, terminologiassa C ++) , joka luo objektin kopion, tai (harvemmin) kopiosuunnittelijaa (Javan suunnittelijat ) ei voi olla virtuaalinen, joten luokan kopio on virheellinen. Copped Class Class -suunnittelijan toimesta; kloonausmenetelmä saa aikaan halutun suunnittelijan ja mahdollistaa siten tämän rajoituksen kiertämisen). foobarfoobarfoobarclone ()
Menetelmä clone()[telakka. 7] vaatii luokan käyttöliittymän toteuttamiseksi Cloneable[Dock. 8] . Jos luokka toteuttaa käyttöliittymän Cloneable, kopioi oletusarvoisesti clone()kaikki kentät ( pieni kopio ).clone()clone()
Muuttujien alustusKaikki muuttujat joko vaativat selkeän määritelmän tai ne täytetään automaattisesti nolilla (0,, null) false. Näin ollen geysenbags , jotka liittyvät kutsutun muistin satunnaiseen käyttöön, jotka ovat ominaisia matalan tason kielille, kuten SI , katoavat .
RoskakeräysJava-kielessä on mahdotonta poistaa objektia nimenomaisesti muistista - sen sijaan toteutetaan roskien kokoonpano . Perinteinen tekniikka, joka antaa roskankeräilijälle ”vihjeen” muistin vapauttamisen tarpeesta, on muuttuvan tyhjän arvon nullottaminen, joka voi tarvittaessa olla tehokas vapauttamaan tarpeettoman objektin, johon linkki on tallennettu pitkäikäiseen objektiin. [73] . Tämä ei kuitenkaan tarkoita, että arvolla korvattu objekti nullvarmasti ja välittömästi poistetaan, mutta on takuu, että tämä objekti poistetaan tulevaisuudessa. Tämä tekniikka vain eliminoi linkin objektiin, eli se yhdistää osoittimen muistissa olevasta objektista. On syytä muistaa, että roskankerääjä ei poista objektia, vaikka vähintään yksi linkki käytetyistä muuttujista tai objekteista osoittaa sen. On olemassa myös menetelmiä pakotetun roskankeräyksen aloittamiseen, mutta ajonaika ei välttämättä kutsu niitä, eikä niitä suositella normaaliin käyttöön.
Java ei ole proseduurikieli: mikä tahansa funktio voi olla olemassa vain luokassa. Tätä korostaa Java-kielen terminologia, jossa ei ole käsitteitä "funktio" tai "jäsenfunktio" ( englanniksi member function ), vaan vain menetelmä . Myös standardifunktioista on tullut menetelmiä. Esimerkiksi Javassa ei ole funktiota , mutta on sin()luokkametodi (sisältää Math.sin()mettojen Mathlisäksi sin()metodit cos(), exp(), sqrt(), abs()ja monet muut). Javan rakentajia ei pidetä menetelminä. Javassa ei ole tuhoajia, eikä menetelmää finalize()tulisi missään tapauksessa pitää analogisena destruktorin kanssa.
RakentajatKonstruktori on erityinen menetelmä, jota kutsutaan välttämättä, kun uusi objekti luodaan, eli objektia (luokan esiintymää) ei voida luoda kutsumatta luokan konstruktoria. Ei ole aina kätevää alustaa luokan kaikkia muuttujia, kun se on instantoitu, joten ilmentymämuuttujat ilmoitetaan usein konstruktorin rungossa, mutta ne alustetaan konstruktoriargumenteiksi, kun luokka instantoidaan. Joskus on helpompi luoda joitakin arvoja oletusarvoisesti, kun objekti luodaan. Tässä tapauksessa muuttujat ilmoitetaan ja alustetaan konstruktorin rungossa.
Rakentaja alustaa objektin suoraan luomishetkellä. Konstruktorin nimi on sama kuin luokan nimi, kirjainkoko mukaan lukien, ja rakentajan syntaksi on samanlainen kuin menetelmällä ilman palautusarvoa.
yksityinen kissa ( ); // tältä Cat-niminen menetelmä näyttää Cat (); // tältä Cat-luokan konstruktori näyttääToisin kuin menetelmä, rakentaja ei koskaan palauta mitään.
Konstruktori määrittelee toimet, jotka on suoritettava, kun luokan objekti luodaan, ja se on tärkeä osa luokkaa. Yleensä ohjelmoijat yrittävät määrittää rakentajan eksplisiittisesti. Jos eksplisiittistä rakentajaa ei ole, Java luo automaattisesti sellaisen (tyhjän) oletuskäyttöön.
Harkitse esimerkkinä luokkaa Box, joka edustaa laatikon kuvausta. Luokan rakentaja yksinkertaisesti asettaa laatikon alkuperäiset mitat.
classBox { int leveys ; _ // laatikon leveys int korkeus ; // laatikon korkeus int syvyys ; // laatikon syvyys // Rakentajalaatikko ( int a , int b ) { leveys = a ; korkeus = b ; syvyys = 10 ; } // Laske laatikon tilavuus int getvolume ( ) { paluuleveys * korkeus * syvyys ; } } Staattiset menetelmät ja kentätJava (samoin kuin C++) käyttää staattisia kenttiä ja staattisia menetelmiä ( staattinen menetelmä - ohjelmointiteoriassa niitä kutsutaan myös luokkamenetelmiksi), jotka määritellään avainsanalla . Staattisilla kentillä (luokkamuuttujilla) on sama merkitys kuin C++:ssa: jokainen tällainen kenttä on luokan ominaisuus, joten sinun ei tarvitse luoda vastaavan luokan esiintymiä päästäksesi staattisiin kenttiin. static
Esimerkiksi matemaattiset funktiot, jotka on toteutettu luokassa Math[doc. 9] ovat vain tämän luokan staattisia menetelmiä. Siksi niitä voidaan kutsua suoraan luokasta luomatta siitä esiintymää, esimerkiksi:
tupla x = matematiikka . synti ( 1 );Staattisen luokan esiintymän luominen on kiellettyä käyttämällä yksityistä rakentajaa. Esimerkiksi luokan esiintymän luominen Mathjohtaa käännösaikavirheeseen:
Math m = uusi matematiikka (); // Virhe: Math():lla on yksityinen käyttöoikeus tiedostoon java.lang.Math double x = m . synti ( 1 ); // Objektilla ei olisi syntimenetelmää, koska se on staattinenKoska staattiset menetelmät ovat olemassa objekteista (luokan ilmentymistä) riippumatta, niillä ei ole pääsyä tietyn luokan säännöllisiin (ei-staattisiin) kenttiin ja menetelmiin. Erityisesti staattista menetelmää toteutettaessa EI SAA käyttää tunnistetta this.
Staattisen tuontitoiminnon avulla voit kutsua staattisia funktioita ja vakioita määrittämättä luokkaa. Esimerkki ilman staattista tuontia:
tupla x = matematiikka . synti ( mat . tan ( mat . sqrt ( y )) + mat . kerros ( 24.5 )) + mat . cos ( 42 * Math . PI );Sama esimerkki, mutta staattisen tuonnin kanssa:
tuo staattinen java.lang.Math.* ; ... tupla x = sin ( tan ( sqrt ( y )) + lattia ( 24,5 )) + cos ( 42 * PI ); Valmistuminen (lopullinen)Avainsanalla final(lopullinen) on eri merkitys, kun kuvataan kenttää, menetelmää tai luokkaa.
Javassa menetelmät, joita ei ole nimenomaisesti ilmoitettu nimellä static, finaltai privateovat virtuaalisia C++-terminologiassa: perusluokissa eri tavalla määritellyn metodin kutsuminen ja periminen suorittaa aina ajonaikaisen tarkistuksen.
Abstrakti menetelmä (muuntaja abstract) Javassa on menetelmä, jolla on parametrit ja palautustyyppi, mutta ei runkoa. Abstrakti menetelmä määritellään johdetuissa luokissa. Abstraktin menetelmän analogi C++:ssa on puhdas virtuaalifunktio. Jotta luokka voisi kuvata abstrakteja menetelmiä, luokka itse on myös määritettävä abstraktiksi. Abstrakteja luokkaobjekteja ei voi luoda.
LiitännätJavassa korkein abstraktioaste on käyttöliittymä (modifier interface). Käyttöliittymä sisältää enimmäkseen abstrakteja menetelmiä, joilla on julkinen käyttöoikeustaso: kuvauksia abstract, publicjoita ei edes vaadita. Java 8:sta ja 9:stä lähtien käyttöliittymä on kuitenkin otettu käyttöön.
- Java 8: staattiset ( static) menetelmät ja oletusmenetelmät ( default);
- Java 9: menetelmät käyttöoikeustasolla private.
Nämä menetelmät sisältävät rungon, mikä tarkoittaa, että ne eivät ole abstrakteja, mutta tietyssä käyttöliittymän toteutuksessa default-metodit voidaan ohittaa.
Java-käyttöliittymää ei pidetä luokkana, vaikka se on itse asiassa täysin abstrakti luokka. Luokka voi periä/ laajentaa ( extends) toisen luokan tai toteuttaa ( implements) rajapinnan. Lisäksi liitäntä voi periä/laajentaa ( extends) toisen liitännän.
Javassa luokka ei voi periä useammasta kuin yhdestä luokasta, mutta se voi toteuttaa useita rajapintoja. Liitäntöjen moninkertaista periytymistä ei ole kielletty, eli yksi rajapinta voidaan periä usealta.
Liitäntöjä voidaan käyttää menetelmäparametrityypeinä. Liitäntöjä ei voi instantoida.
Merkin käyttöliittymätJavassa on rajapintoja, jotka eivät sisällä toteutusmenetelmiä, mutta joita JVM käsittelee erityisellä tavalla: Cloneable, Serializable, RandomAccess, Remote.
Java-mallit (yleiset)Java 5.0 :sta alkaen kieleen ilmestyi yleinen ohjelmointimekanismi - mallit, jotka ovat ulkoisesti lähellä C ++ -malleja. Käyttämällä erityistä syntaksia luokkien ja menetelmien kuvauksessa voit määrittää tyyppiparametreja, joita voidaan käyttää kuvauksen sisällä kenttätyypeinä, parametreina ja metodien palautusarvoina.
// Yleinen luokkailmoitus class GenericClass < E > { E getFirst () { ... } void add ( E obj ) { ... } } // Yleisen luokan käyttö koodissa GenericClass < String > obj = new GenericClass <> (); obj . add ( "qwerty" ); Merkkijono p = obj . getFirst ();Luokkien, rajapintojen ja menetelmien yleinen ilmoitus on sallittu. Lisäksi syntaksi tukee rajoitettujen tyyppiparametrien määrittelyjä: tyyppikonstruktin määrittäminen ilmoituksessa <T extends A & B & C...>edellyttää, että tyyppiparametri T toteuttaa liitännät A, B, C ja niin edelleen.
Toisin kuin C#-malleja, ajonaika ei tue Java-malleja - kääntäjä yksinkertaisesti luo tavukoodin, jossa ei ole enää malleja. Mallien toteutus Javassa eroaa olennaisesti vastaavien mekanismien toteutuksesta C ++:ssa: kääntäjä ei luo erillistä luokka- tai mallimenetelmän varianttia jokaiselle mallin käyttötapaukselle, vaan luo yksinkertaisesti yhden tavukoodin toteutuksen, joka sisältää tarvittavat tyyppitarkastukset ja muunnokset. Tämä johtaa useisiin rajoituksiin mallien käytölle Java-ohjelmissa.
Tarkistetaan luokan jäsenyyttäJavassa voit tarkastaa tarkasti, mihin luokkaan objekti kuuluu. Lauseke foo instanceof Fooon yhtä suuri true, jos objekti fookuuluu luokkaan Footai sen jälkeläiseen tai toteuttaa rajapinnan Foo(tai yleisemmin perii luokan, joka toteuttaa rajapinnan, joka perii Foo).
Lisäksi funktio getClass()[doc. 10] , joka on määritetty kaikille objekteille, tuottaa objektin tyyppiä Class<?>. Jokaiselle luokalle luodaan korkeintaan yksi sitä kuvaava tyyppinen objekti Class, jotta näitä objekteja voidaan verrata. Joten esimerkiksi foo.getClass() == bar.getClass()se on totta, jos objektit fooja barkuuluvat samaan luokkaan.
Lisäksi Class<?>minkä tahansa tyyppinen esine voidaan saada seuraavasti: Integer.class, Object.class.
Luokkien suora vertailu ei aina ole paras tapa tarkistaa luokkaan kuuluminen. Usein sen sijaan käytetään funktiota isAssignableFrom(). Tämä funktio määritellään tyyppiobjektille Classja ottaa tyyppiobjektin Class<?>parametriksi. Siten puhelu Foo.class.isAssignableFrom(Bar.class)palaa , truejos se Fooon luokan esi-isä Bar. Koska kaikki objektit ovat tyypin jälkeläisiä Object, puhelu Object.class.isAssignableFrom()palaa aina true.
Tyyppiobjektin mainittujen funktioiden yhteydessä Classfunktiot isInstance[doc. 11] (vastaa instanceof), sekä cast()(muuntaa parametrin valitun luokan objektiksi).
Java-virheiden käsittely on samanlaista kuin C++ :n virheiden käsittely, paitsi että tarvitaan finally. Tämä ero johtuu siitä, että Java ei voi noudattaa RAII -konseptia roskienkeräimen läsnäolon vuoksi, ja resurssien automaattinen vapautuminen tuhoajassa voi tapahtua arvaamattomassa järjestyksessä mielivaltaisin väliajoin.
Virheiden käsittely suoritetaan käyttämällä try, catchja -operaattoreita finally. Heitetty virhe kuvataan tietyn luokan objektilla, joka perii Throwable[doc. 12] ja vastaa virheen tyyppiä. Lohkon sisällä tryon koodi, joka voi heittää poikkeuksen, ja lohko catchsaa kiinni ohjelmoijan määrittelemät virhetyypit. Tässä tapauksessa voit määrittää useamman kuin yhden lohkon catchkäsittelemään eri virheluokkia tai useiden virheiden käsittelemiseksi usean lohkon. Lohko on valinnainen, mutta jos se on olemassa, se suoritetaan virheen esiintymisestä riippumatta ja sen tarkoituksena on vapauttaa finallylohkon toiminnan aikana varatut tryresurssit .
Java 7:stä lähtien käyttöliittymä AutoCloseable[doc. 13] , jonka avulla voit toteuttaa luokkia, jotka vapauttavat resursseja automaattisesti. Tällaisten luokkien objektit on luotava suluissa ennen try. Yksinkertainen esimerkki automaattisesta resurssien purkamisesta on tiedoston sisällön lukeminen:
tuo java.io.* ; public class Main { public static void main ( String [ ] args ) heittää IOException { if ( args . pituus < 2 ) { Järjestelmä . err . println ( "Tiedostonimeä ei ole määritetty." ); paluu ; } Merkkijono tiedostonimi = args [ 1 ] ; // Avattu tiedosto suljetaan automaattisesti vahingossa try ( BufferedReader reader = new BufferedReader ( uusi Tiedostonlukija ( tiedostonimi ))) { merkkijono ; _ for ( int n = 1 ; ( rivi = lukija . readLine ()) != null ; ++ n ) { Järjestelmä . ulos . println ( n + ": " + rivi ); } } catch ( FileNotFoundException e ) { Järjestelmä . err . println ( "Määritettyä tiedostoa ei löytynyt." ); } // vihdoin { // reader.close(); // automaattinen resurssin sulkeminen //} } }Java noudattaa menetelmän aiheuttamien virheluokkien pakollista määrittelyä. Tämä tehdään käyttämällä avainsanaa throwsmenetelmän kuvauksen jälkeen. Jos menetelmä ei määritä poikkeusluokkaa (tai sen esi-isä), joka voidaan heittää menetelmästä, tämä aiheuttaa käännösvirheen. Konseptin piti tehdä koodista itsedokumentoiva, mikä osoittaa, mitä poikkeuksia tietty menetelmä voi heittää, mutta käytännössä se oikeuttaa itsensä harvoin, koska ohjelmoija voi eri olosuhteista johtuen määrittää luokan poikkeukseksi heitettäviksi Exceptiontai liittää ongelmalliseksi . menetelmän osia lohkossa try... catchyksittäisten virheiden huomioimiseksi tai - lohkossa try... finallypiilottaen kaikki mahdolliset virheet. Konseptin haittapuolena on myös se, että ohjelmoijan on itse määriteltävä ja määrättävä poikkeukset, jotka menetelmä voi heittää [74] .
Nimiavaruuksien idea sisältyy Java-paketteihin .
Java-paketin nimi on latinalainen (pienet ja isot kirjaimet) numeroilla (ei rivin ensimmäinen) ja alaviivalla (ei ensimmäinen eikä viimeinen), jotka eivät ole kieliohjeita (huom if, null), erotettuna pisteillä. .
Esimerkkejä oikeista nimistä:
Esimerkkejä vääristä nimistä:
Paketit sisältävät luokkia, käyttöliittymiä, luetteloita, huomautuksia (ym.), joiden nimet ovat latinalaisia (pienet ja isot kirjaimet) ja numeroita (ei rivin ensimmäinen). Yhdessä tiedostossa voi olla vain yksi julkinen luokka, käyttöliittymä (tms.). Tiedostossa olevan julkisen luokan, käyttöliittymän (kuten) nimen on vastattava tiedoston nimeä. Jokaisella luokalla on oma nimiavaruutensa funktioille, muuttujille ja alaluokille, alirajapinnoille (esim.), ja voit saada luokan alaluokan käyttämällä OuterClass.InnerClass, tai voit käyttää OuterClass$InnerClass, joten dollarisymbolin käyttöä luokan nimessä ei suositella.
Ohjelmakoodi "Hei, maailma!" .
luokka hei maailma { public static void main ( String [ ] args ) { Järjestelmä . ulos . println ( "Hei, maailma!" ); } } Esimerkki geneeristen lääkkeiden käytöstä Tuo java.util.list ; Tuo java.util.ArrayList ; public class Esimerkki { public static void main ( String [] args ) { // Luo objekti mallista. List < String > strings = uusi ArrayList <> (); jouset . lisää ( "Hei" ); jouset . add ( "maailma" ); jouset . lisää ( "!" ); for ( var string : strings ) { System . ulos . tulosta ( merkkijono + " " ); } } } Esimerkki heijastuksen käytöstä tuonti java.lang.reflect.Field ; tuonti java.lang.reflect.Method ; class TestClass { yksityinen int arvo ; public int getValue ( ) { paluuarvo ; } public void setValue ( int valueIn ) { this . arvo = valueIn ; } } public class Main { public static void main ( String [] args ) { var testClass = new TestClass (); for ( var field : testClass . getClass (). getDeclaredFields ()) { System . ulos . printf ( "nimi:%s, tyyppi:%s \n" , kenttä .getName (), kenttä .getType (). getCanonicalName ( ) ); } for ( var method : testClass . getClass (). getDeclaredMethods ()) { System . ulos . printf ( "nimi:%s, palautustyyppi:%s \n" , metodi .getName (), metodi .getReturnType (). getCanonicalName ( ) ); } } } Annotaatioesimerkki Tuo java.lang.annotation.ElementType ; Tuo java.lang.annotation.Reting ; Tuo java.lang.annotation.RetingPolicy ; Tuo java.lang.annotation.target ; @Retention ( RetentionPolicy . RUNTIME ) @Target ( ElementType . TYPE ) public @interface MyAnnotation { public boolen arvo () oletus false ; } @MyAnnotation ( arvo = tosi ) 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 . ulos . printf ( "arvo:%s \n" , myAnnotation . arvo ()); } } }Sosiaalisissa verkostoissa | ||||
---|---|---|---|---|
Temaattiset sivustot | ||||
Sanakirjat ja tietosanakirjat | ||||
|
Java | |
---|---|
Alustat | |
Sun Technologies | |
Kolmannen osapuolen keskeiset tekniikat | |
Tarina |
|
Kielen ominaisuudet | |
Scripting kielet |
|
Java-konferenssit |
|
Ohjelmointikielet | |
---|---|
|