Java

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 5 oktober 2022; kontroller kräver 7 redigeringar .
Java
Språkklass multiparadigm programmeringsspråk , JVM-språk och programvara
Framträdde i 1995
Författare James Gosling och Sun Microsystems
Utvecklaren Sun Microsystems och Oracle
Filtillägg _ .java, .class, .jar, .jadeller.jmod
Släpp Java SE 18.0.2.1 ( 18 augusti 2022 )
Blivit påverkad C++ , C , Ada , Simula 67 , Smalltalk , Objective-C , Object Pascal , Oberon , Eiffel , Modula-3 , Mesa , Simula , C# , UCSD Pascal , wrapper , Variabel funktion , Java-anteckning , Nicklaus Wirth , Patrick Naughton [d] och foreach
Licens GNU GPL [1]
Hemsida oracle.com/ru/java/
 Mediafiler på Wikimedia Commons

Java [ca. 1]  är ett starkt skrivet objektorienterat programmeringsspråk för allmänt bruk utvecklat av Sun Microsystems (senare förvärvat av Oracle ). Utvecklingen drivs av en community organiserad genom Java Community Process ; språket och den underliggande tekniken som implementerar det distribueras under GPL-licensen . Varumärkesrättigheter ägs av Oracle Corporation .

Java-applikationer översätts vanligtvis till speciell bytekod , så de kan köras på vilken datorarkitektur som helst för vilken det finns en implementering av Java Virtual Machine . Det officiella släppdatumet är den 23 maj 1995. Det rankas högt i programmeringsspråkets popularitetsrankning (2:a plats i IEEE Spectrum (2020) [2] och TIOBE (2021) [3] rankningar ).

Skapande historia

Språket hette ursprungligen Oak ("Oak"), utvecklat av James Gosling för programmering av konsumentelektronik. Eftersom ett språk med det namnet redan fanns, döptes Oak om till Java [4] . Uppkallad efter kaffemärket Java, som i sin tur fick namnet på ön med samma namn ( Java ), så språkets officiella emblem visar en kopp varmt kaffe. Det finns en annan version av ursprunget till språkets namn, associerad med en anspelning på en kaffemaskin som ett exempel på en hushållsenhet för programmering som språket ursprungligen skapades. I enlighet med etymologi, i ryskspråkig litteratur från slutet av 1900-talet till de första åren av det tjugoförsta århundradet, översattes språkets namn ofta till Java och transkriberades inte.

Som ett resultat av projektet såg världen en fundamentalt ny enhet, Star7 pocket persondator [5] , som var före sin tid med mer än 10 år, men på grund av den höga kostnaden på $ 50, kunde den inte revolutionera teknikens värld och glömdes bort.

Star7-enheten var inte populär, till skillnad från programmeringsspråket Java och dess miljö. Nästa steg i språkets liv var utvecklingen av interaktiv tv. 1994 stod det klart att interaktiv tv var ett misstag.

Sedan mitten av 1990-talet har språket blivit flitigt använt för att skriva klientapplikationer och servermjukvara . Samtidigt fick teknologin för Java-applets  , grafiska Java-applikationer inbäddade i webbsidor, en viss popularitet; Med tillkomsten av dynamiska webbsidor på 2000-talet blev tekniken mindre utbredd.

Webbutveckling använder Spring Framework ; Javadoc- verktyget används för dokumentation .

Huvuddragen i språket

Java -program översätts till Java bytecode , som exekveras av Java Virtual Machine (JVM), ett program som bearbetar bytekod och skickar instruktioner till hårdvaran som tolk .

Fördelen med detta sätt att köra program är det fullständiga oberoendet av bytekoden från operativsystemet och hårdvaran , vilket gör att du kan köra Java-applikationer på vilken enhet som helst för vilken det finns en motsvarande virtuell maskin. En annan viktig egenskap hos Java-tekniken är ett flexibelt säkerhetssystem, där exekveringen av programmet helt kontrolleras av den virtuella maskinen. Alla åtgärder som överskrider programmets inställda behörigheter (som att försöka obehörig åtkomst till data eller ansluta till en annan dator) orsakar en omedelbar avbrytning.

Ofta inkluderar nackdelarna med konceptet virtuella maskiner prestandaförsämring. Ett antal förbättringar ökade hastigheten på Java-program något:

Enligt sajten shootout.alioth.debian.org, för sju olika uppgifter, är körtiden i Java i genomsnitt en och en halv till två gånger längre än för C/C++, i vissa fall är Java snabbare, och i vissa fall är det 7 gånger långsammare [ 6] . Å andra sidan, för de flesta av dem var minnesförbrukningen för en Java-maskin 10 till 30 gånger större än för ett C/C++-program. Anmärkningsvärt är också en studie gjord av Google , enligt vilken det finns en betydligt lägre prestanda och högre minnesförbrukning i testfall i Java jämfört med liknande program i C ++ [7] [8] [9] .

Idéerna bakom konceptet och olika implementeringar av den virtuella Java-maskinmiljön har inspirerat många entusiaster att utöka listan över språk som kan användas för att skapa program som körs på en virtuell maskin [10] . Dessa idéer uttrycks också i specifikationen Common Language Infrastructure ( CLI ) som stödde Microsofts .NET- plattform .

Versionshistorik

JDK 1.0

Java-utvecklingen började 1990, den första officiella versionen - Java 1.0 - släpptes först den 21 januari 1996.

JDK 1.1

Den andra versionen släpptes den 19 februari 1997 [11] .

J2SE 1.2

Utgivningsdatum 8 december 1998 [12] . Kodnamn Lekplats. I det här fallet finns det förvirring. Böcker har publicerats, till exempel Beginning Java 2 av Ivor Horton (mars 1999), faktiskt på J2SE 1.2 (tidigare kallad Java 2). Än i dag publiceras dock sådana böcker, till exempel: H. M. Deitel, P. J. Deitel, S. I. Santry. Java Programming Technologies 2. Distribuerade applikationer (2011).

Vid en tidpunkt då Java 2 är känt för att ha ersatts historiskt av efterföljande utgåvor, är sådana boktitlar vilseledande när det gäller vilken version av Java de faktiskt skrivs om. Om J2SE 1.2 anses vara Java 2, men författarna till Java 2-böcker accepterar JDK 7, leder detta till fullständig förvirring.

J2SE 1.3

Utgivningsdatum 8 maj 2000. Kodnamn Kestrel.

J2SE 1.4

Utgivningsdatum 6 februari 2002. Kodnamn Merlin.

J2SE 5.0

Java 5.0-specifikationen släpptes den 30 september 2004, med kodnamnet Tiger. Sedan denna version har den officiella indexeringen ändrats, istället för Java 1.5 är det mer korrekt att kalla Java 5.0. Suns interna indexering förblir densamma - 1,x. Mindre ändringar ingår nu utan att ändra indexering, för detta används ordet "Uppdatera" eller bokstaven "u", till exempel Java Development Kit 5.0 Update 22. Det antas att uppdateringar kan innehålla både buggfixar och små tillägg till API, JVM.

I den här versionen har utvecklarna gjort ett antal grundläggande tillägg till språket:

Java SE 6

Versionen släpptes den 11 december 2006, med kodnamnet Mustang. Den officiella indexeringen har ändrats - istället för den förväntade 6.0 är versionen listad som 6. Mindre ändringar, som i Java 5.0, görs i vanliga versionsuppdateringar, till exempel Java Standard Edition Development Kit 6 Update 27. Följande ändringar har gjorts:

JavaFX

Utgivningsdatum 8 oktober 2013.

JavaFX 2.2 ingår i Java SE 7 uppdatering 6 [15] . Från version 11 levereras modulen separat från JDK [16] .

Java ME Embedded

Utgivningsdatum 10 oktober 2013. Kodnamn Micro Edition.

Java SE 7

Versionen släpptes den 28 juli 2011, kodnamnet Dolphin [17] . Den slutliga versionen av Java Standard Edition 7 inkluderade inte alla tidigare planerade ändringar. Enligt utvecklingsplanen (plan "B") [18] kommer inkluderingen av innovationer att delas upp i två delar: Java Standard Edition 7 (utan lambdakalkylen , Jigsaw-projektet och en del av förbättringarna av Coin-projektet [ 19] ) och Java Standard Edition 8 (alla övriga), planerade till slutet av 2012.

I den nya versionen, kallad Java Standard Edition 7 (Java Platform, Standard Edition 7), infördes flera innovationer, förutom att åtgärda ett stort antal fel. Så till exempel användes inte det proprietära JDK -paketet utan dess öppna implementering OpenJDK som referensimplementering av Java Standard Edition 7 , och lanseringen av den nya versionen av plattformen förbereddes i nära samarbete mellan Oracle- ingenjörer och medlemmar i globala Java-ekosystemet, JCP- kommittén (Java Community Process) och av OpenJDK . Alla Oracle-levererade Java Standard Edition 7-referensimplementeringsbinärer är byggda ovanpå OpenJDK- kodbasen , och själva referensimplementeringen är helt öppen källkod under GPLv2 -licensen med GNU ClassPath-undantag för att tillåta dynamisk länkning till proprietära produkter. Andra innovationer inkluderar integration av en uppsättning små Java-språkförbättringar utvecklade av Coin-projektet, lagt till stöd för dynamiskt typade programmeringsspråk som Ruby , Python och JavaScript , stöd för att ladda klasser efter URL , en uppdaterad XML - stack som inkluderar JAXP 1.4, JAXB 2.2a och JAX-WS 2.2 och andra [20] .

Under de 5 dagarna före lanseringen av Java Standard Edition 7 upptäcktes flera allvarliga buggar i hot loop-optimering, som är aktiverad som standard och får Java Virtual Machine att krascha. Oracle-specialister kunde inte fixa de hittade felen på så kort tid, men lovade att de skulle fixas i den andra uppdateringen (Java 7 Update 2) och delvis i den första [21] .

Lista över innovationer
  • Stöd för dynamiskt typade språk (InvokeDynamic) är en förlängning av JVM (bytecode semantics), Java-språket [22] för att stödja dynamiskt typade språk.
  • Strikt klassfilskontroll - klassfiler version 51 (Java Standard Edition 7) eller senare måste kontrolleras av en typkontrollverifierare; JVM bör inte byta till den gamla verifieraren.
  • Java Language Syntax Change (Project Coin) - partiella ändringar av Java-språket utformat för att förenkla vanliga programmeringsuppgifter:
    • Använda klassen String[dok. 1] i blocket switch.
    • Stänga använda resurser i ett block try(prova-med-resurser) - fungerar när du använder gränssnittet AutoClosable[dok. 2] .
    • Kombinerad undantagshantering i ett block catch(multi-catch undantag) - uppräkning av hanterade undantag i catch(... | ... | ...).
    • Återkasta undantag - passera undantaget som har uppstått "upp" i samtalsstacken .
    • Understreck i numeriska bokstaver för bättre uppfattning om stora tal.
    • Ändra typinferens till Java generisk när ett objekt skapas.
    • Användning av binära tal (binära bokstaver) - prefixet 0b indikerar att ett binärt tal används.
    • Förenkla anrop av varargs-metoder - minska varningarna när du anropar en metod med ett variabelt antal indatavariabler.
  • Modifiering av klassladdaren - undvik dödlägen i icke-hierarkisk klassladdningstopologi.
  • Stängningsresurser öppnade URLClassLoader[dok. 3] .
  • Uppdatering av samlingar (JSR 166).
  • Stöd för Unicode 6.0.
  • Separation av användarspråk och användargränssnittsspråk - Uppdatera språkhantering för att separera språk från användargränssnittsspråk.
  • Nya I/O-gränssnitt för Java-plattformen (nio.2).
  • Använder JDBC 4.1 och Rowset 1.1.
  • … (inte färdig)

Java SE 8

Versionen släpptes den 19 mars 2014. Kodnamn Octopus.

Lista över innovationer
  • Fullt stöd för lambda-uttryck .
  • Nyckelord defaulti gränssnitt för att stödja standardfunktionalitet.
  • Statiska metoder i gränssnitt.
  • Referenser till metoder och konstruktörer [23] [24] .
  • Funktionella gränssnitt ( predikat , leverantörer, etc.)
  • Strömmar för att arbeta med samlingar.
  • Nytt API för att arbeta med datum.
  • … (inte färdig)

Java SE 9

På grund av svårigheter med att implementera det modulära systemet inom Jigsaw-projektet sköts releasen av versionen, som ursprungligen var planerad till 22 september 2016, flera gånger: först flyttades datumet till 23 mars 2017 , sedan till 27 juli 2017 , och sedan till 21 juli 2017. September 2017 [25] [26] [27] .

Det senaste datumet har blivit det officiella releasedatumet för versionen [28] .

Lista över innovationer
  • Jigsaw integration, som utvecklade ett modulärt system för Java 9-plattformen och tillämpades på JDK 9 [29] .
  • Process API-uppdatering för att förbättra interaktionen med operativsystemets processer. Uppdateringen motiveras av att utvecklare ofta var tvungna att skriva plattformsspecifik kod för sådana uppgifter [30] .
  • Tillfälligt experimentell [31] [32] ny HTTP-klient med stöd för HTTP/2 och webbsockets; avsedd att ersätta den föråldrade klassen HttpURLConnection[dok. 4] [31] .
  • Komprimerade strängar: om strängens innehåll tillåter kan det kodas i Latin-1 (en byte per tecken); valet av kodning för en viss instans av klassen Stringåterspeglas i värdet på flaggvariabeln , som alla strängar nu har. [33]
  • Stöd för NIST FIPS 202 specificerade SHA-3 hashalgoritmer förutom SHAKE128 och SHAKE256. Algoritmer för att använda SHA-3 som grund för andra kryptografiska funktioner har inte implementerats på grund av bristen på relevanta standarder [34] .
  • Förbättrade verktyg för att flagga föråldrade API:er. En parameter har lagts till i annoteringen @Deprecatedsom låter dig specificera versionen av programmet med vilken användningen av det markerade elementet inte rekommenderas, samt en parameter som låter dig indikera att borttagningen av elementet är planerat i vissa framtida version [35] .
  • privatemetoder i gränssnitt [36] .
  • GTK+ 3-stöd på Linux [37] .

Java SE 10

Releasedatum: 20 mars 2018 [38] .

Lista över innovationer

Den officiella partiella listan över funktioner och releaseplan finns på OpenJDK-webbplatsen .

  • Slutledning av typer av lokala variabler markerade med nyckelordet var[39] .
  • Skapa ett transparent gränssnitt för sophämtare för att förenkla utvecklingen av nya samlare [40] .
  • Latensen för den flertrådiga sopsamlaren G1 har reducerats genom att implementera en parallell full sopsamlingscykel [41] .
  • Möjligheten att utföra callback-funktioner på trådar utan att göra globala låsningar [42] över alla trådar [43] .
  • Stöd för tecken från nya Unicode-tillägg: cu (valutatyp), fw (första dagen i veckan), rg (lands- och regionkoder med två bokstäver), tz (tidszon) [44] .
  • HotSpot VM kan nu allokera heap -minne för objekt på alternativa RAM -enheter , inklusive de med icke-flyktigt minne , såsom Intel Optane Memory- enheter [45] .
  • Ny experimentell Graal JIT - kompilator som tillhandahåller kompileringsmöjligheter i förväg; inaktiverad som standard, fungerar bara på Linux /x64 [46] .
  • Uppdatera versionsnumreringssystemet för Java SE och JDK för att komma närmare tidsversionsschemat [47] .

Java SE 11

Den officiella partiella listan över funktioner och releaseplan finns på OpenJDK-webbplatsen . Releasedatum är 25 september 2018.

Lista över innovationer
  • Uppdatering av åtkomstkontroll för att tillåta kapslade klasser att komma åt privata metoder och fält i den yttre klassen (och vice versa) utan att kompilatorn behöver skapa mellanliggande metoder med åtkomstnivåhöjning [48] .
  • Epsilon är en ny sophämtare som faktiskt inte alls samlar in sopor; när du använder Epsilon, överskrider den tilldelade minnesgränsen att JVM:n avslutas [49] .
  • Standardiserad HTTP-klient med HTTP/2-stöd introducerad i Java 9 som experimentell [50] .
  • Parametrar till lambda-funktioner kan implicit skrivas genom typinferens via nyckelordet ( var) för att förenas med den lokala variabelsyntaxen som introduceras i JDK 10 [51] .
  • Stöd för version 10 av Unicode- standarden [52] .
  • Stöd för TLS 1.3-protokoll [53] .
  • En experimentell, skalbar ZGC-sopsamlare med låg latens. Inaktiverad som standard, fungerar bara på Linux /x64 [54] .

Klassificering av Java-plattformar

Inom Java finns det flera stora familjer av teknologier:

  • Java SE  - Java Standard Edition, huvudutgåvan av Java, innehåller kompilatorer, API, Java Runtime Environment ; lämplig för att skapa anpassade applikationer, främst för stationära system.
  • Java EE  - Java Enterprise Edition, är en uppsättning specifikationer för att bygga programvara på företagsnivå. 2017 togs Java EE-projektet över av Eclipse Foundation [55] och döptes om till Jakarta EE [56] . Java EE-moduler har tagits bort från Java SE sedan version 11 [57] .
  • Java ME  - Java Micro Edition, designad för användning i enheter med begränsad datorkraft, såsom mobiltelefoner , handdatorer , inbyggda system;
  • Java Card-  teknik ger en säker miljö för applikationer som körs på smartkort och andra enheter med mycket begränsade minnes- och bearbetningsmöjligheter.

Java och Microsoft

Microsoft har utvecklat sin egen JVM- implementering som kallas Microsoft Java Virtual Machine.(MSJVM) [58] , som ingick i olika operativsystem från och med Windows 98 (ingår även i Internet Explorer från version 3 och högre, vilket gjorde det möjligt att använda MSJVM i Windows 95 och Windows NT 4 efter installation av IE3+ på dessa OS).

MSJVM hade betydande skillnader från Sun Java, vilket på många sätt bröt det grundläggande konceptet för portabilitet av program mellan olika plattformar:

  • brist på stöd för fjärrmetodanrop API ( RMI );
  • brist på stöd för JNI -teknik ;
  • förekomsten av icke-standardiserade tillägg, såsom Java- och DCOM -integreringsverktyg som endast fungerar på Windows-plattformen.

Javas snäva integration med DCOM och Win32 har ifrågasatt språkets plattformsoberoende paradigm. Senare var detta anledningen till stämningar från Sun Microsystems mot Microsoft. Domstolen ställde sig på Sun Microsystems sida. Till slut nåddes en överenskommelse mellan de två företagen om möjligheten att förlänga perioden för officiellt stöd för användare av icke-standardiserade Microsoft JVM till slutet av 2007 [58] .

2005 introducerade Microsoft ett Java-liknande språk J# för .NET -plattformen , som inte motsvarar den officiella specifikationen för Java-språket och som därefter uteslöts från Microsoft Visual Studios standardverktyg för utvecklare , med början i Visual Studio 2008 [59] .

Java och Android

Java-språket används aktivt för att skapa mobilapplikationer för Android-operativsystemet. Samtidigt kompileras program till icke-standardiserad bytekod för användning av deras Dalvik virtuella maskin (från och med Android 5.0 Lollipop har den virtuella maskinen ersatts av ART ). För sådan sammanställning används ytterligare ett verktyg, nämligen Android SDK ( Software Development Kit ), utvecklat av Google .

Applikationsutveckling kan göras i Android Studio , NetBeans , Eclipse med plugin-programmet Android Development Tools (ADT) eller IntelliJ IDEA . JDK-versionen måste vara 5.0 eller högre.

Den 8 december 2014 erkändes Android Studio av Google som den officiella utvecklingsmiljön för Android OS.

Tillämpningar av Java-plattformen

Följande framgångsrika projekt har implementerats med hjälp av Java ( J2EE )-tekniker: RuneScape , Amazon [60] [61] , eBay [62] [63] , LinkedIn [64] , Yahoo! [65] .

Följande företag fokuserar huvudsakligen på Java ( J2EE- )-teknologier: SAP , IBM , Oracle . I synnerhet inkluderar Oracle Database DBMS en JVM som sin komponent, som ger möjlighet att direkt programmera DBMS i Java-språket, inklusive till exempel lagrade procedurer [66] .

Prestanda

Program skrivna i Java har rykte om att vara långsammare och ta upp mer RAM än de som skrivs i C [6] . Exekveringshastigheten för program skrivna på Java-språket förbättrades dock avsevärt med lanseringen 1997-1998 av den så kallade JIT-kompilatorn i version 1.1, förutom andra språkfunktioner för att stödja bättre kodanalys (som inre klasser, klass StringBuffer[doc 5] , förenklade logiska beräkningar och så vidare). Dessutom har den virtuella Java-maskinen optimerats - sedan 2000 har den virtuella HotSpot -maskinen använts för detta . Från och med februari 2012 är Java 7-koden ungefär 1,8 gånger långsammare än C-koden [67] .

Vissa plattformar erbjuder hårdvaruexekveringsstöd för Java [68] . Till exempel mikrokontroller som kör Java-kod i hårdvara istället för en mjukvaru-JVM, och ARM-baserade processorer som stöder Java-bytekodexekvering via Jazelle-alternativet.

Nyckelfunktioner

  • Automatisk minneshantering .
  • Förbättrade undantagshanteringsmöjligheter.
  • Rik uppsättning I/O-filtreringsverktyg.
  • En uppsättning standardsamlingar: array , list , stack , etc.
  • Tillgång till enkla verktyg för att skapa nätverksapplikationer (inklusive att använda RMI- protokollet ).
  • Förekomsten av klasser som låter dig göra HTTP- förfrågningar och bearbeta svar.
  • Verktyg inbyggda i språket för att skapa flertrådade applikationer, som sedan portades till många språk (till exempel Python ).
  • Enhetlig databasåtkomst :
  • på nivån för individuella SQL -frågor baserade på JDBC , SQLJ ;
  • på nivån för begreppet objekt som har förmågan att lagra i databasen-baserade på Java Data Objects och Java Persistence API .
  • Generiskt stöd (sedan version 1.5).
  • Stöd för lambdas, stängningar, inbyggda funktionella programmeringsmöjligheter (sedan 1.8).

Huvudidéer

Primitiva typer

Det finns bara 8 primitiva (skalära, enkla) typer i Java : boolean, byte, char, short, int, long, float, double. Det finns också en extra nionde primitiv typ - voidmen variabler och fält av denna typ kan inte deklareras i koden, och själva typen används endast för att beskriva den klass som motsvarar den, för användning i reflektion : till exempel med hjälp av Void[dok. 6] kan du ta reda på om en viss metod är av typen void: Hello.class.getMethod("main", String[].class).getReturnType() == Void.TYPE.

Längden och värdeintervallen för primitiva typer definieras av standarden, inte av implementeringen, och listas i tabellen. Char-typen gjordes två-byte för lokaliseringsbekvämlighet (en av Javas ideologiska principer): när standarden bildades fanns redan Unicode -16, men inte Unicode-32. Eftersom det inte fanns någon enkelbytetyp kvar som ett resultat, lades en ny typbyte till, och i Java, till skillnad från andra språk, är den inte osignerad. Typerna floatoch doublekan ha speciella värden och "inte ett nummer" ( NaN ). För dubbeltypen betecknas de med , , ; för typ  - samma, men med ett prefix istället för . Minimi- och maximivärdena som accepteras av och typerna är också standardiserade. Double.POSITIVE_INFINITYDouble.NEGATIVE_INFINITYDouble.NaNfloatFloatDoublefloatdouble

Sorts Längd (i byte) Område eller uppsättning värden
booleskt 1 i arrayer, 4 i variabler [69] sant falskt
byte ett −128..127
röding 2 0..2 16 −1, eller 0..65535
kort 2 −2 15 ..2 15 −1, eller −32768..32767
int fyra −2 31 ..2 31 −1, eller −2147483648..2147483647
lång åtta −2 63 ..2 63 −1, eller ungefär −9,2 10 18 ..9.2 10 18
flyta fyra -(2-2 −23 ) 2 127 ..(2-2 −23 ) 2 127 , eller ungefär −3,4 10 38 ..3.4 10 38 , och även , , NaN
dubbel åtta -(2-2 −52 ) 2 1023 ..(2-2 −52 ) 2 1023 , eller ungefär −1,8 10 308 ..1.8 10 308 , samt , , NaN

En sådan stel standardisering var nödvändig för att göra språkplattformsoberoende, vilket är ett av de ideologiska kraven för Java. Ett litet problem med plattformsoberoende kvarstår dock. Vissa processorer använder 10-byte register för mellanlagring av resultat eller förbättrar noggrannheten i beräkningar på andra sätt. För att göra Java så interoperabelt som möjligt mellan olika system var alla sätt att förbättra beräkningarnas noggrannhet förbjudna i tidiga versioner. Detta resulterade dock i långsammare prestanda. Det visade sig att få människor behöver försämringen av noggrannheten för plattformsoberoendes skull, särskilt om de måste betala för det genom att sakta ner programmets arbete. Efter många protester avbröts detta förbud, men nyckelordet lades till strictfp, vilket förbjuder ökad noggrannhet.

Transformationer i matematiska operationer

Java-språket har följande regler:

  1. Om en operand är av typen doublekonverteras den andra också till typ double.
  2. Annars, om en operand är av typen floatkonverteras den andra också till typ float.
  3. Annars, om en operand är av typen longkonverteras den andra också till typ long.
  4. Annars konverteras båda operanderna till typ int.

Denna metod för implicit konvertering av inbyggda typer sammanfaller helt med typkonvertering i C / C++ [70] .

Objektvariabler, objekt, referenser och pekare

Java-språket har bara dynamiskt skapade objekt. Objekttypvariabler och objekt i Java är helt olika enheter. Variabler av en objekttyp är referenser , det vill säga analoger av pekare till dynamiskt skapade objekt. Detta understryks av syntaxen för deklarationen av variabler. Så C++-koden kan se ut så här:

dubbla a [ 10 ][ 20 ] ; foo b ( 30 );

Men samma sak i Java kommer att se väldigt annorlunda ut:

dubbel [][] a = ny dubbel [ 10 ][ 20 ] ; Foo b = ny Foo ( 30 );

Under tilldelningar, överföring till subrutiner och jämförelser beter sig objektvariabler som pekare, det vill säga adresser till objekt tilldelas, kopieras och jämförs. Och när man får åtkomst till datafält eller metoder för ett objekt med en objektvariabel krävs inga speciella referensoperationer  – åtkomsten utförs som om objektvariabeln vore själva objektet.

Objektvariabler är variabler av vilken typ som helst, utom primitiva. Det finns inga explicita pekare i Java. Till skillnad från pekare i C, C++ och andra programmeringsspråk är referenser i Java mycket säkra på grund av strikta begränsningar för deras användning.

  • Du kan inte konvertera ett objekt av en typ inteller någon annan primitiv typ till en pekare eller referens, eller vice versa.
  • Det är förbjudet att utföra operationer på länkar ++, −−, +, −eller andra aritmetiska och logiska operationer ( &&, ||, ^^).
  • Typkonvertering mellan referenser är strikt reglerad. Med undantag för arrayreferenser är det endast tillåtet att konvertera referenser mellan en ärvd typ och dess avkomling, och konverteringen från den ärvda typen till den ärvda typen måste explicit specificeras och dess meningsfullhet kontrolleras vid körning. Konverteringar av matrisreferenser tillåts endast när konverteringar av deras bastyper är tillåtna och det inte finns några dimensionskonflikter.
  • Java har inte funktioner för att ta en adress ( &) eller ta ett objekt till en adress ( *). Et -tecken ( &) betyder bara "bitvis och" (dubbelt et-tecken betyder "logiskt och"). För booleska typer betyder dock ett enskilt et-tecken "logiskt och", vilket skiljer sig från ett dubbelt et-tecken genom att testkedjan inte stannar när värdet false[71] tas emot i uttrycket . Till exempel a == b && foo() == bar()kommer det inte att orsaka samtal foo()även bar()om a != b, medan du använder det & kommer att orsaka i alla fall.

Tack vare sådana speciellt införda begränsningar är direkt minnesmanipulation på nivån av fysiska adresser omöjlig i Java (även om värdet på referensen som pekar mot ingenting är definierat: null).

Om en pekare till en primitiv typ behövs används omslagsklasser av primitiva typer: Boolean, Byte, Character, Short, Integer, Long, Float, Double.

Duplicera länkar och kloning

Vid tilldelning kopieras inte objektet, eftersom objektvariabler är referensvariabler. Så om du skriver

Foo foo , bar ; ... bar = foo ;

då kommer adressen att kopieras från variabel footill variabel bar. Det vill säga, foooch barkommer att peka på samma minnesområde, det vill säga till samma objekt; Om du försöker ändra fälten för objektet som variabeln refererar till fookommer det att ändra objektet som variabeln refererar till baroch vice versa. Om det är nödvändigt att bara få en kopia till av originalobjektet använder de antingen en metod (medlemsfunktion, i C++-terminologi) clone ()som skapar en kopia av objektet, eller (mindre ofta) en kopiakonstruktor ( konstruktorer i Java kan inte vara virtuell, så en instans av en understigande klass kommer att vara felaktig kopierad av konstruktören för ancestor-klassen; klonmetoden anropar den önskade konstruktorn och kringgår därmed denna begränsning).

Metod clone()[dok. 7] kräver en klass för att implementera ett gränssnitt Cloneable[dok. 8] . Om en klass implementerar gränssnittet Cloneable, kopierar den som standard clone()alla fält ( grund kopia ). Om du vill klona fält (liksom deras fält, och så vidare) istället för att kopiera, måste du åsidosätta clone(). Att definiera och använda en metod clone()är ofta en icke-trivial uppgift [72] .

Variabelinitiering

Alla variabler kräver antingen en explicit definition eller fylls automatiskt med nollor (0, null, false). Således försvinner heisenbugs associerade med oavsiktlig användning av oinitierat minne, karakteristiskt för lågnivåspråk som C .

Sophämtning

I Java-språket är det inte möjligt att explicit radera ett objekt från minnet - istället implementeras skräpinsamling . Ett traditionellt knep för att ge sopsamlaren ett "tips" för att avallokera minne är att sätta en variabel till null null, vilket kan vara effektivt när du behöver omallokera ett objekt som inte längre behövs och som refereras i ett långlivat objekt [73 ] . Detta betyder dock inte att objektet som ersätts av värdet nullsäkert och omedelbart kommer att raderas, men det finns en garanti för att detta objekt kommer att raderas i framtiden. Denna teknik tar bara bort referensen till objektet, det vill säga kopplar bort pekaren från objektet i minnet. I det här fallet bör man komma ihåg att objektet inte kommer att raderas av sopsamlaren så länge som minst en referens från de använda variablerna eller objekten pekar på det. Det finns också metoder för att initiera en påtvingad sophämtning, men de är inte garanterade att anropas av körtiden och rekommenderas inte för normal användning.

Klasser och funktioner

Java är inte ett procedurspråk: alla funktioner kan bara existera inom en klass. Detta understryks av Java-språkets terminologi, där det inte finns några begrepp om "funktion" eller "medlemsfunktion" ( engelska  medlemfunktionen ), utan bara en metod . Standardfunktioner har också blivit metoder. Till exempel, i Java finns det ingen funktion , men det finns en sin()klassmetod ( Math.sin()som Mathinnehåller, förutom sin(), metoder cos(), exp(), sqrt(), abs()och många andra). Konstruktörer i Java betraktas inte som metoder. Det finns inga destruktörer i Java, och en metod finalize()bör inte på något sätt anses vara analog med en destruktor.

Konstruktörer

En konstruktor är en speciell metod som nödvändigtvis anropas när ett nytt objekt skapas, det vill säga ett objekt (en instans av en klass) kan inte skapas utan att anropa klasskonstruktorn. Det är inte alltid bekvämt att initiera alla variabler i en klass när den instansieras, så instansvariabler deklareras ofta inuti kroppen av en konstruktor, men initieras som konstruktorargument när klassen instansieras. Ibland är det lättare att få vissa värden skapade som standard när objektet skapas. I det här fallet deklareras och initieras variabler inuti konstruktorns kropp.

En konstruktör initierar ett objekt direkt vid skapandet. Namnet på konstruktorn är detsamma som namnet på klassen, inklusive skiftläge, och syntaxen för en konstruktor liknar den för en metod utan ett returvärde.

privat int Cat (); // så här ser metoden med namnet Cat ut som Cat (); // så här ser Cat-klasskonstruktören ut

Till skillnad från en metod returnerar en konstruktor aldrig något.

En konstruktor definierar de åtgärder som ska vidtas när ett objekt i en klass skapas och är en viktig del av en klass. Som regel försöker programmerare att explicit specificera en konstruktor. Om det inte finns någon explicit konstruktor kommer Java automatiskt att skapa en (tom) för standardanvändning.

Som ett exempel, betrakta en klass Boxsom representerar en beskrivning av en ruta. Klasskonstruktorn kommer helt enkelt att ställa in de initiala dimensionerna för rutan.

classBox { int width ; _ // box bredd int höjd ; // box höjd int djup ; // låddjup // Constructor Box ( int a , int b ) { width = a ; höjd = b ; djup = 10 ; } // beräkna volymen av rutan int getVolume () { return width * height * depth ; } } Statiska metoder och fält

Java (liksom C++) använder statiska fält och statiska metoder ( statisk metod - i programmeringsteori kallas de även klassmetoder), som specificeras med  nyckelordet .  Statiska fält (klassvariabler) har samma betydelse som i C++: varje sådant fält är klassens egenskap, så du behöver inte skapa instanser av motsvarande klass för att komma åt statiska fält. static

Till exempel, matematiska funktioner implementerade i klassen Math[dok. 9] är bara statiska metoder i denna klass. Därför kan de anropas direkt från klassen utan att skapa en instans av den, till exempel:

dubbel x = matematik . synd ( 1 );

Det är förbjudet att skapa en instans av en statisk klass med en privat konstruktor. Till exempel kommer att skapa en instans av en klass Mathatt resultera i ett kompileringsfel:

Math m = new Math (); // Fel: Math() har privat åtkomst i java.lang.Math double x = m . synd ( 1 ); // Objektet skulle inte ha en sinmetod, eftersom det är statiskt

Eftersom statiska metoder existerar oberoende av objekt (instanser av en klass), har de inte tillgång till vanliga (icke-statiska) fält och metoder för den givna klassen. I synnerhet när du implementerar en statisk metod FÅR du INTE använda identifieraren this.

Den statiska importfunktionen låter dig anropa statiska funktioner och konstanter utan att ange en klass. Exempel utan statisk import:

dubbel x = matematik . sin ( Math . tan ( Math . sqrt ( y )) + Math . floor ( 24.5 )) + Math . cos ( 42 * Math . PI );

Samma exempel, men med statisk import:

importera statisk java.lang.Math.* ; ... dubbel x = sin ( tan ( sqrt ( y )) + floor ( 24,5 )) + cos ( 42 * PI ); Slutförande (slutligt)

Nyckelordet final(slutligt) har olika betydelser när det beskriver ett fält, en metod eller en klass.

  1. Klassens sista fält initieras när den deklareras eller i klasskonstruktorn (och det statiska fältet initieras i det statiska initieringsblocket). Därefter kan dess värde inte ändras. Om ett statiskt klassfält eller en variabel initieras med ett konstantuttryck, behandlas det som en namngiven konstant av kompilatorn ; i ett sådant fall kan deras värde användas i satserswitch (för konstanter av typen int) såväl som för villkorlig kompilering (för konstanter av typen boolean) när de används med operatornif .
  2. Värdena för lokala variabler , såväl som metodparametrar markerade med nyckelordet final, kan inte ändras efter tilldelning. Däremot kan deras värden användas i anonyma klasser .
  3. En klassmetodfinal markerad med ordet kan inte åsidosättas av arv.
  4. Den sista klassen kan inte ha barn.
Abstraktion

I Java är metoder som inte uttryckligen deklareras som static, finaleller private, virtuella i C++-terminologi: anrop av en metod som definieras annorlunda i bas- och ärvningsklasser utför alltid en körtidskontroll.

En abstrakt metod ( modifier abstract) i Java är en metod som har parametrar och en returtyp, men ingen kropp. En abstrakt metod definieras i härledda klasser. Analogen till en abstrakt metod i C++ är en ren virtuell funktion. För att en klass ska kunna beskriva abstrakta metoder måste även själva klassen förklaras abstrakt. Abstrakta klassobjekt kan inte skapas.

Gränssnitt

Den högsta graden av abstraktion i Java är gränssnittet (modifierare interface). Gränssnittet innehåller mestadels abstrakta metoder som har en allmän åtkomstnivå: deskriptorer abstractoch publicsom inte ens krävs för dem. Men sedan Java 8 och 9 har möjligheten att använda i gränssnitt introducerats.

- Java 8: statiska ( static) metoder och standardmetoder ( default);

- Java 9: ​​metoder med åtkomstnivå private.

Dessa metoder innehåller en kropp, vilket betyder att de inte är abstrakta, men i en specifik implementering av gränssnittet kan default-metoder åsidosättas.

Ett gränssnitt i Java anses inte vara en klass, även om det i själva verket är en helt abstrakt klass. En klass kan ärva/ förlänga ( extends) en annan klass eller implementera ( implements) ett gränssnitt. Ett gränssnitt kan också ärva/förlänga ( extends) ett annat gränssnitt.

I Java kan en klass inte ärva från mer än en klass, men den kan implementera flera gränssnitt. Flera arv av gränssnitt är inte förbjudet, det vill säga ett gränssnitt kan ärvas från flera.

Gränssnitt kan användas som metodparametertyper. Gränssnitt kan inte instansieras.

Markörgränssnitt

Java har gränssnitt som inte innehåller metoder för implementering, utan hanteras på ett speciellt sätt av JVM:en: Cloneable, Serializable, RandomAccess, Remote.

Mallar i Java (generics)

Från och med Java 5.0 dök en generisk programmeringsmekanism upp i språket  - mallar som utåt sett är nära C++-mallar. Med hjälp av en speciell syntax i beskrivningen av klasser och metoder kan du specificera typparametrar som kan användas i beskrivningen som typer av fält, parametrar och returvärden för metoder.

// Generic class declaration class GenericClass < E > { E getFirst () { ... } void add ( E obj ) { ... } } // Använda en generisk klass i koden GenericClass < String > obj = new GenericClass <> (); obj . add ( "qwerty" ); Sträng p = obj . getFirst ();

Generisk deklaration av klasser, gränssnitt och metoder är tillåten. Dessutom stöder syntaxen begränsade typparameterdeklarationer: att specificera en typkonstruktion i deklarationen <T extends A & B & C...>kräver att typparametern T implementerar gränssnitten A, B, C och så vidare.

Till skillnad från C#-mallar stöds inte Java-mallar av runtime - kompilatorn skapar helt enkelt bytekod, där det inte finns några mallar längre. Implementeringen av mallar i Java skiljer sig fundamentalt från implementeringen av liknande mekanismer i C ++: kompilatorn genererar inte en separat variant av en klass eller mallmetod för varje fall av användning av en mall, utan skapar helt enkelt en enda bytekodimplementering som innehåller nödvändiga typkontroller och omvandlingar. Detta leder till ett antal restriktioner för användningen av mallar i Java-program.

Söker efter klassmedlemskap

I Java kan du uttryckligen kontrollera vilken klass ett objekt tillhör. Uttrycket foo instanceof Fooär lika trueom objektet footillhör en klass Fooeller dess avkomling, eller implementerar ett gränssnitt Foo(eller, mer generellt, ärver en klass som implementerar ett gränssnitt som ärver Foo).

Vidare kan funktionen getClass()[dok. 10] , definierad för alla objekt, producerar ett objekt av typen Class<?>. För varje klass skapas högst ett objekt av typen som beskriver den Class, så dessa objekt kan jämföras. Så, till exempel, foo.getClass() == bar.getClass()kommer det att vara sant om objekten foooch bartillhör samma klass.

Dessutom kan ett objekt av Class<?>vilken typ som helst erhållas så här: Integer.class, Object.class.

Direkt jämförelse av klasser är inte alltid det bästa sättet att kontrollera klassmedlemskap. Ofta används istället en funktion isAssignableFrom(). Denna funktion är definierad på ett typobjekt Classoch tar ett typobjekt som Class<?>en parameter. Således kommer samtalet Foo.class.isAssignableFrom(Bar.class)att återkomma trueom det Fooär en förfader till klassen Bar. Eftersom alla objekt är ättlingar av typen Objectkommer anropet Object.class.isAssignableFrom()alltid att återkomma true.

Tillsammans med de nämnda funktionerna för typobjektet Class, funktionerna isInstance[dok. 11] (motsvarande instanceof), samt cast()(konverterar parametern till ett objekt av den valda klassen).

Felhantering

Felhantering i Java liknar felhantering i C++ förutom behovet av en finally. Denna skillnad beror på det faktum att Java inte kan följa konceptet med RAII på grund av närvaron av en sophämtare, och den automatiska frigöringen av resurser i förstöraren kan ske i en oförutsägbar ordning med godtyckliga intervall.

Felhantering utförs med hjälp av operatorerna try, catchoch finally. Det kastade felet beskrivs av ett objekt av en viss klass som ärver från Throwable[dok. 12] och som motsvarar typen av fel. Inuti blocket tryfinns kod som kan skapa ett undantag, och blocket catchfångar de typer av fel som specificeras av programmeraren. I det här fallet kan du ange mer än ett block catchför att hantera olika klasser av fel, eller multi-catch för att hantera flera fel. Blocket är valfritt, men om det finns, exekveras det oavsett förekomsten av ett fel och är avsett att frigöra de resurser som finallytilldelats under driften av blocket .try

Sedan Java 7 har gränssnittet AutoCloseable[dok. 13] , som låter dig implementera klasser som automatiskt släpper resurser. Objekt av sådana klasser måste skapas inom parentes före try. Ett enkelt exempel på automatisk resursallokering är att läsa innehållet i en fil:

importera java.io.* ; offentlig klass Main { public static void main ( String [] args ) kastar IOException { if ( args . längd < 2 ) { System . fel . println ( "Inget filnamn specificerat." ); återvända ; } Sträng filnamn = args [ 1 ] ; // Den öppnade filen stängs automatiskt av misstag försök ( BufferedReader reader = new BufferedReader ( new FileReader ( filnamn ))) { Stränglinje ; _ for ( int n = 1 ; ( rad = läsare . readLine ()) != null ; ++ n ) { System . ut . println ( n + ": " + rad ); } } catch ( FileNotFoundException e ) { System . fel . println ( "Den angivna filen hittades inte." ); } // till sist { // reader.close(); // automatisk resursstängning // } } }

Java följer konceptet med obligatorisk specificering av de felklasser som en metod kan kasta. Detta görs med hjälp av ett nyckelord throwsefter metodbeskrivningen. Om metoden inte specificerar en undantagsklass (eller dess förfader) som kan kastas från metoden, kommer detta att orsaka ett kompileringsfel. Konceptet var tänkt att göra koden självdokumenterande, vilket betecknar vilka undantag en viss metod kan ge, men i praktiken motiverar det sig sällan, eftersom en programmerare på grund av olika omständigheter kan ange en klass som ett undantag som ska kastas Exceptioneller omsluta problematiskt delar av en metod i ett block try... catchför att ignorera enskilda fel, eller - i blocket try... finally, dölja alla möjliga fel. Nackdelen med konceptet är också att programmeraren själv måste definiera och föreskriva de undantag som metoden kan kasta [74] .

Namnutrymme

Idén med namnutrymmen finns i Java-paket .

Namnet på Java-paketet är latin (gemener och versaler) med siffror (inte det första på raden) och ett understreck (inte det första och inte det sista), som inte är språkinstruktioner (not if, null), separerade med punkter .

Exempel på rätt namn:

  • project.types.net.media
  • a0.a_b.canrepeat.canrepeat.UPPERCASE.RaNdOmCaSe(även om det inte är önskvärt på grund av oläsbarhet)

Exempel på fel namn:

  • doubledots..something(två prickar i rad)
  • нестандартный.язык(inte latin)
  • 0first.characret.is.number(nummer i början)
  • contains.white space(Plats)
  • true.asd(innehåller true, se ovan)

Paket innehåller klasser, gränssnitt, uppräkningar, anteckningar (etc.) vars namn är latinska (gemener och versaler) med siffror (inte det första på raden). Det kan bara finnas en offentlig klass, gränssnitt (etc.) i en fil. Namnet på den offentliga klassen, gränssnittet (etc.) i filen måste matcha namnet på filen. Varje klass har sin egen namnrymd för funktioner, variabler och underklasser, undergränssnitt (etc.), och du kan få en underklass till en klass med OuterClass.InnerClass, eller så kan du använda OuterClass$InnerClass, så att använda dollarsymbolen i klassnamnet rekommenderas inte.

Programexempel

Programkod "Hej, värld!" .

klass hej värld { public static void main ( String [] args ) { System . ut . println ( "Hej världen!" ); } }

Generaliseringar :

Ett exempel på användning av generika importera java.util.List ; importera java.util.ArrayList ; public class Sample { public static void main ( String [] args ) { // Skapa ett objekt från en mall. List < String > strings = new ArrayList <> (); strängar . add ( "Hej" ); strängar . add ( "värld" ); strängar . lägg till ( "!" ); for ( var sträng : strängar ) { System . ut . print ( sträng + " " ); } } }

Reflektion :

Ett exempel på användning av reflektion importera java.lang.reflect.Field ; importera java.lang.reflect.Method ; class TestClass { privat int värde ; public int getValue () { return value ; } public void setValue ( int valueIn ) { detta . värde = värdeIn ; } } public class Main { public static void main ( String [] args ) { var testClass = new TestClass (); for ( var field : testClass . getClass (). getDeclaredFields ()) { System . ut . printf ( "namn:%s, typ:%s \n" , fält .getName (), fält .getType (). getCanonicalName ( ) ); } for ( var metod : testClass . getClass (). getDeclaredMethods ()) { System . ut . printf ( "namn:%s, returtyp:%s \n" , metod .getName (), metod .getReturnType (). getCanonicalName ( ) ); } } }

Anteckningar :

Anteckningsexempel importera java.lang.annotation.ElementType ; importera java.lang.annotation.Retention ; importera java.lang.annotation.RetentionPolicy ; importera java.lang.annotation.Target ; @Retention ( RetentionPolicy . RUNTIME ) @Target ( ElementType . TYPE ) public @interface MyAnnotation { offentligt booleskt värde () 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 . ut . printf ( "värde:%s \n" , myAnnotation . värde ()); } } }

Verktyg för mjukvaruutveckling

Se även

Anteckningar

Kommentarer

  1. Uttalas på engelska som /ˈdʒɑːvə/ , på ryska finns det translitterationer "Java" och "Java", varumärkesägare föredrar den första translitterationen.

Dokumentation

  1. String
  2. AutoCloseable
  3. URLClassLoader
  4. HttpURLConnection
  5. StringBuffer
  6. Void
  7. clone()
  8. Cloneable
  9. Math
  10. getClass()
  11. isInstance()
  12. Throwable
  13. AutoCloseable

Källor

  1. https://www.lemondeinformatique.fr/actualites/lire-java-open-source-c-est-fait-et-c-est-en-gpl-21350.html
  2. De bästa programmeringsspråken 2020  , IEEE Spectrum . Arkiverad från originalet den 18 januari 2021. Hämtad 14 februari 2021.
  3. TIOBE Index | TIOBE - The Software Quality Company . www.tiobe.com. Hämtad 19 november 2018. Arkiverad från originalet 25 februari 2018.
  4. Buyya. Objektorienterad programmering med Java: Essentials and Applications . - Tata McGraw-Hill Education, 2009. - 678 sid. — ISBN 9780070669086 . Arkiverad 12 november 2018 på Wayback Machine
  5. Star7: hur Java började
  6. 1 2 Java 6 -serverhastighet ÷ C++ GNU g++ hastighet | Computer Language Benchmarks Game (inte tillgänglig länk) . Hämtad 4 mars 2010. Arkiverad från originalet 14 juni 2011. 
  7. Metz, Cade. Google ställer C++ mot Java, Scala och  Go . Registret (3 juni 2011). Hämtad 5 juni 2011. Arkiverad från originalet 21 augusti 2011.
  8. Loop Recognition i C++/Java/Go/Scala  (0,3 MB) Arkiverad 16 november 2011 på Wayback Machine
  9. Google jämförde prestandan för C++, Java, Go och Scala . Hämtad 5 juni 2011. Arkiverad från originalet 8 juni 2011.
  10. Robert Tolksdorf. Programmeringsspråk för Java Virtual Machine JVM  . är research GmbH. — Onlinekatalog över alternativa språk och språktillägg för JVM. Hämtad 5 juni 2009. Arkiverad från originalet 21 augusti 2011.
  11. SUN SHIPS JDK 1.1 -- JAVABEANS INGÅR (länk ej tillgänglig) (10 februari 2008). Hämtad 17 november 2018. Arkiverad från originalet 10 februari 2008. 
  12. Java 2-programvara (nedlänk) (19 januari 2004). Hämtad 17 november 2018. Arkiverad från originalet 19 januari 2004. 
  13. Ada 83 LRM, avsnitt 12.1: Generiska deklarationer . archive.adaic.com. Hämtad 17 november 2018. Arkiverad från originalet 17 april 2019.
  14. Testresultat . Hämtad 13 september 2012. Arkiverad från originalet 25 juni 2012.
  15. ↑ Vanliga frågor om JavaFX . www.oracle.com. Hämtad 17 november 2018. Arkiverad från originalet 29 oktober 2018.
  16. Smith, Donald . Framtiden för JavaFX och andra Java Client Roadmap-uppdateringar . Arkiverad från originalet den 17 november 2018. Hämtad 17 november 2018.
  17. utvecklingsfärdplan för JDK7 . Hämtad 4 juli 2011. Arkiverad från originalet 8 januari 2021.
  18. Plan B. Hämtad 4 juli 2011. Arkiverad från originalet 11 juli 2011.
  19. OpenJDK: Project Coin . openjdk.java.net. Hämtad 17 november 2018. Arkiverad från originalet 4 oktober 2012.
  20. Oracle tillkännager Java Standard Edition 7 arkiverad 3 augusti 2011 på Wayback Machine  (ryska)
  21. Indexkorruption och kraschar i Apache Lucene Core / Apache Solr med Java 7 Arkiverad 9 augusti 2021 på Wayback Machine 
  22. Java Language Actor Extension i MPS-miljö Arkiverad 29 april 2015 på Wayback Machine . — Bulletin från ITMO. - Nummer 6 (94)
  23. Vad är nytt i JDK 8 . www.oracle.com. Hämtad 17 november 2018. Arkiverad från originalet 13 april 2020.
  24. Metodreferenser  . _ Java™-handledningarna . docs.oracle.com. Hämtad 17 november 2018. Arkiverad från originalet 21 oktober 2018.
  25. JDK 9 release försenad ytterligare fyra månader . Hämtad 17 maj 2017. Arkiverad från originalet 09 maj 2017.
  26. Java 9 får ett releasedatum: 27 juli . Hämtad 17 maj 2017. Arkiverad från originalet 17 maj 2017.
  27. Java 9 försenad till 21 september . Hämtad 29 juli 2017. Arkiverad från originalet 29 juli 2017.
  28. ↑ Oracle tillkännager Java SE 9 och Java EE 8. Pressmeddelande  . Oracle (21 september 2017). Hämtad 1 augusti 2018. Arkiverad från originalet 2 oktober 2018.
  29. Projektera  sticksågen . openjdk.java.net. Hämtad 24 november 2018. Arkiverad från originalet 9 januari 2021.
  30. ↑ JEP 102 : Process API-uppdateringar  . OpenJDK . Hämtad 6 september 2018. Arkiverad från originalet 6 september 2018.
  31. ↑ 1 2 JEP 110: HTTP/2-klient (inkubator  ) . OpenJDK . Hämtad 6 september 2018. Arkiverad från originalet 2 september 2018.
  32. JEP 11:  Inkubatormoduler . OpenJDK . Hämtad 6 september 2018. Arkiverad från originalet 15 september 2018.
  33. JEP 254: Kompakta  strängar . OpenJDK . Hämtad 6 september 2018. Arkiverad från originalet 8 september 2018.
  34. ↑ JEP 287 : SHA-3 Hash-algoritmer  . OpenJDK . Hämtad 6 september 2018. Arkiverad från originalet 6 september 2018.
  35. ↑ JEP 277 : Förbättrad avskrivning  . OpenJDK . Hämtad 6 september 2018. Arkiverad från originalet 19 september 2018.
  36. Java-språkuppdateringar . www.oracle.com. Hämtad 14 november 2021. Arkiverad från originalet 14 november 2021.
  37. JEP 283: Aktivera GTK 3 på Linux . openjdk.java.net. Hämtad 25 november 2018. Arkiverad från originalet 24 november 2018.
  38. Oracle Java SE 10 release  anländer . ORAKEL. Hämtad 24 juni 2018. Arkiverad från originalet 20 mars 2018.
  39. ↑ JEP 286 : Lokal-variabel typinferens  . openjdk.java.net. Hämtad 18 november 2018. Arkiverad från originalet 18 november 2018.
  40. JEP 304: Garbage Collector  Interface . openjdk.java.net. Hämtad 20 november 2018. Arkiverad från originalet 3 oktober 2018.
  41. JEP 307: Parallell Full GC för  G1 . openjdk.java.net. Hämtad 21 november 2018. Arkiverad från originalet 3 oktober 2018.
  42. Alexey Ragozin. Säkerhetspunkter i HotSpot  JVM . blog.ragozin.info. Hämtad 24 november 2018. Arkiverad från originalet 24 november 2018.
  43. ↑ JEP 312 : Tråd-lokala handskakningar  . openjdk.java.net. Hämtad 24 november 2018. Arkiverad från originalet 21 oktober 2018.
  44. ↑ JEP 314 : Ytterligare Unicode-språktaggtillägg  . openjdk.java.net. Hämtad 22 november 2018. Arkiverad från originalet 5 oktober 2018.
  45. ↑ JEP 316 : Högtilldelning på alternativa minnesenheter  . openjdk.java.net. Hämtad 24 november 2018. Arkiverad från originalet 22 oktober 2018.
  46. ↑ JEP 317 : Experimentell Java-baserad JIT-kompilator  . openjdk.java.net. Hämtad 22 november 2018. Arkiverad från originalet 24 november 2018.
  47. ↑ JEP 322 : Tidsbaserad versionsversion  . openjdk.java.net. Hämtad 22 november 2018. Arkiverad från originalet 31 oktober 2018.
  48. JEP 181: Nest-baserad  åtkomstkontroll . openjdk.java.net. Hämtad 18 november 2018. Arkiverad från originalet 18 november 2018.
  49. JEP 318: Epsilon: A No-Op Garbage Collector (experimentell  ) . openjdk.java.net. Hämtad 18 november 2018. Arkiverad från originalet 18 november 2018.
  50. JEP 321: HTTP-klient (standard  ) . openjdk.java.net. Datum för åtkomst: 18 november 2018. Arkiverad från originalet 24 november 2018.
  51. ↑ JEP 323 : Lokal-variabel syntax för lambdaparametrar  . openjdk.java.net. Hämtad 18 november 2018. Arkiverad från originalet 15 november 2018.
  52. JEP 327: Unicode  10 . openjdk.java.net. Hämtad 18 november 2018. Arkiverad från originalet 18 november 2018.
  53. JEP 332: Transportlagersäkerhet (TLS)  1.3 . openjdk.java.net. Hämtad 18 november 2018. Arkiverad från originalet 18 november 2018.
  54. JEP 333: ZGC: En skalbar sopsamlare med låg latens (experimentell  ) . openjdk.java.net. Hämtad 18 november 2018. Arkiverad från originalet 18 november 2018.
  55. Delabassee, David . Öppna upp Java EE - En uppdatering . Arkiverad från originalet den 26 november 2018. Hämtad 25 november 2018.
  56. And the Name Is...  (engelska) , Life at Eclipse  (26 februari 2018). Arkiverad från originalet den 26 november 2018. Hämtad 25 november 2018.
  57. JEP 320: Ta bort Java EE- och CORBA-modulerna . openjdk.java.net. Hämtad 25 november 2018. Arkiverad från originalet 24 november 2018.
  58. 1 2 Stöd för  Microsoft Java Virtual Machine . Microsoft (12 september 2003). — Microsofts officiella uttalande om stödprogrammet MSJVM. Hämtad 9 oktober 2010. Arkiverad från originalet 21 augusti 2011.
  59. Visual J# . Microsoft (november 2007). — Officiell Microsoft-information om raderingen av J# från Visual Studio 2008. Åtkomstdatum: 10 oktober 2010. Arkiverad från originalet den 21 augusti 2011.
  60. Todd Hoff. Amazon Architecture  (engelska) (18 september 2007). - Diskussion om Amazon-arkitekturen med hjälp av Java-teknik. Hämtad 6 juni 2009. Arkiverad från originalet 28 februari 2009.
  61. Amazon Elastic Compute Cloud (Amazon EC2  ) . Amazon Web Services LLC. - Beskrivning av tekniken och funktionerna hos Amazon EC2 som webbtjänst. Hämtad 6 juni 2009. Arkiverad från originalet 21 augusti 2011.
  62. Todd Hoff. eBay Architecture  (engelska) (27 maj 2008). - Diskussion om eBays arkitektur på Java-plattformen. Datum för åtkomst: 6 september 2009. Arkiverad från originalet den 21 augusti 2011.
  63. Randy Shoup, Dan Pritchett. eBay-  arkitekturen . SD Forum 2006 . ??? (29 november 2006). — Presentation om historien om eBay-arkitekturutveckling. Hämtad 6 juni 2009. Arkiverad från originalet 21 augusti 2011.
  64. Brian Guan. LinkedIn-bloggen. Blogg arkiv.  Graals på LinkedIn . LinkedIn.com (11 juni 2008). - Historien om skapandet av LinkedIn-systemet baserat på Grails Java-teknik. Hämtad 5 juni 2009. Arkiverad från originalet 21 augusti 2011.
  65. Hadoop och distribuerad datoranvändning på Yahoo!  (engelska) . Yahoo! — Hadoops distribuerade tjänst Java-teknik startsida på Yahoo! Developer Portal. Hämtad 21 juni 2009. Arkiverad från originalet 21 augusti 2011.
  66. OracleJVM och Java lagrade  procedurer . Oracle Inc.. - En del av Oracle-portalen dedikerad till Java-teknik som en del av Oracle DBMS-servern. Hämtad 5 juni 2009. Arkiverad från originalet 21 augusti 2011.
  67. Ubuntu: Intel® Q6600® fyrkärniga datorspråksriktmärken . Arkiverad från originalet den 22 juni 2012.
  68. Wolfgang Puffitsch, Martin Schoeberl. picoJava-II i ett FPGA  //  DTU-bibliotek. - 2007. Arkiverad den 2 december 2018.
  69. JVM har inte stöd för booleska variabler, så de representeras som int-värden. Däremot stöds booleska[]-arrayer. VM Spec Strukturen för Java Virtual Machine Arkiverad 24 november 2011 på Wayback Machine
  70. Bjarne Stroustrup . C++ programmeringsspråk = C++ programmeringsspråk. - M.-SPb.: Binom, Nevskij-dialekt, 2008. - 1104 sid. - 5000 exemplar.  — ISBN 5-7989-0226-2 ; ISBN 5-7940-0064-3 ; ISBN 0-201-70073-5 .
  71. James Gosling , Bill Joy, Guy Steele, Gilad Bracha, Alex Buckley, Daniel Smith. Java-språkspecifikation . Kapitel 15.  Uttryck . docs.oracle.com . Hämtad 1 december 2018. Arkiverad från originalet 1 december 2018.
  72. Referens till Java API . Klassobjekt  . _ docs.oracle.com . Hämtad 26 november 2018. Arkiverad från originalet 26 november 2018.
  73. Scott Oaks. Java Performance: The Definitive Guide: Få ut det mesta av din kod . - "O'Reilly Media, Inc.", 2014-04-10. — 425 sid. — ISBN 9781449363543 . Arkiverad 21 juli 2021 på Wayback Machine
  74. Problemet med kontrollerade undantag . www.artima.com Datum för åtkomst: 21 december 2018. Arkiverad från originalet den 8 januari 2019.
  75. Pulsar - Eclipse Mobile Tools  Platform . förmörkelse. — Eclipse-projektet för mobilutvecklare. Hämtad 23 mars 2011. Arkiverad från originalet 21 augusti 2011.

Litteratur

  • Herbert Schildt. Java. The Complete Guide 10th Edition = Java. Den fullständiga referensen, 10:e upplagan. - M . : "Dialektik" , 2018. - 1488 sid. - ISBN 978-5-6040043-6-4 .
  • Kay S. Horstmann. Java SE 9. Grundkurs = Core Java SE 9 för den otåliga. - M. : "Williams" , 2018. - 576 sid. - ISBN 978-5-6040043-0-2 , 978-0-13-469472-6.
  • Kay S. Horstmann. Java SE 8. Introduktionskurs = Java SE 8 för den riktigt otåliga. - M. : "Williams" , 2014. - 208 sid. — ISBN 978-5-8459-1900-7 .
  • Fred Long, Dhruv Mohindra, Robert S. Seacord, Dean F. Sutherland, David Swoboda. Java-programmerares guide: 75 rekommendationer för pålitliga och säkra program = Java-kodningsriktlinjer: 75 rekommendationer för pålitliga och säkra program. - M. : "Williams" , 2014. - 256 sid. — ISBN 978-5-8459-1897-0 .
  • Kay S. Horstmann. Java. Professionell bibliotek, volym 1. Grunderna. 10:e upplagan = Core Java. Volym I - Fundamentals (tionde upplagan). - M. : "Williams" , 2017. - 864 sid. — ISBN 978-5-8459-2084-3 .
  • Kay S. Horstmann. Java. Professional's Library, Volym 2. Avancerade programmeringsverktyg. 10:e upplagan = Core Java. Volym II - Avancerad funktion (tionde upplagan). - M. : "Williams" , 2017. - 976 sid. - ISBN 978-5-9909445-0-3 .
  • Barry Bird. Java 9 for Dummies = Java For Dummies, 7:e upplagan. - M . : "Dialektik" , 2018. - 624 sid. - ISBN 978-5-9500296-1-5 , 978-1-119-23555-2.
  • Kishori Sharan. Java 9. Komplett översikt över innovationer = Java 9 Revealed. - M. : "DMK Press" , 2018. - 544 sid. — ISBN 978-5-97060-575-2 .
  • James Gosling, Bill Joy, Guy Steele, Gilad Bracha, Alex Buckley. Programmeringsspråket Java SE 8. Detaljerad beskrivning, 5:e upplagan = Java-språkspecifikationen, Java SE 8-utgåvan (5:e upplagan) (Java-serien). - M. : "Williams" , 2015. - 672 sid. - ISBN 978-5-8459-1875-8 .
  • Joshua Bloch. Java. Effektiv programmering = Effektiv Java. - 3:a. - M . : Dialektik , 2019. - 464 sid. - ISBN 978-5-6041394-4-8 .
  • Benjamin J. Evans, James Gough, Chris Newland. Java: programoptimering. Praktiska metoder för att förbättra applikationsprestanda i JVM. - M . : Dialektik , 2019. - 448 sid. - ISBN 978-5-907114-84-5 .
  • Monakhov Vadim. Java programmeringsspråk och NetBeans miljö. - 3:e uppl. - St Petersburg. : BHV-Petersburg , 2011. - 704 sid. - ISBN 978-5-9775-0671-7 .
  • Bruce Eckel. Java Philosophy = Att tänka i Java. - 4:e uppl. - St Petersburg. : Peter , 2018. - 1168 sid. - ISBN 978-5-496-01127-3 .

Länkar