Programmering

Lær Java fra grunnen av

Så, vil du programmere i Java? Det er flott, og du har kommet til rett sted. De Java 101-serien gir en selvstyrt introduksjon til Java-programmering, og starter med det grunnleggende og dekker alle kjernekonseptene du trenger å vite for å bli en produktiv Java-utvikler. Denne serien er teknisk, med mange kodeeksempler som hjelper deg å forstå konseptene mens vi går videre. Jeg antar at du allerede har litt programmeringserfaring, bare ikke i Java.

Denne første artikkelen introduserer Java-plattformen og forklarer forskjellen mellom de tre utgavene: Java SE, Java EE og Java ME. Du vil også lære om rollen til den virtuelle Java-maskinen (JVM) i distribusjon av Java-applikasjoner. Jeg hjelper deg med å sette opp et Java Development Kit (JDK) på systemet ditt slik at du kan utvikle og kjøre Java-programmer, og jeg kommer i gang med arkitekturen til et typisk Java-program. Til slutt lærer du hvordan du kompilerer og kjører en enkel Java-app.

Oppdatert for Java 12 og den nye JShell

Denne serien er oppdatert for Java 12 og inkluderer en rask introduksjon til den nye jshell: et interaktivt verktøy for læring av Java og prototyping av Java-kode.

last ned Få koden Last ned kildekoden for eksempel applikasjoner i denne opplæringen. Skapt av Jeff Friesen for JavaWorld.

Hva er Java?

Du kan tenke på Java som et generelt, objektorientert språk som ser mye ut som C og C ++, men som er lettere å bruke og lar deg lage mer robuste programmer. Dessverre gir denne definisjonen deg ikke mye innsikt i Java. I 2000 beskrev Sun Microsystems (opphavsmannen til Java-plattformen) Java på denne måten:

Java er et enkelt, objektorientert, nettverkssikkert, tolket, robust, sikkert, arkitekturnøytralt, bærbart, høytytende, flertrådet, dynamisk dataspråk.

La oss vurdere hver av disse definisjonene separat.

Java er et enkelt språk. Java ble opprinnelig modellert etter C og C ++, minus noen potensielt forvirrende funksjoner. Pekere, flere implementeringsarver og overbelastning av operatører er noen C / C ++ - funksjoner som ikke er en del av Java. En funksjon som ikke er pålagt i C / C ++, men som er viktig for Java, er et søppelinnsamlingsanlegg som automatisk gjenvinner gjenstander og matriser.

Java er et objektorientert språk. Java's objektorienterte fokus lar utviklere arbeide med å tilpasse Java til å løse et problem, i stedet for å tvinge oss til å manipulere problemet for å møte språkbegrensninger. Dette er forskjellig fra et strukturert språk som C. Som et eksempel, mens Java lar deg fokusere på sparekontoobjekter, krever C at du tenker separat om sparekonto stat (en slik balanse) og atferd (for eksempel innskudd og uttak).

Java er et nettverkssikkert språk. Javas omfattende nettverksbibliotek gjør det enkelt å takle Transmission Control Protocol / Internet Protocol (TCP / IP) nettverksprotokoller som HTTP (HyperText Transfer Protocol) og FTP (File Transfer Protocol), og forenkler oppgaven med å lage nettverkstilkoblinger. Videre kan Java-programmer få tilgang til objekter på tvers av et TCP / IP-nettverk, via Uniform Resource Locators (URLs), med samme letthet som du ville ha tilgang til dem fra det lokale filsystemet.

Java er et tolket språk. Ved kjøretid kjøres et Java-program indirekte på den underliggende plattformen (som Windows eller Linux) via en virtuell maskin (som er en programvarepresentasjon av en hypotetisk plattform) og det tilhørende kjøringsmiljøet. Den virtuelle maskinen oversetter Java-programmets bytekoder (instruksjoner og tilhørende data) til plattformsspesifikke instruksjoner gjennom tolkning. Tolkning er handlingen med å finne ut hva en bytekodeinstruksjon betyr og deretter velge tilsvarende "hermetiske" plattformspesifikke instruksjoner å utføre. Den virtuelle maskinen utfører deretter disse plattformspesifikke instruksjonene.

Tolkning gjør det lettere å feilsøke defekte Java-programmer fordi mer informasjon om kompileringstid er tilgjengelig på kjøretid. Tolkning gjør det også mulig å forsinke koblingstrinnet mellom delene av et Java-program til kjøretiden, noe som gir raskere utvikling.

Java er et robust språk. Java-programmer må være pålitelige fordi de brukes i både forbruker- og oppdragskritiske applikasjoner, alt fra Blu-ray-spillere til bilnavigasjon eller luftkontrollsystemer. Språkfunksjoner som hjelper til med å gjøre Java robust inkluderer erklæringer, duplikatkontroll ved kompileringstid og kjøretid (for å forhindre problemer med versjonsfeil samsvar), ekte matriser med automatisk grensekontroll og utelatelse av pekere. (Se "Elementære Java-språkfunksjoner" for å komme i gang med Java-språktyper, bokstaver, variabler og mer.)

Et annet aspekt av Java's robusthet er at sløyfer må kontrolleres av boolske uttrykk i stedet for heltalluttrykk der 0 er usant og en verdi som ikke er null. For eksempel tillater Java ikke en sløyfe i C-stil som mens (x) x ++; fordi sløyfen kanskje ikke ender der forventet. I stedet må du eksplisitt oppgi et boolsk uttrykk, for eksempel mens (x! = 10) x ++; (som betyr at løkken vil løpe til x er lik 10).

Java er et sikkert språk. Java-programmer brukes i nettverk / distribuerte miljøer. Fordi Java-programmer kan migrere til og utføre på nettverkets forskjellige plattformer, er det viktig å beskytte disse plattformene mot ondsinnet kode som kan spre virus, stjele kredittkortinformasjon eller utføre andre ondsinnede handlinger. Java-språkfunksjoner som støtter robusthet (som utelatelse av pekere) fungerer med sikkerhetsfunksjoner som Java-sandkassesikkerhetsmodell og kryptering av offentlig nøkkel. Sammen forhindrer disse funksjonene virus og annen farlig kode fra å herje på en intetanende plattform.

I teorien er Java sikkert. I praksis har forskjellige sikkerhetsproblemer blitt oppdaget og utnyttet. Som et resultat fortsetter Sun Microsystems da og Oracle nå å frigjøre sikkerhetsoppdateringer.

Java er et arkitekturnøytralt språk. Nettverk kobler plattformer med forskjellige arkitekturer basert på forskjellige mikroprosessorer og operativsystemer. Du kan ikke forvente at Java genererer plattformsspesifikke instruksjoner og har disse instruksjonene "forstått" av alle slags plattformer som er en del av et nettverk. I stedet genererer Java plattformuavhengige bytekodeinstruksjoner som er enkle for hver plattform å tolke (via implementeringen av JVM).

Java er et bærbart språk. Arkitekturnøytralitet bidrar til bærbarhet. Imidlertid er Java mer bærbart enn plattformuavhengige bytekodeinstruksjoner. Tenk på at heltalstørrelser ikke kan variere. For eksempel må 32-biters heltallstype alltid signeres og oppta 32 bits, uavhengig av hvor 32-biters heltall behandles (f.eks. En plattform med 16-biters registre, en plattform med 32-biters registre eller en plattform med 64-biters registre). Java's biblioteker bidrar også til bærbarhet. Der det er nødvendig, gir de typer som kobler Java-kode med plattformsspesifikke funksjoner på en mest mulig bærbar måte.

Java er et språk med høy ytelse. Tolkning gir et ytelsesnivå som vanligvis er mer enn tilstrekkelig. For svært høyytelsesapplikasjonsscenarier bruker Java just-in-time kompilering, som analyserer tolket bytecode instruksjons sekvenser og kompilerer ofte tolket instruksjons sekvenser til plattformsspesifikke instruksjoner. Etterfølgende forsøk på å tolke disse bytecode-instruksjonssekvensene resulterer i utførelse av tilsvarende plattformsspesifikke instruksjoner, noe som resulterer i en ytelsesforbedring.

Java er et flertrådet språk. For å forbedre ytelsen til programmer som må utføre flere oppgaver samtidig, støtter Java begrepet gjenget utførelse. For eksempel bruker et program som administrerer et grafisk brukergrensesnitt (GUI) mens de venter på input fra en nettverkstilkobling, en annen tråd for å utføre ventetiden i stedet for å bruke standard GUI-tråden for begge oppgavene. Dette holder brukergrensesnittet lydhør. Java's synkroniseringsprimitiver tillater tråder å trygt kommunisere data mellom seg uten å ødelegge dataene. (Se gjenget programmering i Java diskutert andre steder i Java 101-serien.)

Java er et dynamisk språk. Fordi sammenkoblinger mellom programkode og biblioteker skjer dynamisk ved kjøretid, er det ikke nødvendig å koble dem eksplisitt. Som et resultat, når et program eller en av bibliotekene utvikler seg (for eksempel for en feilretting eller ytelsesforbedring), trenger en utvikler bare å distribuere det oppdaterte programmet eller biblioteket. Selv om dynamisk atferd resulterer i mindre kode å distribuere når en versjonsendring inntreffer, kan denne distribusjonspolitikken også føre til versjonskonflikter. For eksempel fjerner en utvikler en klassetype fra et bibliotek, eller gir den nytt navn. Når et selskap distribuerer det oppdaterte biblioteket, vil eksisterende programmer som avhenger av klassetypen mislykkes. For å redusere dette problemet sterkt, støtter Java en grensesnitttype, som er som en kontrakt mellom to parter. (Se grensesnitt, typer og andre objektorienterte språkfunksjoner diskutert andre steder i Java 101-serien.)

Å pakke ut denne definisjonen lærer oss mye om Java. Viktigst, det avslører at Java er både et språk og en plattform. Du lærer mer om Java-plattformkomponenter - nemlig den virtuelle Java-maskinen og Java-kjøringsmiljøet - senere i denne opplæringen.

Tre utgaver av Java: Java SE, Java EE og Java ME

Sun Microsystems ga ut Java 1.0 programvareutviklingssett (JDK) i mai 1995. Den første JDK ble brukt til å utvikle stasjonære applikasjoner og applets, og Java utviklet seg deretter til å omfatte programmering av bedriftsserver og mobilenheter. Å lagre alle nødvendige biblioteker i en enkelt JDK ville ha gjort JDK for stor til å distribuere, spesielt fordi distribusjonen på 1990-tallet var begrenset av små CD-er og lave nettverkshastigheter. Siden de fleste utviklere ikke trengte alle siste API-er (en desktop-applikasjonsutvikler neppe ville ha tilgang til bedriftens Java API-er), tok Sun Java inn i tre hovedutgaver. Disse ble til slutt kjent som Java SE, Java EE og Java ME:

  • Java Platform, Standard Edition (Java SE) er Java-plattformen for å utvikle applikasjoner på klientsiden (som kjører på stasjonære datamaskiner) og applets (som kjører i nettlesere). Merk at applets av sikkerhetsgrunner ikke lenger støttes offisielt.
  • Java Platform, Enterprise Edition (Java EE) er Java-plattformen bygget på toppen av Java SE, som utelukkende brukes til å utvikle bedriftsorienterte serverapplikasjoner. Server-side applikasjoner inkluderer Java-servlets, som er Java-programmer som ligner på applets, men som kjøres på en server i stedet for en klient. Servlets er i samsvar med Java Servlet API.
  • Java Platform, Micro Edition (Java ME) er også bygget på toppen av Java SE. Det er Java-plattformen for utvikling MIDlets, som er Java-programmer som kjører på mobile informasjonsenheter, og Xlets, som er Java-programmer som kjører på innebygde enheter.

Java SE er grunnplattformen for Java og er fokus for Java 101-serien. Kodeeksempler vil være basert på den nyeste versjonen av Java i skrivende stund, Java 12.

Java-plattformen og JVM

Java er både et programmeringsspråk og en plattform for å kjøre kompilert Java-kode. Denne plattformen består hovedsakelig av JVM, men inkluderer også et kjøringsmiljø som støtter JVMs kjøring på den underliggende (native) plattformen. JVM inneholder flere komponenter for lasting, verifisering og kjøring av Java-kode. Figur 1 viser hvordan et Java-program kjøres på denne plattformen.

Jeff Friesen

Øverst i diagrammet er det en serie programklassefiler, hvorav den ene er betegnet som hovedklassfilen. Et Java-program består av minst hovedklassfilen, som er den første klassefilen som skal lastes inn, bekreftes og kjøres.

JVM delegerer klasselasting til klasselasterkomponenten. Klasselastere laster klassefiler fra forskjellige kilder, for eksempel filsystemer, nettverk og arkivfiler. De isolerer JVM fra vanskelighetene med klassebelastning.

En lastet klassefil lagres i minnet og representeres som et objekt opprettet fra Klasse klasse. Når den er lastet inn, bekrefter bytecode-verifikatoren de forskjellige instruksjonene for bytecode for å sikre at de er gyldige og ikke kompromitterer sikkerheten.

Hvis klassefilens bytekoder ikke er gyldige, avsluttes JVM. Ellers tolker tolkekomponenten bytekoden en instruksjon om gangen. Tolkning identifiserer bykodeinstruksjoner og utfører tilsvarende native instruksjoner.

Noen instruksjonssekvenser for bytekoder kjøres oftere enn andre. Når tolken oppdager denne situasjonen, kompilerer JVMs just-in-time (JIT) kompilator bytekodesekvensen til opprinnelig kode for raskere utførelse.

Under utførelsen møter tolken vanligvis en forespørsel om å utføre bytekoden til en annen klassefil (tilhører programmet eller et bibliotek). Når dette skjer, laster klasselasteren klassefilen, og bytecode-verifisereren bekrefter den lastede klassefilens bytecode før den kjøres. Også under utførelse kan bytekodeinstruksjoner be om at JVM åpner en fil, viser noe på skjermen, lager en lyd eller utfører en annen oppgave som krever samarbeid med den opprinnelige plattformen. JVM reagerer ved å bruke sin JNI-broteknologi (Java Native Interface) for å samhandle med den opprinnelige plattformen for å utføre oppgaven.

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