Programavimas

Išmokite „Java“ iš pagrindų

Taigi, norite programuoti „Java“? Tai puiku, ir jūs patekote į reikiamą vietą. „Java 101“ serija pateikia savarankišką „Java“ programavimo įvadą, pradedant pagrindais ir apimančiu visas pagrindines sąvokas, kurias reikia žinoti norint tapti produktyviu „Java“ kūrėju. Ši serija yra techninė, su daugybe kodų pavyzdžių, kurie padės jums suprasti šias sąvokas. Aš manysiu, kad jūs jau turite šiek tiek programavimo patirties, tik ne „Java“.

Šiame pirmame straipsnyje pristatoma „Java“ platforma ir paaiškinamas skirtumas tarp trijų jos leidimų: „Java SE“, „Java EE“ ir „Java ME“. Taip pat sužinosite apie „Java“ virtualiosios mašinos (JVM) vaidmenį diegiant „Java“ programas. Padėsiu jums įdiegti „Java Development Kit“ (JDK) savo sistemoje, kad galėtumėte kurti ir paleisti „Java“ programas, ir pradėsiu nuo tipiškos „Java“ programos architektūros. Galiausiai sužinosite, kaip sudaryti ir paleisti paprastą „Java“ programą.

Atnaujinta „Java 12“ ir naujajam „JShell“

Ši serija buvo atnaujinta „Java 12“ ir apima greitą įvadą į naująją jshell: interaktyvus įrankis mokytis Java ir prototipuoti Java kodą.

atsisiųsti Gauti kodą Atsisiųskite šaltinį, pvz., programas, šioje pamokoje. Sukūrė Jeffas Friesenas, skirtas „JavaWorld“.

Kas yra „Java“?

Galite galvoti apie „Java“ kaip apie bendros paskirties, į objektą orientuotą kalbą, panašią į „C“ ir „C ++“, tačiau ją lengviau naudoti ir leisti kurti patikimesnes programas. Deja, šis apibrėžimas nesuteikia daug žinių apie „Java“. 2000 m. „Sun Microsystems“ („Java“ platformos iniciatorius) aprašė „Java“ taip:

„Java“ yra paprasta, orientuota į objektą, išmani tinkle, interpretuota, tvirta, saugi, neutrali architektūrai, nešiojama, didelio našumo, daugiasriegė, dinamiška kompiuterio kalba.

Panagrinėkime kiekvieną iš šių apibrėžimų atskirai.

„Java“ yra paprasta kalba. Iš pradžių „Java“ buvo modeliuota pagal C ir C ++, atėmus kai kurias galimai painias funkcijas. Žymekliai, kelių programų paveldėjimas ir operatoriaus perkrova yra keletas C / C ++ funkcijų, kurios nėra „Java“ dalis. Funkcija, kuri nėra privaloma „C / C ++“, tačiau būtina „Java“, yra šiukšlių surinkimo priemonė, automatiškai atgaunanti objektus ir masyvus.

„Java“ yra į objektą orientuota kalba. Objektyvus „Java“ dėmesys leidžia kūrėjams dirbti pritaikant „Java“ problemai išspręsti, o ne verčia mus manipuliuoti problema, kad atitiktų kalbos apribojimus. Tai skiriasi nuo struktūrinės kalbos, tokios kaip C. Pavyzdžiui, kadangi „Java“ leidžia sutelkti dėmesį į taupomųjų sąskaitų objektus, „C“ reikalauja atskirai galvoti apie taupomąją sąskaitą valstija (tokia pusiausvyra) ir elgesys (pvz., deponavimas ir atsiėmimas).

„Java“ yra tinkle išmananti kalba. Plati „Java“ tinklo biblioteka leidžia lengvai susidoroti su perdavimo valdymo protokolu / interneto protokolo (TCP / IP) tinklo protokolais, tokiais kaip HTTP („HyperText Transfer Protocol“) ir FTP („File Transfer Protocol“), ir supaprastina tinklo ryšių užmezgimą. Be to, „Java“ programos gali pasiekti objektus per TCP / IP tinklą per vienodus šaltinių ieškiklius (URL) taip pat lengvai, kaip turėtumėte prieigą prie jų iš vietinės failų sistemos.

„Java“ yra aiškinama kalba. Vykdymo metu „Java“ programa netiesiogiai vykdo pagrindinę platformą (pvz., „Windows“ ar „Linux“) per virtualią mašiną (kuri yra hipotetinės platformos programinė įranga) ir susijusią vykdymo aplinką. Virtuali mašina verčia „Java“ programas baitų kodus (instrukcijas ir susijusius duomenis) į konkrečiai platformai skirtas instrukcijas interpretuojant. Interpretacija yra veiksmas, skirtas išsiaiškinti, ką reiškia baitekodo instrukcija, ir tada pasirinkti lygiavertes „konservuotas“ konkrečiai platformai skirtas instrukcijas vykdyti. Tada virtuali mašina vykdo tas konkrečiai platformai skirtas instrukcijas.

Dėl aiškinimo lengviau derinti sugedusias „Java“ programas, nes vykdymo metu galima gauti daugiau informacijos kompiliavimo metu. Aiškinimas taip pat leidžia atidėti nuorodos žingsnį tarp „Java“ programų dalių iki vykdymo laiko, o tai pagreitina plėtrą.

„Java“ yra tvirta kalba. „Java“ programos turi būti patikimos, nes jos naudojamos tiek vartotojams, tiek kritiškai svarbioms programoms, pradedant „Blu-ray“ grotuvais ir baigiant transporto priemonės navigacijos ar oro valdymo sistemomis. Kalbos ypatybės, padedančios „Java“ padaryti tvirtą, yra deklaracijos, dublikatų tipo tikrinimas kompiliavimo metu ir vykdymo metu (siekiant išvengti versijų neatitikimo problemų), tikri masyvai su automatiniu ribų tikrinimu ir rodyklių praleidimas. (Norėdami pradėti naudoti „Java“ kalbos tipus, pažodžius, kintamuosius ir dar daugiau, žr. „Pagrindinės„ Java “kalbos funkcijos“.)

Kitas „Java“ patikimumo aspektas yra tas, kad kilpas turi valdyti Būlio išraiškos, o ne sveikos skaičiaus išraiškos, kur 0 yra klaidinga, o nulio vertė yra teisinga. Pavyzdžiui, „Java“ neleidžia C stiliaus kilpos, tokios kaip o (x) x ++; nes kilpa gali nesibaigti ten, kur tikėtasi. Vietoj to turite aiškiai pateikti loginę išraišką, pvz o (x! = 10) x ++; (o tai reiškia, kad ciklas veiks iki x lygi 10).

„Java“ yra saugi kalba. „Java“ programos naudojamos tinkle / paskirstytoje aplinkoje. Kadangi „Java“ programos gali pereiti ir vykdyti įvairias tinklo platformas, svarbu apsaugoti šias platformas nuo kenksmingo kodo, kuris gali platinti virusus, pavogti kreditinės kortelės informaciją ar atlikti kitus kenkėjiškus veiksmus. „Java“ kalbos funkcijos, palaikančios patikimumą (pvz., Rodyklių praleidimas), veikia su saugos funkcijomis, tokiomis kaip „Java“ smėlio dėžės saugos modelis ir viešojo rakto šifravimas. Kartu šios funkcijos neleidžia virusams ir kitiems pavojingiems kodams sunaikinti nieko neįtariančios platformos.

Teoriškai „Java“ yra saugi. Praktiškai buvo aptikta ir panaudota įvairių saugumo spragų. Todėl „Sun Microsystems“ ir „Oracle“ dabar išleidžia saugos naujinimus.

„Java“ yra neutrali architektūrai kalba. Tinklai sujungia skirtingos architektūros platformas, pagrįstas įvairiais mikroprocesoriais ir operacinėmis sistemomis. Negalite tikėtis, kad „Java“ sugeneruos konkrečiai platformai skirtas instrukcijas ir jas „supras“ visų rūšių platformos, kurios yra tinklo dalis. Vietoj to, „Java“ sukuria nuo platformos nepriklausomus baito kodo nurodymus, kuriuos kiekviena platforma gali lengvai interpretuoti (įgyvendindama JVM).

„Java“ yra nešiojama kalba. Architektūros neutralumas prisideda prie perkeliamumo. Tačiau „Java“ perkeliamumas yra daugiau nei nuo platformos nepriklausomos baitkodo instrukcijos. Apsvarstykite, kad sveikojo skaičiaus tipo dydžiai neturi skirtis. Pvz., 32 bitų sveiko skaičiaus tipas visada turi būti pasirašytas ir užimti 32 bitus, neatsižvelgiant į tai, kur 32 bitų sveikasis skaičius apdorojamas (pvz., Platforma su 16 bitų registrais, platforma su 32 bitų registrais arba platforma su 64 bitų registrais). „Java“ bibliotekos taip pat prisideda prie perkeliamumo. Kur reikia, jie pateikia tipus, kurie kuo lengviau perkelia „Java“ kodą su platformos galimybėmis.

„Java“ yra didelio našumo kalba. Vertimas žodžiu suteikia efektyvumo lygį, kuris paprastai yra daugiau nei tinkamas. Labai didelio našumo programų scenarijams „Java“ naudoja „just-in-time“ kompiliavimą, kuris analizuoja interpretuotas baitekodo instrukcijų sekas ir dažnai interpretuojamas instrukcijų sekas parengia konkrečiai platformai skirtose instrukcijose. Vėlesni bandymai interpretuoti šias baitekodo instrukcijų sekas sukelia lygiavertes konkrečiai platformai skirtas instrukcijas, o tai padidina našumą.

„Java“ yra daugialypė kalba. Siekdama pagerinti programų, kurios turi atlikti kelias užduotis vienu metu, našumą, „Java“ palaiko „ srieginis vykdymas. Pvz., Programa, valdanti grafinę vartotojo sąsają (GUI), laukdama įvesties iš tinklo ryšio, laukimui atlikti naudoja kitą giją, užuot naudojusi numatytąją GUI giją abiem užduotims atlikti. Tai palaiko GUI reagavimą. „Java“ sinchronizavimo primityvai leidžia gijoms saugiai perduoti duomenis tarpusavyje, nesugadinant duomenų. (Žr. Teminį programavimą „Java“, aptartą kitur „Java 101“ serijoje.)

„Java“ yra dinamiška kalba. Kadangi programos kodas ir bibliotekos sujungiamos dinamiškai vykdymo metu, nėra būtina jų aiškiai susieti. Todėl programai ar vienai iš jos bibliotekų vystantis (pavyzdžiui, norint ištaisyti klaidą ar pagerinti našumą), kūrėjui reikia platinti tik atnaujintą programą ar biblioteką. Nors dėl dinaminio elgesio įvykus versijos keitimui, mažiau kodo paskirstyti, ši paskirstymo politika taip pat gali sukelti versijų konfliktus. Pavyzdžiui, kūrėjas pašalina klasės tipą iš bibliotekos arba pervadina. Kai įmonė platina atnaujintą biblioteką, esamos programos, kurios priklauso nuo klasės tipo, nepavyks. Norėdami labai sumažinti šią problemą, „Java“ palaiko sąsajos tipas, kuri yra tarsi dviejų šalių sutartis. (Žr. Sąsajas, tipus ir kitas į objektą orientuotas kalbos funkcijas, aptartas kitur „Java 101“ serijoje.)

Išpakavę šį apibrėžimą, mes daug išmokome apie „Java“. Svarbiausia, kad tai atskleidžia, kad „Java“ yra ir kalba, ir platforma. Vėliau šioje pamokoje sužinosite daugiau apie „Java“ platformos komponentus - būtent „Java“ virtualią mašiną ir „Java“ vykdymo aplinką.

Trys „Java“ leidimai: „Java SE“, „Java EE“ ir „Java ME“

„Sun Microsystems“ 1995 m. Gegužę išleido „Java 1.0“ programinės įrangos kūrimo rinkinį (JDK). Pirmasis JDK buvo naudojamas darbalaukio programoms ir programėlėms kurti, o „Java“ vėliau plėtėsi apjungdama įmonės, serverio ir mobiliųjų įrenginių programavimą. Saugant visas reikiamas bibliotekas viename JDK, JDK būtų buvęs per didelis platinti, ypač todėl, kad dešimtojo dešimtmečio platinimą ribojo mažo dydžio kompaktiniai diskai ir lėtas tinklo greitis. Kadangi daugumai kūrėjų nereikėjo kiekvienos paskutinės API (darbalaukio programų kūrėjui vargu ar reikės pasiekti įmonės „Java“ API), „Sun“ sudarė „Java“ į tris pagrindinius leidimus. Galų gale jie tapo žinomi kaip „Java SE“, „Java EE“ ir „Java ME“:

  • „Java Platform“, standartinis leidimas („Java SE“) yra „Java“ platforma, skirta kurti kliento programas (kurios veikia darbalaukiuose) ir programėles (kurios veikia žiniatinklio naršyklėse). Atminkite, kad saugumo sumetimais programėlės oficialiai nebepalaikomos.
  • „Java Platform“, „Enterprise Edition“ („Java EE“) yra „Java SE“ pagrindu sukurta „Java“ platforma, kuri naudojama išskirtinai kuriant įmonėms skirtas serverio programas. Serverio programos apima „Java“ servletai, kurios yra „Java“ programos, kurios yra panašios į programėles, bet veikia serveryje, o ne kliente. Servletai atitinka „Java Servlet“ API.
  • „Java Platform“, „Micro Edition“ („Java ME“) taip pat yra pastatytas ant „Java SE“. Tai yra „Java“ platforma, skirta kurti MIDletai, kurios yra „Java“ programos, veikiančios mobiliuosiuose informaciniuose įrenginiuose, ir Xletas, kurios yra „Java“ programos, veikiančios įterptuose įrenginiuose.

„Java SE“ yra pagrindinė „Java“ platforma, skirta „Java 101“ serijai. Kodo pavyzdžiai bus pagrįsti naujausia „Java“ versija rašymo metu „Java 12“.

„Java“ platforma ir JVM

„Java“ yra programavimo kalba ir platforma, leidžianti paleisti kompiliuotą „Java“ kodą. Šią platformą daugiausia sudaro JVM, tačiau ji taip pat apima vykdymo aplinką, palaikančią JVM vykdymą pagrindinėje (savojoje) platformoje. JVM apima kelis komponentus, skirtus „Java“ kodui įkelti, patikrinti ir vykdyti. 1 paveiksle parodyta, kaip „Java“ programa veikia šioje platformoje.

Jeffas Friesenas

Diagramos viršuje yra programų klasės failų serija, viena iš jų žymima kaip pagrindinė klasės byla. „Java“ programą sudaro bent jau pagrindinės klasės failas, kuris yra pirmasis įkeliamas, patikrinamas ir vykdomas klasės failas.

JVM deleguoja klasės įkėlimą į savo „classloader“ komponentą. „Classloaders“ įkelia klasės failus iš įvairių šaltinių, tokių kaip failų sistemos, tinklai ir archyvo failai. Jie izoliuoja JVM nuo klasės pakrovimo subtilybių.

Įkelta klasės byla saugoma atmintyje ir vaizduojama kaip objektas, sukurtas iš Klasė klasė. Įkėlęs baito kodo tikrintuvas patikrina įvairias baito kodo instrukcijas, kad įsitikintų, jog jos yra teisingos ir nepakenks saugumui.

Jei klasės failo baitkodai negalioja, JVM nutraukiamas. Kitu atveju jo vertėjo komponentas interpretuoja baitų kodą po vieną instrukciją. Interpretacija nustato baitekodo instrukcijas ir vykdo lygiavertes savąsias instrukcijas.

Kai kurios baitekodo instrukcijos sekos vykdomos dažniau nei kitos. Kai vertėjas aptinka šią situaciją, JVM „just-in-time“ (JIT) kompiliatorius surenka baitų kodų seką į gimtąjį kodą, kad būtų galima greičiau įvykdyti.

Vykdymo metu vertėjas paprastai susiduria su prašymu vykdyti kito klasės failo baitekodą (priklausantį programai ar bibliotekai). Kai taip atsitinka, „classloader“ įkelia klasės failą, o baitų kodų tikrintuvas patikrina įkelto klasės failo baitų kodą prieš jį vykdant. Be to, vykdymo metu baitekodo instrukcijose gali būti reikalaujama, kad JVM atidarytų failą, kažką rodytų ekrane, įgarsintų ar atliktų kitą užduotį, kuriai reikalingas bendradarbiavimas su gimtąja platforma. JVM atsako naudodamas savo „Java Native Interface“ (JNI) tilto technologiją, kad sąveikautų su gimtąja platforma ir atliktų užduotį.