Učite Javu od temelja

Dakle, želite programirati na Javi? To je sjajno i došli ste na pravo mjesto. Serija Java 101 nudi samoupravan uvod u programiranje Java, počevši od osnova i pokrivajući sve temeljne koncepte koje trebate znati da biste postali produktivni Java programer. Ova je serija tehnička, s mnoštvom primjera koda koji će vam pomoći da shvatite koncepte kako idemo dalje. Pretpostavit ću da već imate određeno programsko iskustvo, samo ne na Javi.

Ovaj prvi članak predstavlja Java platformu i objašnjava razliku između njezina tri izdanja: Java SE, Java EE i Java ME. Također ćete naučiti o ulozi Java virtualnog stroja (JVM) u postavljanju Java aplikacija. Pomoći ću vam da postavite Java Development Kit (JDK) na vašem sustavu tako da možete razvijati i pokretati Java programe, i započet ću s arhitekturom tipičnog Java programa. Na kraju ćete naučiti kako kompilirati i pokrenuti jednostavnu Java aplikaciju.

Ažurirano za Javu 12 i novu JShell

Ova je serija ažurirana za Javu 12 i uključuje brzi uvod u novo jshell: interaktivni alat za učenje Java i izradu prototipa Java koda.

preuzimanje Preuzmite kod Preuzmite izvorni kod za primjere aplikacija u ovom vodiču. Stvorio Jeff Friesen za JavaWorld.

Što je Java?

O Javi možete razmišljati kao o objektno orijentiranom jeziku opće namjene koji sliči na C i C ++, ali koji je lakši za upotrebu i omogućuje stvaranje robusnijih programa. Nažalost, ova vam definicija ne daje puno uvida u Javu. Sun Microsystems (začetnik Java platforme) opisao je 2000. Java na sljedeći način: 

Java je jednostavan, objektno orijentiran, mrežno pametan, protumačen, robustan, siguran, arhitekturno neutralan, prijenosni, visokonaponski, višenamenski, dinamički računalni jezik.

Razmotrimo svaku od ovih definicija zasebno.

Java je jednostavan jezik . Java je u početku napravljena po uzoru na C i C ++, minus neke potencijalno zbunjujuće značajke. Pokazivači, višestruko nasljeđivanje implementacije i preopterećenje operatora neke su C / C ++ značajke koje nisu dio Jave. Značajka koja nije propisana u C / C ++, ali je od suštinske važnosti za Javu, je objekt za odvoz smeća koji automatski vraća predmete i nizove.

Java je objektno orijentirani jezik . Javin objektno usmjereni fokus omogućuje programerima rad na prilagodbi Jave za rješavanje problema, umjesto da nas prisiljava da manipuliramo problemom kako bismo udovoljili jezičnim ograničenjima. To je različito od strukturiranog jezika poput C kao primjer, dok je Java omogućuje da se usredotočite na štedni račun predmete, C zahtijeva da mislite odvojeno o štednom računu stanje (tako balans) i ponašanja (kao što depozita i povlačenje).

Java je mrežno pametni jezik . Java-ova opsežna mrežna knjižnica olakšava suočavanje s mrežnim protokolima protokola upravljanja prijenosom / internetskim protokolom (TCP / IP) poput HTTP-a (HyperText Transfer Protocol) i FTP (File Transfer Protocol) i pojednostavljuje zadatak mrežnih veza. Nadalje, Java programi mogu pristupiti objektima preko TCP / IP mreže putem Uniform Resource Locators (URL-a), s jednakom lakoćom kao što biste im pristupili iz lokalnog datotečnog sustava.

Java je interpretirani jezik . Tijekom izvođenja, Java program neizravno se izvršava na osnovnoj platformi (poput Windows-a ili Linuxa) putem virtualnog stroja (koji je softverski prikaz hipotetičke platforme) i povezanog izvršnog okruženja. Virtualni stroj prevodi Java program u bytecodes (upute i povezani podaci) na platformi posebne upute putem interpretacije. Interpretacija je čin otkrivanja što znači naredba bajt-koda, a zatim odabir ekvivalentnih "konzerviranih" uputa specifičnih za platformu za izvršenje. Virtualni stroj tada izvršava te upute specifične za platformu.

Interpretacija olakšava otklanjanje pogrešaka u pogrešnim Java programima jer je u vrijeme izvođenja dostupno više podataka o vremenu kompajliranja. Interpretacija također omogućava odgoditi korak povezivanja dijelova Java programa do vremena izvođenja, što ubrzava razvoj.

Java je robustan jezik . Java programi moraju biti pouzdani jer se koriste i u potrošačkim i u kritičnim aplikacijama, u rasponu od Blu-ray uređaja do sustava za navigaciju vozila ili kontrolu zraka. Značajke jezika koje pomažu da Java postane robusna uključuju deklaracije, provjeru dvostrukih tipova tijekom vremena kompajliranja i izvođenja (kako bi se spriječili problemi s neusklađenošću verzija), istinske nizove s automatskom provjerom granica i izostavljanje pokazivača. (Pogledajte "Osnovne značajke Java jezika" da biste započeli s vrstama jezika Java, literalima, varijablama i još mnogo toga.)

Sljedeći aspekt Javine robusnosti je da petlje moraju biti kontrolirane logičkim izrazima umjesto cjelobrojnim izrazima gdje je 0 netočno, a nula vrijednost je istinito. Na primjer, Java ne dopušta petlju u stilu C, na primjer while (x) x++;zato što petlja možda neće završiti tamo gdje se očekuje. Umjesto toga, morate izričito navesti logički izraz, kao što je while (x != 10) x++;(što znači da će se petlja izvoditi dok ne xbude jednako 10).

Java je siguran jezik . Java programi koriste se u umreženim / distribuiranim okruženjima. Budući da se Java programi mogu migrirati i izvršavati na različitim mrežnim platformama, važno je zaštititi te platforme od zlonamjernog koda koji može širiti viruse, krasti podatke o kreditnim karticama ili izvoditi druge zlonamjerne radnje. Značajke Java jezika koje podržavaju robusnost (poput izostavljanja pokazivača) rade sa sigurnosnim značajkama kao što su sigurnosni model Java Sandbox i šifriranje javnog ključa. Zajedno ove značajke sprečavaju viruse i druge opasne kodove da razaraju na ničim sumnjivoj platformi.

U teoriji, Java je sigurna. U praksi su otkrivene i iskorištene razne sigurnosne ranjivosti. Kao rezultat toga, Sun Microsystems tada i Oracle sada nastavljaju izdavati sigurnosna ažuriranja.

Java je arhitektonski neutralan jezik . Mreže povezuju platforme s različitim arhitekturama temeljenim na raznim mikroprocesorima i operativnim sustavima. Ne možete očekivati ​​da Java generira upute specifične za platformu i da ih ove upute "razumiju" sve vrste platformi koje su dio mreže. Umjesto toga, Java generira upute bytecode-a neovisne o platformi koje je lako protumačiti za svaku platformu (kroz njezinu implementaciju JVM-a).

Java je prijenosni jezik . Neutralnost arhitekture doprinosi prenosivosti. Međutim, Javina prijenosnost ima više od uputa o bytecodeu neovisnih o platformi. Uzmite u obzir da se veličine cjelobrojnih vrsta ne smiju razlikovati. Na primjer, 32-bitni cijeli broj mora uvijek biti potpisan i zauzimati 32 bita, bez obzira na to gdje se obrađuje 32-bitni cijeli broj (npr. Platforma sa 16-bitnim registrima, platforma s 32-bitnim registrima ili platforma s 64-bitnim registrima). Javine knjižnice također doprinose prenosivosti. Tamo gdje je potrebno, nude vrste koje na najprenosiviji način povezuju Java kôd s mogućnostima specifičnim za platformu.

Java je jezik visokih performansi . Interpretacija daje razinu izvedbe koja je obično više nego odgovarajuća. Za scenarije aplikacija s vrlo visokim performansama Java koristi pravovremenu kompilaciju, koja analizira interpretirane sekvence uputa bytecode-a i kompajlira često interpretirane sekvence uputa u upute specifične za platformu. Naknadni pokušaji tumačenja ovih sljedova naredbi bajt koda rezultiraju izvršavanjem ekvivalentnih uputa specifičnih za platformu, što rezultira poboljšanjem performansi.

Java je višenitni jezik . Da bi poboljšala izvedbu programa koji moraju istodobno izvršiti nekoliko zadataka, Java podržava koncept izvedbe s navojem . Na primjer, program koji upravlja grafičkim korisničkim sučeljem (GUI) dok čeka na unos s mrežne veze koristi drugu nit za obavljanje čekanja umjesto da koristi zadanu GUI nit za oba zadatka. To održava GUI reagirajući. Java-ovi primitivi za sinkronizaciju omogućuju nitima da međusobno sigurno komuniciraju podatke bez oštećenja podataka. (Pogledajte programiranje s navojem u Javi o kojem se raspravljalo negdje drugdje u seriji Java 101.)

Java je dinamičan jezik . Budući da se međusobne veze između programskog koda i knjižnica događaju dinamički tijekom izvođenja, nije ih potrebno izričito povezivati. Kao rezultat toga, kada se program ili jedna od njegovih knjižnica razvije (na primjer, radi ispravljanja programske pogreške ili poboljšanja performansi), programer treba samo distribuirati ažurirani program ili knjižnicu. Iako dinamičko ponašanje rezultira s manje koda za distribuciju kada se dogodi promjena verzije, ovo pravilo distribucije također može dovesti do sukoba verzija. Na primjer, programer uklanja vrstu klase iz knjižnice ili je preimenuje. Kada tvrtka distribuira ažuriranu knjižnicu, postojeći programi koji ovise o tipu klase neće uspjeti. Da bi se ovaj problem znatno smanjio, Java podržava tip sučelja, što je poput ugovora dviju strana. (Pogledajte sučelja, vrste i druge objektno-orijentirane jezične značajke o kojima se raspravljalo drugdje u seriji Java 101.)

Otpakiranje ove definicije nauči nas puno o Javi. Što je najvažnije, otkriva da je Java i jezik i platforma. Više o komponentama Java platforme - naime Java virtualnom stroju i Java izvršnom okruženju - naučit ćete kasnije u ovom vodiču.

Tri izdanja Jave: Java SE, Java EE i Java ME

Sun Microsystems objavio je Java 1.0 komplet za razvoj softvera (JDK) u svibnju 1995. Prvi JDK korišten je za razvoj desktop aplikacija i apleta, a Java je naknadno evoluirala tako da obuhvaća programiranje poduzeća-poslužitelja i mobilnih uređaja. Pohranjivanje svih potrebnih knjižnica u jedan JDK učinilo bi JDK prevelikim za distribuciju, pogotovo zato što je distribucija devedesetih bila ograničena CD-ovima male veličine i sporim mrežnim brzinama. Budući da većini programera nije trebao svaki zadnji API (programer stolnih aplikacija teško da bi trebao pristupiti Java API-ima tvrtke), Sun je Java podijelio u tri glavna izdanja. Oni su na kraju postali poznati kao Java SE, Java EE i Java ME:

  • Java platforma, standardno izdanje (Java SE) je Java platforma za razvoj klijentskih aplikacija (koje se izvode na radnim površinama) i apleta (koji se izvode u web preglednicima). Napominjemo da iz sigurnosnih razloga apleti više nisu službeno podržani.
  • Java platforma, izdanje za poduzeće (Java EE ) je Java platforma izgrađena na vrhu Java SE koja se koristi isključivo za razvoj poslužiteljskih aplikacija usmjerenih na poduzeće. Aplikacije na strani poslužitelja uključuju Java servlete , koji su Java programi koji su slični apletima, ali se izvode na poslužitelju, a ne na klijentu. Servleti su u skladu s API-jem Java Servlet.
  • Java Platforma, Micro Edition (Java ME) također je izgrađena na vrhu Java SE. To je Java platforma za razvoj MIDleta , a to su Java programi koji se izvode na mobilnim informacijskim uređajima, i Xleti , koji su Java programi koji se izvode na ugrađenim uređajima.

Java SE temeljna je platforma za Javu i fokus je na seriji Java 101. Primjeri koda temeljit će se na najnovijoj verziji Jave u vrijeme pisanja Java 12.

Java platforma i JVM

Java je i programski jezik i platforma za pokretanje kompiliranog Java koda. Ova se platforma uglavnom sastoji od JVM-a, ali uključuje i izvršno okruženje koje podržava izvršavanje JVM-a na osnovnoj (izvornoj) platformi. JVM uključuje nekoliko komponenata za učitavanje, provjeru i izvršavanje Java koda. Slika 1 prikazuje kako se Java program izvršava na ovoj platformi. 

Jeff Friesen

Na vrhu dijagrama nalazi se niz datoteka klase programa, od kojih je jedna označena kao glavna datoteka klase. Java program sastoji se od najmanje datoteke glavne klase, koja je prva datoteka klase koja se učitava, provjerava i izvršava.

JVM delegira učitavanje klase na svoju komponentu učitavača razreda. Učitavači razreda učitavaju datoteke klasa iz različitih izvora, poput datotečnih sustava, mreža i arhivskih datoteka. Oni izoliraju JVM od zamršenosti učitavanja klase.

Učitana datoteka klase pohranjuje se u memoriju i predstavlja kao objekt stvoren iz Classklase. Jednom učitan, verifikator bajtkoda provjerava razne upute bajtkoda kako bi osigurao da su valjane i da neće ugroziti sigurnost.

Ako byte kodovi datoteke klase nisu valjani, JVM se prekida. Inače, njegova komponenta interpretatora interpretira bytecode jednu po jednu naredbu. Tumačenje identificira upute bajt koda i izvršava ekvivalentne izvorne upute.

Neke sekvence uputa bajt-koda izvršavaju se češće od drugih. Kada tumač otkrije ovu situaciju, JVM-ov pravovremeni (JIT) kompajler kompajlira sekvencu bajt koda u izvorni kôd za brže izvršavanje.

Tijekom izvođenja, tumač obično nailazi na zahtjev za izvršenje bajtkoda druge datoteke klase (koji pripada programu ili knjižnici). Kada se to dogodi, učitavač klasa učitava datoteku klase, a verifikator bajt koda provjerava bajtkod učitane datoteke klase prije nego što se izvrši. Također tijekom izvršavanja, upute bytecode-a mogu zahtijevati da JVM otvori datoteku, prikaže nešto na zaslonu, proizvede zvuk ili izvrši drugi zadatak koji zahtijeva suradnju s matičnom platformom. JVM odgovara upotrebom svoje tehnologije mosta Java Native Interface (JNI) za interakciju s matičnom platformom za izvršavanje zadatka.