DOC

Java buvo sukurta 1991 m

By Sean Torres,2014-04-24 14:23
31 views 0
Java buvo sukurta 1991 m

    1 skyrius. Trumpai apie Java

    1.1. Pagrindinės Java teigiamybės

    Apžvelkime Java kalbos pagrindines teigiamybes ir trūkumus, lygindami ją

    su kol kas populiariausia programavimo kalba C++.

    Paprastumas

    1) Java neturi adresų (rodyklių) aritmetikos. Java dirba tik su tais objektais, su

    kuriais ryšys palaikomas per kintamuosius. Taigi Java kintamasis savaime

    nėra objektas, bet tik nuoroda į objektą. Todėl užrašas (sakinys)

     String s; reiškia, kad s yra nuoroda (kelias), bet ne pats objektas (tolesnėje

    programoje panaudoję nuorodą s, vykdymo metu gautumėte klaidą, jog

    bandote operuoti su „tuščia“ vieta). Todėl prieš naudojant objektą, būtina jį sukurti. Tam naudojamas specialus sakinys new:

     String s = new String("abcd");

    ?String tipo objektą galima sukurti ir tiesiogiai:

     String s = "abcd";

    2) Neturi goto sakinio (išskyrus praplėstus break ir continue sakinius). 3) Neleidžia metodo vardo perduoti parametrų sąrašu (skirtumas nuo C++), bet

    leidžia perduoti objektą (o šis viduje turi metodų). 4) Neturi struct (įrašo) tipo. Bet tai čia atitinka class. 5) Neturi union ir bitinių laukų (bitiniai laukai, kaip grynai aparatinė funkcija,

    nesiderina su Java principu „nepriklausanti nuo kompiuterio

    architektūros“).

    6) Java neleidžia turėti metodų su kintamu parametrų sąrašu. Tai nesiderina su

    principu „griežtai tipizuota“, kadangi neįmanoma patikrinti busimųjų tipų.

    Tačiau tai leidžia metodų perkrovimo galimybė (metodų vardai vienodi,

    bet skiriasi antraštės).

    7) Neturi enum, typedef ir #define. Tai atitinka static final tipas. 8) Neturi void parametrų sąraše.

    9) Java leidžia aprašyti kintamuosius bet kurioje kodo vietoje (C++ taip pat).

    10) Java neturi globaliųjų kintamųjų (panašiai kaip static tipo kintamasis,

    galiojantis visiems tos klasės objektams).

    11) Neturi daugialypio paveldėjimo (C++ tai turi). Iš dalies tai pasiekiama

    interfeisais.

    12) Automatiškai atlaisvina nebenaudojamą atmintį (šiukšlių rinktuvas -

    Garbage Collection). Šis šiukšlių rinktuvas kartkarčiais kviečiamas

    automatiškai, tačiau programuotojas gali jį išsikviesti ir pats: 9

     System.gc();

    Objektų saugyklos

    Pagrindinės informacijos saugyklos yra:

    1. Registrai. Jie yra procesoriaus viduje, todėl tai pats sparčiausias išrinkimo

    tipas. Deja, registrų skaičius labai ribotas. Jais pagal poreikius manipuliuoja

    tik pats kompiliatorius.

    2. Stekas. Yra RAM‟e (tiesioginės kreipties atmintyje). Procesorius saugo

    nuorodą į šį steką, ir, vaikštant „aukštyn“/„žemyn“, informacija įrašoma ir

    paimama. Gana greitas būdas (antras po registrų). Šiaip jau Java pačių objektų

    steke nesaugo, nes reikėtų nuolat perskaičiuoti objektų dydžius, perstumiant

    steko nuorodą „aukštyn“/„žemyn“. C++ tai galima.

    3. Krūva (heap - „netvarkusis masyvas“). Yra RAM‟e. Tai ir yra ta vieta, kur

    saugomi visi Java programos objektai. Pagrindinis privalumas tas, kad

    kompiliatoriui nereikia žinoti kiek kiekvienas objektas užima vietos. Su new

    sakiniu sukurtas objektas vykdymo metu automatiškai pateks į „krūvą“. Aišku,

    operacijos sulėtės.

    4. Statinė atmintis. Ji taip pat yra RAM‟e, tik specialiai tam skirtoje vietoje.

    „Krūvoje“ esantys tuo momentu nebereikalingi objektai gali būti šiukšlių

    rinktuvo automatiškai pašalinti, o statiniai objektų elementai išlieka iki

    programos darbo pabaigos. Tokie elementai sukuriami naudojant atributą

    static.

    Paprastieji tipai. Vis dėlto elementariems aritmetiniems veiksmams

    paspartinti Java turi ir paprastų duomenų tipų (byte, int, double, ...). Tai nėra

    objektai, todėl jiems sukurti nereikia new sakinio. Jų įvedimo priežastis ta, kad

    tokiems elementariems objektams sukurti ir padėti į „krūvą“ būtų sugaištama per

    daug laiko. Paprastųjų tipų kintamieji saugomi steke.

    ?Kiekvienam procesui Java turi atskirą steką. Nepriklausymas nuo asmeninio kompiuterio (PC) architektūros

    Daugumos programavimo kalbų galutinis produktas yra vykdomasis (.exe

    tipo) modulis, susidedantis iš konkrečių instrukcijų PC procesoriui. Tačiau

    Windows sistemos dažniausiai naudoja Intel firmos procesorius, Macintosh sistema naudoja Motorola arba PowerPC procesorius ir t. t. Be to, kiekviena

    sistema (Windows,Unix, Linux) naudoja savas papildomas bibliotekas. Todėl klasikinė schema

    Kodas?Kompiliatorius?Redaktorius?vykdomasis failas (*.exe)?PC

    turi vieną gana didelį trūkumą – vienos sistemos produktas dažnai neveikia kitoje

    sistemoje.

    Šio trūkumo neturi programa, parašyta Java kalba. Esmė ta, kad čia 10 negeneruojamos instrukcijos procesoriui, bet programos tekstas (kodas) kompiliuojamas į specialų objektinį kodą, vadinamą baitkodu. Šį kodą toliau skaito

     Kodas ? Kompiliatorius ? bait-kodas ? JVM

    ir vykdo Java abstrakti virtualioji mašina (JVM), kurią turi kiekviena kompiuterinė

    sistema. Taigi turime tokią schemą: Java abstrakti virtualioji mašina JVM

    JVM tai speciali Sun Microsystems firmos programa (baitkodo

    interpretatorius), parašyta kiekvienai operacinei sistemai atskirai. Tai JRE (Java Runtime Environment). Ji itraukta į populiariausių naršyklių sudėtį (Microsoft

    Internet Explorer, Netscape Navigator, Opera), į JDK (Java Development Kit ). Ją

    galima įdiegti ir atskirai.

    JVM jau gaminama ir atskiromis mikroshemomis. Taigi ją galima įdėti ne tik į PC, bet ir į TV stotis, o ateityje ir į buitinius prietaisus.

    Daugiagijė

    Programa tuo pat metu gali vykdyti keletą gijų (thread). Tai yra organizuota

    objektų lygmeniu – kiekviena gija yra atskiras objektas. Panaudojant synchronized modifikatorių resursai „užrakinami” (būtų blogai, jei kelios gijos vienu metu rašytų

    informaciją į tą patį failą).

    Programų saugumas

    Saugumas užtikrinamas keliais lygiais. Tai ypač svarbu apletams

    (specialaus tipo taikomoji programa), nes jie plačiai naudojami interneto puslapiuose. Tam yra net speciali klasė java.lang.SecurityManager su eile metodų.

    Programinis lygis:

    - kadangi nėra adresų aritmetikos, tai neįmanoma programiškai sugadinti

    atminties;

    - neįmanoma perpildyti masyvo;

    - negalima ne tik rašyti, bet ir skaityti informacijos už masyvo ir eilutės

    ribų (todėl Java kalboje eilutė String nemodifikuojama).

    Baitkodo tikrintojas patikrina:

    - ar neperpildytas stekas;

    - ar su objektais neatliekamos draudžiamos operacijos;

    - ar tinkamai naudojami registrai;

    - ar teisingai keičiami kintamųjų tipai.

    „Smėlio dėžės“ principas apletui: „įtartina“ (neturinti skaitmeninio parašo)

     programa kaip vaikas įkeliama į smėlio dėžę ir negali :

    - skaityti/rašyti failo iš/į jūsų (kliento) PC;

    - išmesti, pervardyti, kurti naujų failų ir t. t. kliento PC.

    Vykdant apletą ne per tinklą, bet vietinėje failų sistemoje, didesnė dalis šių

    apribojimų netaikoma. Dar didesnes teises turi apletų paleidimo programa

    appletviewer.exe.

     11

Situacijų valdymas (exception)

     Nepageidautina situacija (klaida) tai Java objektas, kuris sužadinamas klaidos vietoje ir vėliau gali būti „pagautas“ ir apdorotas programoje. Taigi

    susidarius nepageidaujamai situacijai, pavyzdžiui, kai indeksas yra už masyvo ribų,

    galima ją „sugauti“, apdoroti ir tolesnius veiksmus jau nukreipti norima linkme. Tai nėra tas pats kaip tokių situacijų „gaudymas“ naudojantis grąžinamomis

    reikšmėmis ar papildomais požymiais-kintamaisiais, kai galima tiesiog patingėti tai

    atlikti (arba blogai atlikti). Privalumas tas, kad kai kurių situacijų Java praleisti

    neleis jas privalu kur nors apdoroti.

    1.2. Objektinis programavimas Java kalba

    Dar pačiai pirmajai objektinio programavimo kalbai Smalltalk Alan Kay suformulavo šiuos penkis objektinio programavimo (OP) principus:

    1. Viskas yra objektas. Objektas ir saugo duomenis, ir atlieka operacijas su

    jais (duomenų ir metodų sujungimas į visumą).

    2. Programa tai grupė objektų, bendraujančių pranešimais (pranešimu

    galima laikyti ir objekto metodo iškvietimą).

    3. Kiekvienas objektas turi savąją atmintį, susidedančią iš kitų objektų

    (kompozicija objekto viduje naudojami prieš tai sukurti objektai).

    4. Kiekvienas objektas yra kurio nors tipo (klasės).

    5. Tam tikros grupės objektai gali priimti tuos pačius pranešimus

    (paveldėjimas).

    Taigi pačiais paprasčiausiais žodžiais tariant, Ojektas

    - yra programinis komponentas, modeliuojantis realaus pasaulio

    elementus:

     žmogus, gyvūnas, augalas, mašina, parduotuvė ir t. t.;

    - turi atributus (objekto kintamuosius):

     dydį, formą, spalvą, svorį, greitį ir t. t.;

    - turi elgseną ir manieras (objekto metodus):

     verkia, šliaužia, važiuoja, pasipildo prekėmis ir t. t.

    Pabandykime perfrazuoti šiuos OP principus Java kalbos požiūriu. Duomenų ir metodų sujungimas į visumą (encapsulation)

    Duomenų ir jų apdorojimo metodų sujungimas į visumą Java kalboje

    atliekamas naudojant klasę. Taigi klasė yra tipas arba objekto šablonas, kurį sudaro

    duomenys ir metodai. Objektas jau yra realus klasės egzempliorius kompiuterio

    atmintyje. Objekto modelį galime pavaizduoti kaip kapsulę:

     12

    Metodas1

    Duomenys Metodas2 MetodasN

    . . .

    class A {

     // klasės turinys Taigi sudarius A klasę, joks realus objektas atmintyje dar nesukuriamas: }

    Objekto dar nėra ir paskelbus A klasės tipo kintamąjį x:

    A x;

    Objektas gali būt sukurtas ir sakiniu new:

    x = new A(); //Objektas sukurtas!

    // arba iš karto:

    A x = new A();

     Taigi objektas sukuriamas dinamiškai programos vykdymo metu sakiniu new:

    KlasėsVardas objektoVardas = new KlasėsVardas();

    Arba dviem etapais :

    KlasėsVardas objektoVardas;

    ObjektoVardas = new KlasėsVardas();

    Klasei galima sukurti neribotą skaičių objektų.

    Grįžkime prie kapsulės. Jis turi būti uždaras. Pirma, tai užtikrina duomenų

    apsaugą, nes vartotojas gali atlikti su duomenimis tik tas operacijas, kurias jam

    leidžia tam skirti metodai. Antra, programuotojas-vartotojas gali rašyti programas „aukštesniu“ lygiu, t. y. jis visiškai pasitiki esamais metodais ir jam nebereikia

    leistis į smulkmenas ir jų tikrinti. Ir trečia, programų (metodų) pakeitimai ir

    atnaujinimai programuotojui-vartotojui visai neturi reikšmės. Paveldėjimas (inheritance) ir kompozicija

    Tai klasės sugebėjimas paveldėti protėvių klasės duomenis ir metodus.

    Literatūroje vartojama daug skirtingų terminų. Pagrindinė klasė vadinama

    paveldimąja klase, superklase, protėvių klase, bazine arbs tėvo klase. Analogiškai

    naujoji klasė vadinama paveldinčiąja klase, subklase, palikuonių klase, išvestine

    arba vaiko klase. Mes vartosime terminus tėvo klasė ir vaiko klasė.

    Taigi vaiko klasė paveldi visus matomus (ne private tipo) tėvo klasės metodus ir kintamuosius. Visos Java klasės yra kilusios iš java.lang.Object klasės

     13

    ir automatiškai palaiko visus jos metodus. Java neturi daugialypio paveldėjimo

    (netiesiogiai tai galima išspręsti naudojant interfeisus).

    Nereikia painioti sąvokų „kompozicija“ ir „paveldėjimas“. Kompozicija

    tai kitos klasės objekto panaudojimas naujai projektuojamoje klasėje. Kompozicija

    naudojama tada, kai kuriama nauja klasė tiesiog naudoja kitos klasės metodus.

    Paveldėjimas naudojamas tada, kai nauja klasė naudoja kitos klasės struktūra

    (interfeisą).

    Plačiau apie paveldėjimą aprašoma ketvirtame skyriuje. Polimorfizmas (polymorphism)

    Galime skirti dvi polimorfizmo rūšis. Tai metodų perkrova ir metodų

    užklotis.

    Metodų perkrova (overloading). Klasėje naudojama keletas metodų tuo

    pačiu vardu. Būtina sąlyga – metodai turi skirtis savo antraštėmis (parametrų

    skaičiumi arba parametrų tipais). Grąžinamos reikšmės tipas čia įtakos neturi.

    Metodo pasirinkimą nusako jo iškvietimo formatas. Tai atliekama jau

    kompiliavimo metu (tai dar vadinama „ankstyvuoju susiejimu“).

    Plačiau apie metodų perkrovą rašoma 3.5. skyrelyje „Metodų perkrova“.

    Metodų užklotis (overriding). Tėvo ir vaiko klasės turi vienodus metodus.

    Būtinos sąlygos: turi sutapti ne tik šių metodų vardai, bet ir jų antraštes bei

    grąžinamų reikšmių tipai. Taigi vaiko klasės metodas gali pakeisti (užkloti) tėvo

    klasės metodą.

    Metodo pasirinkimą lemia objekto, kuriam šis metodas kviečiamas, tipas

    (jei objektas yra tėvo klasės tipo, tai bus kviečiamas jos metodas, priešingu atveju

     vaiko).

    Metodas parenkamas vykdymo metu (tai dar vadinama „susiejimu

    vykdant).

    Plačiau apie metodų užklotį rašoma 4.2. skyrelyje “Metodų užklotis. 1.3. Trys Java programų tipai

    Pirmas. Taikomoji programa (application) su komandų eilutės sąsaja

    Tai pats paprasčiausias ir kartu nevaizdžiausias programos tipas. Programa

    paleidžiama main metodu. Taigi bent viena programos klasė turi main metodą. Šiaip jau kiekviena klasė gali turėti po vieną main metodą (tai patogu testuojant

    klases), tačiau tuo pačiu metu galima naudoti tiktai vieną main metodą. Pasibaigus visiems main metodo sakiniams, programa baigia darbą.

    Parašykime tradicinę pirmąją Java programėlę, kuri juodame Command Prompt (arba FAR Manager) lange išveda tekstą „Labas, Java“. 14

    ETAPAI: // Pirmoji Java programa 1. Bet kuriuo redaktoriumi (kad ir NotePad) parašome pirmosios programos public class Labas { tekstą (visi Java kalbos žodžiai pajuodinti): public static void main(String args[]) {

     System.out.println("Labas, Java");

     }

    }

    ir įrašome į diską vardu „KlasėsVardas.java“ (šiuo atveju vardu

    Labas.java“).

    2. Kviečiame kompiliatorių javac.exe, kuris patikrina programos sintaksę,

    perkoduoja jos tekstą į baitkodą ir įrašo jį į diską vardu

    KlasėsVardas.class” (šiuo atveju vardu „Labas.class”):

    >javac Labas.java

    P.S. Jei jūsų kompiuteryje nėra nustatyto kelio į katalogą, kur yra

    kompiliatorius javac.exe, tai reikia nurodyti visą kelią iki jo. Pvz.:

    >D:\jdk1.3\bin\javac Labas.java

    Jei nėra klaidų, tai kompiliatorius paprastai jokių pranešimų ir neišveda.

    Taip po kompiliacijos atrodo Far Manager langas (šiuo atveju failas

    Labas.java įrašytas į katalogą D:\Java\Pavyzdziai\labas):

    3. Kviečiama JVM java.exe vykdyti programą (failo tipas class nenurodomas):

    >java Labas

     15

    ?Vykdytojui nurodyti tik klasės vardą gali ir nepakakti – dar reikia parametru cp nurodyti visą kelią iki class failų (detaliau apie tai kalbama 10

    skyriuje „Paketai“):

    >java cp D:\Java\Pavyzdziai\labas Labas

    Naudojant vizualias aplinkas (JBuilder, Visual Studio J++, VisualCafe ar kitas), vykdymo scenarijus keičiasi.

    Pabandykite patys paleisti truputį modifikuotą pirmąją programą:

    // Pirmoji Java programa-modifikuota

    public class Labas {

     public static void main(String args[ ]) {

     int x = 2 + 2;

     System.out.println("Du plius du lygu " + x);

     System.out.println("\"Pabaiga\" \\kabu\ntese\\");

     }

    }

    Antrojoje išvedimo eilutėje panaudotas papildomas simbolis „\‟ kabutei ir pasvirusiam brūkšneliui išvesti bei perkelti į kitą eilutę. Todėl rezultatas bus toks:

    Du plius du lygu 4 "Pabaiga" \kabu tese\

    Antras. Taikomoji programa su vartotojo sąsaja

    Programa čia taip pat paleidžiama main metodu. Tačiau paleidimo tikslas

    dažniausiai yra tik vienas – sukurti vartotojo sąsajos langą ir perduoti jam visą

    valdymą. Toliau jau sąsajos elementais (meniu, mygtukais, teksto laukais ir t. t.) atliekami norimi veiksmai ir programa veiks tol, kol uždarysime šios sąsajos langą.

    Vėlgi parašykime tą pačią programą, išvedančią tekstą „Labas, Java“. 16 Programos rašymo ir paleidimo scenarijus visiškai toks pat kaip ir pirmojo tipo programos. Tiesa, programos tekstas atrodys truputėlį kitoks:

// Pirmoji Java programa su vartotojo sąsaja.

    import javax.swing.*;

    import java.awt.*; public class LabasSuSasaja extends JFrame {

     public void paint(Graphics g) {

     g.drawString("Labas, Java", 50, 60);

     }

     public static void main(String[] args) {

     LabasSuSasaja langas = new LabasSuSasaja();

     langas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

     langas.setSize(200, 100);

     langas.setTitle("Programa su sasaja");

     langas.setVisible(true);

     }

    }

    Vėl kompiliuojame ir vykdome programą:

     >D:\jdk1.3\bin\javac LabasSuSasaja.java

     >java LabasSuSasaja

    Tačiau dabar ekrane pamatysime tokį vaizdą:

    Suprantama, niekas nedraudžia naudoti ir maišytą variantą – taikomoji programa su komandų eilutės sąsaja plius vartotojo sąsajos elementai. Parašykime

    mažutę programą, kuri skaičiuotų dviejų įvedamų skaičių sumą, panaudodama specialią Java dialogų klasę JOptionPane.

    // Komandų eilutės sąsaja ir JOptionPane elementai javax.swing.JOptionPane;

    public class Labas {

     public static void main(String args[]) {

     String pirmas =

     JOptionPane.showInputDialog("Pirma reiksme");

     String antras =

     JOptionPane.showInputDialog("Antra reiksme");

     int skaicius1 = Integer.parseInt(pirmas);

     int skaicius2 = Integer.parseInt(antras);

     JOptionPane.showMessageDialog( null,

     17

     "Dvieju skaiciu suma " + (skaicius1 + skaicius2),

     "Rezultatas", JOptionPane.PLAIN_MESSAGE );

     System.exit(0); // pabaiga, naudojant grafinę sąsają

     }

    }

    Programos darbo metu pasirodys trys dialogai du skaičiams įvesti, o

    trečias rezultatui parodyti (įvedę kiekvieną skaičių paspauskite OK mygtuką):

    Tai nėra tobula programa, nes neturi įvedamų duomenų kontrolės. Todėl bet

    koks ne sveikojo skaičiaus įvedimas baigsis programos mirtimi (apie korektiškų

    programų rašymą kalbėsime 5 skyriuje „Situacijų valdymas“). Trečias. Apletas (applet)

    Apletas tai programa, klaidžiojanti internete ir vykdoma „kliento”

    kompiuteryje. Ji nenaudoja main metodo. Tačiau kaip ir taikomojoje programoje

    su vartotojo sąsaja, apleto vykdymas paremtas įvykių apdorojimu. Kadangi naršyklė savo viduje turi JVM, tai ji pati ir vykdo šį apletą. Naršyklė pati rūpinasi apleto veikimu: stabdo jį pereinant į kitą langą, perpiešia keičiant lango dydį ir t. t.

    Parašykime tą pačią tradicinę programą, bet jau kaip apletą. ETAPAI: 18 1. Naudodamiesi bet kuriuo redaktoriumi parašome programos-apleto tekstą:

Report this document

For any questions or suggestions please email
cust-service@docsford.com