Programmering

Lær Java fra bunden

Så vil du programmere i Java? Det er fantastisk, og du er kommet til det rigtige sted. Det Java 101-serien giver en selvstyret introduktion til Java-programmering, der starter med det grundlæggende og dækker alle de kernekoncepter, du har brug for at vide for at blive en produktiv Java-udvikler. Denne serie er teknisk med masser af kodeeksempler, der hjælper dig med at forstå begreberne, når vi går videre. Jeg antager, at du allerede har nogle programmeringserfaringer, bare ikke i Java.

Denne første artikel introducerer Java-platformen og forklarer forskellen mellem dens tre udgaver: Java SE, Java EE og Java ME. Du lærer også om den rolle, som den virtuelle Java-maskine (JVM) spiller i implementeringen af ​​Java-applikationer. Jeg hjælper dig med at oprette et Java Development Kit (JDK) på dit system, så du kan udvikle og køre Java-programmer, og jeg får dig i gang med arkitekturen i en typisk Java-applikation. Endelig lærer du, hvordan du kompilerer og kører en simpel Java-app.

Opdateret til Java 12 og den nye JShell

Denne serie er blevet opdateret til Java 12 og inkluderer en hurtig introduktion til den nye jshell: et interaktivt værktøj til at lære Java og prototype Java-kode.

download Hent koden Download kildekoden for eksempel applikationer i denne vejledning. Oprettet af Jeff Friesen til JavaWorld.

Hvad er Java?

Du kan tænke på Java som et generelt formål, objektorienteret sprog, der ligner C og C ++, men som er lettere at bruge og lader dig oprette mere robuste programmer. Desværre giver denne definition dig ikke meget indblik i Java. I 2000 beskrev Sun Microsystems Java (Java-platformens ophavsmand) Java på denne måde:

Java er et simpelt, objektorienteret, netværkskyndigt, fortolket, robust, sikkert, arkitekturneutralt, bærbart, højtydende, multitrådet, dynamisk computersprog.

Lad os overveje hver af disse definitioner separat.

Java er et simpelt sprog. Java blev oprindeligt modelleret efter C og C ++ minus nogle potentielt forvirrende funktioner. Markører, arv med flere implementeringer og overbelastning af operatører er nogle C / C ++ - funktioner, der ikke er en del af Java. En funktion, der ikke er påkrævet i C / C ++, men som er vigtig for Java, er en affaldsindsamlingsfacilitet, der automatisk genvinder objekter og arrays.

Java er et objektorienteret sprog. Java's objektorienterede fokus lader udviklere arbejde på at tilpasse Java til at løse et problem snarere end at tvinge os til at manipulere problemet for at imødekomme sproglige begrænsninger. Dette adskiller sig fra et struktureret sprog som C. Som et eksempel, mens Java lader dig fokusere på opsparingskontoobjekter, kræver C, at du tænker separat om opsparingskonto stat (sådan en balance) og adfærd (såsom indbetaling og udbetaling).

Java er et netværkskyndigt sprog. Javas omfattende netværksbibliotek gør det nemt at håndtere TCP / IP-protokoller (Transmission Control Protocol / Internet Protocol) som HTTP (HyperText Transfer Protocol) og FTP (File Transfer Protocol) og forenkler opgaven med at oprette netværksforbindelser. Desuden kan Java-programmer få adgang til objekter på tværs af et TCP / IP-netværk via Uniform Resource Locators (URL'er) med den samme lethed, som du ville have adgang til dem fra det lokale filsystem.

Java er et fortolket sprog. Ved runtime udføres et Java-program indirekte på den underliggende platform (som Windows eller Linux) via en virtuel maskine (som er en softwarepræsentation af en hypotetisk platform) og det tilknyttede eksekveringsmiljø. Den virtuelle maskine oversætter Java-programmets bytekoder (instruktioner og tilknyttede data) til platformsspecifikke instruktioner gennem fortolkning. Fortolkning er handlingen med at finde ud af, hvad en bytecode-instruktion betyder og derefter vælge ækvivalente "dåse" platformsspecifikke instruktioner, der skal udføres. Den virtuelle maskine udfører derefter disse platformsspecifikke instruktioner.

Fortolkning gør det lettere at debugge defekte Java-programmer, fordi mere information om kompileringstid er tilgængelig under kørsel. Fortolkning gør det også muligt at forsinke forbindelsestrinet mellem stykkerne i et Java-program indtil runtime, hvilket fremskynder udviklingen.

Java er et robust sprog. Java-programmer skal være pålidelige, fordi de bruges i både forbrugere og missionskritiske applikationer, lige fra Blu-ray-afspillere til køretøjsnavigation eller luftkontrolsystemer. Sprogfunktioner, der hjælper med at gøre Java robuste, inkluderer erklæringer, duplikatkontrol af typen ved kompileringstid og kørselstid (for at forhindre, at versionen ikke stemmer overens med problemer), ægte arrays med automatisk kontrol af grænser og udeladelse af markører. (Se "Elementære Java-sprogfunktioner" for at komme i gang med Java-sprogtyper, bogstaver, variabler og mere.)

Et andet aspekt af Java's robusthed er, at sløjfer skal styres af boolske udtryk i stedet for heltal udtryk, hvor 0 er falsk, og en ikke-nul værdi er sand. For eksempel tillader Java ikke en C-stil loop som f.eks mens (x) x ++; fordi sløjfen muligvis ikke ender, hvor det forventes. I stedet skal du eksplicit give et boolsk udtryk, f.eks mens (x! = 10) x ++; (hvilket betyder, at løkken kører indtil x er lig med 10).

Java er et sikkert sprog. Java-programmer bruges i netværk / distribuerede miljøer. Fordi Java-programmer kan migrere til og udføre på et netværks forskellige platforme, er det vigtigt at beskytte disse platforme mod ondsindet kode, der kan sprede vira, stjæle kreditkortoplysninger eller udføre andre ondsindede handlinger. Java-sprogfunktioner, der understøtter robusthed (som udeladelse af markører), fungerer med sikkerhedsfunktioner såsom Java-sandkassesikkerhedsmodel og offentlig nøglekryptering. Sammen forhindrer disse funktioner vira og anden farlig kode i at skabe kaos på en intetanende platform.

I teorien er Java sikkert. I praksis er forskellige sikkerhedssårbarheder blevet opdaget og udnyttet. Som et resultat fortsætter Sun Microsystems og Oracle nu med at frigive sikkerhedsopdateringer.

Java er et arkitekturneutralt sprog. Netværk forbinder platforme med forskellige arkitekturer baseret på forskellige mikroprocessorer og operativsystemer. Du kan ikke forvente, at Java genererer platformsspecifikke instruktioner og har disse instruktioner "forstået" af alle slags platforme, der er en del af et netværk. I stedet genererer Java platformuafhængige bytecode-instruktioner, der er lette for hver platform at fortolke (via implementeringen af ​​JVM).

Java er et bærbart sprog. Arkitekturnutralitet bidrager til bærbarhed. Der er dog mere ved Java's bærbarhed end platformuafhængige bytecode-instruktioner. Overvej, at heltalstørrelser ikke må variere. For eksempel skal 32-bit heltalstypen altid være signeret og optage 32 bit, uanset hvor 32-bit heltal behandles (f.eks. En platform med 16-bit-registre, en platform med 32-bit-registre eller en platform med 64-bit-registre). Java's biblioteker bidrager også til bærbarhed. Hvor det er nødvendigt, leverer de typer, der forbinder Java-kode med platformsspecifikke funktioner på den mest bærbare måde.

Java er et højtydende sprog. Fortolkning giver et ydeevne, der normalt er mere end tilstrækkeligt. For meget højtydende applikationsscenarier bruger Java just-in-time kompilering, som analyserer fortolket bytecode instruktions sekvenser og kompilerer ofte fortolket instruktionssekvenser til platformsspecifikke instruktioner. Efterfølgende forsøg på at fortolke disse bytecode-instruktionssekvenser resulterer i udførelse af ækvivalente platformsspecifikke instruktioner, hvilket resulterer i en performance boost.

Java er et multitrådet sprog. For at forbedre ydeevnen for programmer, der skal udføre flere opgaver på én gang, understøtter Java begrebet gevindskåret udførelse. For eksempel bruger et program, der administrerer en grafisk brugergrænseflade (GUI), mens de venter på input fra en netværksforbindelse, en anden tråd til at udføre ventetiden i stedet for at bruge standard-GUI-tråden til begge opgaver. Dette holder GUI lydhør. Java's synkroniseringsprimitiver tillader tråde at kommunikere data sikkert indbyrdes uden at ødelægge dataene. (Se gevindprogrammering i Java diskuteret andetsteds i Java 101-serien.)

Java er et dynamisk sprog. Da samtrafik mellem programkode og biblioteker sker dynamisk ved kørsel, er det ikke nødvendigt at eksplicit linke dem. Som et resultat, når et program eller et af dets biblioteker udvikler sig (for eksempel til en fejlrettelse eller forbedring af ydeevnen), behøver en udvikler kun at distribuere det opdaterede program eller bibliotek. Selvom dynamisk adfærd resulterer i mindre kode at distribuere, når en versionændring finder sted, kan denne distributionspolitik også føre til versionskonflikter. For eksempel fjerner en udvikler en klassetype fra et bibliotek eller omdøber den. Når en virksomhed distribuerer det opdaterede bibliotek, mislykkes eksisterende programmer, der afhænger af klassetypen. For i høj grad at reducere dette problem understøtter Java en interface type, som er som en kontrakt mellem to parter. (Se grænseflader, typer og andre objektorienterede sprogfunktioner diskuteret andetsteds i Java 101-serien.)

Udpakning af denne definition lærer os meget om Java. Vigtigst af alt afslører det, at Java er både et sprog og en platform. Du lærer mere om Java-platformskomponenter - nemlig den virtuelle Java-maskine og Java-eksekveringsmiljøet - senere i denne vejledning.

Tre udgaver af Java: Java SE, Java EE og Java ME

Sun Microsystems udgav Java 1.0 softwareudviklingssættet (JDK) i maj 1995. Den første JDK blev brugt til at udvikle desktop-applikationer og applets, og Java udviklede sig derefter til at omfatte programmering af virksomhedsserver og mobilenheder. Opbevaring af alle de nødvendige biblioteker i en enkelt JDK ville have gjort JDK for stor til at distribuere, især fordi distribution i 1990'erne var begrænset af små cd'er og lave netværkshastigheder. Da de fleste udviklere ikke havde brug for hver sidste API (en desktop-applikationsudvikler behøvede næppe at få adgang til Java-API'er til virksomheder), indregnede Sun Java i tre hovedudgaver. Disse blev til sidst kendt som Java SE, Java EE og Java ME:

  • Java Platform, Standard Edition (Java SE) er Java-platformen til udvikling af klientsideapplikationer (som kører på desktops) og applets (som kører i webbrowsere). Bemærk, at applets af sikkerhedsmæssige årsager ikke længere understøttes officielt.
  • Java Platform, Enterprise Edition (Java EE) er Java-platformen bygget oven på Java SE, som udelukkende bruges til at udvikle virksomhedsorienterede serverapplikationer. Server-applikationer inkluderer Java-servlets, som er Java-programmer, der ligner applets, men kører på en server i stedet for en klient. Servlets er i overensstemmelse med Java Servlet API.
  • Java Platform, Micro Edition (Java ME) er også bygget oven på Java SE. Det er Java-platformen til udvikling MIDlets, som er Java-programmer, der kører på mobile informationsenheder, og Xlets, som er Java-programmer, der kører på indlejrede enheder.

Java SE er grundplatformen for Java og er fokus for Java 101-serien. Kodeeksempler vil være baseret på den nyeste version af Java i skrivende stund, Java 12.

Java-platformen og JVM

Java er både et programmeringssprog og en platform til at køre kompileret Java-kode. Denne platform består hovedsageligt af JVM, men inkluderer også et eksekveringsmiljø, der understøtter JVM's udførelse på den underliggende (native) platform. JVM inkluderer flere komponenter til indlæsning, verificering og udførelse af Java-kode. Figur 1 viser, hvordan et Java-program udføres på denne platform.

Jeff Friesen

Øverst i diagrammet er der en række programklassefiler, hvoraf den ene betegnes som hovedklassefilen. Et Java-program består af mindst hovedklassefilen, som er den første klasses fil, der skal indlæses, verificeres og udføres.

JVM delegerer klasseindlæsning til sin klasseindlæserkomponent. Classloaders indlæser klassefiler fra forskellige kilder, såsom filsystemer, netværk og arkivfiler. De isolerer JVM fra indviklingen ved klassebelastning.

En indlæst klassefil gemmes i hukommelsen og repræsenteres som et objekt oprettet fra Klasse klasse. Når den er indlæst, verificerer bytecode-verifikator de forskellige bytecode-instruktioner for at sikre, at de er gyldige og ikke kompromitterer sikkerheden.

Hvis klassefilens bytekoder ikke er gyldige, afsluttes JVM. Ellers fortolker dens tolkekomponent bytekoden en instruktion ad gangen. Fortolkning identificerer bytecode-instruktioner og udfører tilsvarende native-instruktioner.

Nogle bytecode-instruktionssekvenser udføres oftere end andre. Når tolken registrerer denne situation, kompilerer JVM's just-in-time (JIT) -compiler bytekodesekvensen til den oprindelige kode for hurtigere udførelse.

Under udførelsen støder tolken typisk på en anmodning om at udføre en anden klasses filtypekode (tilhører programmet eller et bibliotek). Når dette sker, indlæser klasselæsseren klassefilen, og bytecode-verifikatoren verificerer den indlæste klassefils bytecode, før den udføres. Også under udførelse kan bytecode-instruktioner anmode om, at JVM åbner en fil, viser noget på skærmen, laver en lyd eller udfører en anden opgave, der kræver samarbejde med den oprindelige platform. JVM reagerer ved hjælp af sin Java Native Interface (JNI) bridge-teknologi til at interagere med den oprindelige platform for at udføre opgaven.

$config[zx-auto] not found$config[zx-overlay] not found