Java ajalugu
        Java ajalugu ulatub aastasse 1990, kui teda hakati firma Sun poolt välja töötama. Eesmärgiks oli luua vahend, mille abil saaks töötada paljud uued erinevad protsessorid nii magnetofonides, telefoniaparaatides kui mujal. Seni tuli iga uue protsessoritüübi puhul luua tema jaoks eraldi programmid. Ainult vahel õnnestus teise protsessori programmi emuleerida. Kuna protsessoritel ning nende programmidel olid sageli sees vaid temale spetsiifilised käsud, siis tekkis nende käskude ülekandmisel raskusi. Sooviti luua lihtne baitkood, mida oleks lihtne üle kanda. Nii saaks üldkasutatavaid programme nagu näiteks aja väljastamist kasutada muutmata kujul kõikjal ning vaid masinaspetsiifilised käsud tuleks eraldi luua. Näiteks kerimine magnetofonil ning vee välja laskmine pesumasinal. 
        Kuigi uut baitkoodi on võimalik kirjutada otse või kompileerida vajalike lihtsustuste ja laiendustega selleks teistes kõrgkeeles kirjutatud programme, otsustati luua omaette programmeerimiskeel, mille abil oleks lithsam kasutada uusi võimalusi. Kuna uus keel ei pea ühilduma eelnevatega, siis saab kõrvale jätta aja jooksul ebaotstarbekaks või veaohtlikuks osutunud kohad. Java on suure osa põhikonstruktsioone üle võtnud keelelt C, mistõttu selle keelega tutvunutele võivad Java programmilõigud esialgu tuttavamad tunduda.   

Töökiirus
 Ka näiteks Basicu või Perli programmi saab lasta tõlkida mitme operatsioonisüsteemi intepretaatoril, kuid Javast on nad märgatavalt aeglasemad, sest korralikult optimiseeritud baitkoodi on vastava masina käsustikuks tõlkida kiirem kui programmeerija kirjutatud teksti. Sellegipoolest on Java programm erinevates olukordades ja hinnagutel 20% kuni 20 korda aeglasem Pascalis või C-s kirjutatud ja vastava operatsioonisüsteemi jaoks kompileeritud programmist. Märgatava aja võtab intepretaatori käivitamine, samuti võib lihtsate käskude tõlkimine enam aega võtta kui nende täitmine. Samas aga kasutaja õnneks toimuvad aeganõudvad operatsioonid sageli ajal, kui arvuti muidu nagunii kasutajapoolset teadet (näiteks klahvivajutust) ootaks. Viimistletud tervikoperatsioonid, mille taga kasutaja sageli ootama peab, näiteks akna avamine, võtavad Javas ainult natukene rohkem aega kui operatsioonisüsteemispetsiifilistes programmides. Lisaks on loodud vahend, mis käivitamise ajal kompileerib Java baitkoodi ümber masinkoodiks ning sel juhul töökiiruses enam tõlkimisest tingitud vahet ei tohiks olla.   
       Suur osa Java programme aeglustavatest põhjustest oleksid vajalikud muus keeles korralikult kirjutatavasse programmi nagunii sisse kirjutada. Java kompilaator paneb nad lihtsalt automaatselt sisse. Nii tuleb ka muidu kontrollida, et kasutaja sisestatud andmed sobiksid, et programmi kood on õigesti sisse loetud, et mittevajalikud andmed enam mälu ei raiskaks, et programm operatsioonisüsteemile liiga ei teeks.  Muidu saab näiteks mälu vabastamise mõnikord välja jätta, lootuses, et ka koos "surnud" andmetega ei ületata programmile eraldatud mälu mahtu ning lastes selle võrra kiiremini töötada, kuid Java kontrollib ikka üle, et kusagil midagi "ripakile" pole jäänud. Samuti vaadatakse igal massiivi poole pöördumisel üle, et vastava järjenumbriga element ikka massiivi kuulub.   

Java ja C
        Nagu eespool kirjas, võttis Java suure osa põhikonstruktsioone üle keelelt C, jättes samas kasutamata vahendid, milleta läbi saab ja mis kirjutamise keerulisemaks või veaohtlikumaks teevad. Välja jäeti "null terminated string", mille vääral kasutamisel võis valedesse mälupiirkondadesse sattuda. Ka pole Javas viita mäluaadressile. Siin pole üldse standardvahenditega võimalik otse masina mäluga tegelda, mis välistab suures osas võimaluse masinale või teistele programmidele kurja teha. Osuti isendile aga annab paljus samad võimalused mis viit. Vaid mäluaadressi asemel on objekti number tabelis. Klassid on nii kirjetüüpide kui objektitüüpide eest. Lihtsalt  meetodeid võib kasutaja sinna soovi korral lisada või mitte.          	Võrguprogrammeerimine pole Java eriomadus, kuid juba tema loomisel on arvestatud võimaluse ja vajadusega luua arvutivõrgus töötavaid programme. Ta abil saab luua nii serveri- kui kliendiprogramme. Saab luua näiteks www serveri  brauseritele HTML-lehekülgede saatmiseks kui ka mitme paralleelkasutajatega andmebaasi, jututoa või üle võrgu mängitava mängu. 
         Iseseisvalt arvutis jooksvad programmid suudavad kasutajale pakkuda pea samasuguseid võimalusi nagu igas muus keeles kirjutatud programmid. Vaid masinaomaste käskude puhul tuleb need mõnes muus keeles luua ning Java programmist siis käima tõmmata. Tavakasutaja jaoks aga, kel pole tarvis kõvaketast formaatida ega masinas mälu ümber jagada, peaks Java võimalustest täiesti piisama. 
 	Rakendid on mõeldud käivitamiseks teise programmi (näiteks brauseri) sees ning temal on peal turvapiirangud. Rakendeid võib näiteks lasta sirvijal julgelt Internetist kohale laadida ja käivitada, ilma et peaks muretsema, et see kuidagi kohalikule masinale kahju saaks teha. 

Keele maht ja areng
        Kuna tegemist on suhteliselt uue programmerimiskeelega, siis tema võimalusi täiendatakse pidevalt ja märgatavalt. Algselt 1995.a. paiku avaldatud versioonis oli kuus paketti klasse arvutamiseks, süsteemiga suhtlemiseks ja ekraanil kujutamiseks. Pideva täiendamise tõttu on ettevalmistatud võimaluste arv viie aastaga vähemalt kümnekordistunud andmebaasiühenduse, komponenttehnoloogia, turvavahendite ning laiendatud graafika- ja muusika võimaluste abil, kuid keele kallal töötatakse edasi. Pidevalt kasvades ja arenedes on keelel muidugi oht paisuda suureks ja raskesti haaratavaks, nagu juhtus juhtivaks programmeerimiskeeleks pürginud PL/1 ga ning praegugi on valmis meetodeid ligi kakskümmend tuhat. Kuid nii nagu on igas keeles mõnisada tuhat sõna ja hädapärased jutud suudame ajada vähem kui tuhande sõnaga, ei tasu ka programmeerimiskeele puhul lasta end heidutada suurtest sõnade hulgast ning lihtsamate programmide juures suudame hakkama saada mõne klassi ning mõneteistkümne meetodiga. Kui üldpõhimõtted on selged, saab üksikuid käsklusi alati manuaalist juurde vaadata.  

Näide
        Keele näiteks järgnevalt üks väike veebilehele paigutatava rakendi
kood. 

import java.awt.Graphics;
import java.awt.Color;
import java.applet.Applet;

public class Tervitus extends Applet{
 public void paint(Graphics ekraan){
   ekraan.drawString("Tere!", 60, 30);
   ekraan.setColor(Color.green);
   ekraan.drawRect(50, 20, 60, 20);
 }
}

Seletus
        Käsk import ütleb programmile, kus asub vastav klass, et programm leiaks ta kasutamise ajal üles. Lause import java.awt.Color tähendab lihtsalt, et klass nimega Color asub paketis java.awt ning programm teab teda siis vajaduse korral sealt otsida. See on sarnane Pascali uses-fraasile, kus koodi algusesse "uses graph" kirjutamine lubas joonistamisprotseduure kasutada. Pascalis lihtsalt oli kümmekond moodulit igaühes mõnekümne alamprogrammiga, Java standardpakett sisaldab praegu ligi tuhat klassi, igaühes paarkümmend meetodit. Nendes orienteerumine aga polegi lootusetu, sest klassid on jaotatud teemade järgi pakettidesse. Neid on standardis kokku praegu umbes 50. Paketis java.awt on näiteks joonistamise ja graafiliste komponentidega (nupud, aknad) seotud klassid.  
        Rida "public class Tervitus extends Applet" tähendab, et klass nimega Tervitus on klassi Applet (rakend) järglane ning teda saab kõikjalt kasutada (public). Pärimisest pikemalt klasside, isendite ja liideste juures, kuid lihtsalt öeldes tähendab eelmine lause seda, et klass Tervitus sisaldab kõike, mis klass Applet, lisaks sellele veel need meetodid, mis on temas juurde või u"le defineeritud. Javas on käsusulgudeks loogelised sulud {} nagu Pascalis begin ja end. Sulge võib teineteise sisse paigutada. Siin näites on klassi Tervitus sulgude sees meetodi paint sulud.
         Siinses klassis Tervitus on võrreldes klassiga Applet muudetud vaid üks meetod nimega paint. Selle meetodi kutsub rakendikäitur (veebilehel brauser) välja siis, kui pilti on vaja üle joonistada. Näiteks juhul, kui ta tuleb teise akna alt välja. Teiste sõnadega saadab rakendikäitur rakendile ülejoonistamisteate. Meetod paint tahab oma parameetriks saada klassi Graphics (või selle järglase) isendit. Rakendikäitur saadab sellele meetodile sellise isendi, kes on võimeline ekraanile joonistama.          Saabuvale Graphics klassi isendile panen nimeks ekraan. Meetodisisene on programmeerija vabal valikul, rakendikäiturile on tähtis vaid, et tüüp oleks sobiv. "ekraan.drawString("Tere!", 60, 30)" joonistab koordinaatidele 60, 30 alates rakendi vasakust ülemisest nurgast sõne Tere!. Isendi või klassi nime ning meetodi nime vahele pannakse punkt, mis näitab, et meetod kuulub tema juurde. Seejärel muudan ekraani joonistusvärvi roheliseks (ekraan.setColor(Color.green)) ning joonistan tekstile ümber ristküliku. Ristküliku esimesed kaks koordinaati tähistavad tema vasaku ülemise nurga asukohta ning järgmised kaks külgede pikkusi. Sama kehtib ka täidetud ristküliku ning ovaali (ringi) kohta. 
         Et saaks loodud programmi töö tulemusi näha, selleks tuleb ta  java baitkoodiks kompileerida ning siis java intepretaatorit sisaldava rakendikäituriga vaadata. Standartse java kompilaatori programmi nimi on javac ning klassi Tervitus kompileerimiseks tuleb kirjutada javac Tervitus.java . Kui Pascali kompilaator tegi sellise baidijada (.exe faili), mida sai masinas kohe käivitada, siis java koodi meie masinad otse käivitada ei suuda, temal peab vahel olema intepretaatoriks nimetatav lisaprogramm, mis java platvormi käsud nt. Windowsi operatsioonisüsteemile mõistetavaks tõlgib. Unixi süsteemile sobib sama baitkood, kuid tema jaoks on eraldi intepretaator. Selline kahekordne tõlkimine nõuab enam aega, kuid võimaldab sama programmi lasta tööle erinevatel operatsioonisüsteemidel. 

Süntaks

Sissejuhatus

        Objektorienteeritud Java keeles peab kogu kirjutatav kood olema  meetodis (ehk funktsioonis), mis omakorda kuulub mingi objektitüüpi ehk klassi koosseisu. Lihtsas programmis saab läbi ühe meetodi ning klassiga, kuid  vähegi suuremas programmis on sageli otstarbekas iseseisvad osad eraldi  kirjutada. Mõnikord see küll suurendab veidi töövaeva, kuid väiksemaid lõike on lihtsam kontrollida ning tulemus on töökindlam ja vajadusel kergemini täiendatav.  
       Lihtsaimale java-programmile:

public class Tervitus{
  public static void main(String argumendid[]){
    System.out.println("Tere");
  }
}  

vastaks pascali-programm

begin
 writeln('Tere');
end.                                                                

        Nagu näha, kulub alustamise ja lihtsa väljundi jaoks märgatavalt enam ruumi. Ka mõnes muus kohas võib java kood pascali omast märgatavalt enam ruumi võtta ning lisaks sellele tundub kompilaator algul mitmes kohas tüütu tähenärijana, teatades kümnetest vigadest, mida sa oled sisse kirjutamise ajal teinud, kirjutades näiteks suure tähe asemele väikese või ajades muutuja deklareerimisel midagi segamini. Pascali programm oleks selle aja peale juba ammu tööle hakanud, kui java juures tuleb alles trükivigadega maadelda.  Juba pisut suuremate, nii paarileheküljeliste programmide juures annab tunda, et tähenärimisest on ka kasu. Liiatigi veel siis, kui tuleb hakata  kokku panema ammuunustatud ning vastvalminud programmilõike.  
Andmetüübid, tsüklid, valikud

        Muutujad, tsüklid ja valikud on Javas olemas nagu Pascalis või mõnes muuski programmeerimiskeeles. Tüüpiline täisarv on int, reaalarv double  ja sõne String. String on suure tähega, kuna ta on struktuurne andmetüüp,  muud on lihttüübid. Näide: 

public class Tyybid{
  public static void main(String argumendid[]){
    int rida=0, ridadearv;
    String ese="auto";
    ridadearv=5;
    while(rida<ridadearv){
      System.out.println(ese+"  nr "+rida);
      rida++;
    }
  }
}

Javas kirjutatakse kõik käsud meetodite sisse, kaasa arvatud põhiprogramm. Põhiprogrammi meetodi nimi on main ning ta saab parameetriks sõnemassiivi. Juhul, kui parameetrid puuduvad, on see massiiv tühi.          Muutuja tüüp kirjutatakse muutuja esmakordsel mainimisel tema ette. Täisarvu int piirid on veidi enam kui +-2 miljardit (Pascali integeri 30000 vastu) ning võtab ruumi 32 bitti(4 baiti). Reaalarv double kasutab 64 bitti. Sõne pikkus on piiratud peaaegu ainult arvuti mälumahuga. Sõne on struktuurne tüüp, klassi String isend. Kui lihttüüpide (int, double) puhul asub muutujale vastaval mäluväljal väärtus, siis struktuurtüübi puhul asub seal osuti isendile. Sõne puhul näiteks sõltub sõneisendile eraldatud mälu maht pikkusest, osuti suurus jääb ikka samaks. Lihttüüpe on keelde sisse ehitatud 8 ning neid ise juurde luua ei saa. Struktuurtüüpide aluseks olevaid klasse saab ise vajadusel luua.
          Nagu näha, töötab while-tsükkel Javas samuti nagu Pascalis, tsükli sisu korratakse senikaua, kuni tingimus on tõene. Väära tingimuse puhul ei täideta. for-tsükkel Javas sarnaneb while-tsüklile, vaid mugavuse pärast on algväärtustamise ja tsüklimuutuja muutmise osad toodud sulgude sisse.  Eelneva näite saaks for-tsükli abil kirjutada järgmiselt: 

int ridadearv=5, rida;
String ese="auto";
for(rida=0; rida<ridadearv; rida++){
   System.out.println(ese+"  nr "+rida);
}

        Esimene käsk (rida=0) täidetakse ainult üks kord tsüklisse sisenemisel. Iga korra algul kontrollitakse teisena asuvat tingimust (rida<ridadearv) ning kolmas käsk täidetakse pärast tsükli keha läbimist. Juhul, kui keha koosneb vaid ühest lausest, võib ka siin käsusulud ära jätta. Javas on käsusulgudeks loogelised sulud. 
         Täidetavad käsud on valmis olevate klasside meetodid. Näiteks  System.out.println(), mille abil saab ekraanile trükkida, on lahtiseletatult klassi System juurde kuuluva trükkimisvoo nimega out meetod println().
          Programmi saab hargnema panna if-valikuga, kus tingimuse järel olev valik täidetakse vaid juhul, kui tingimus on tõene. Soovi korral saab lisada ka else-osa vastasel juhul toimimiseks.  

Sõne

        Sõne hoidmiseks, uurimiseks ning nende võrdlemiseks kasutatakse
klassi String. 

public class Sone1{
  public static void main(String argumendid[]){
    String nimi="Juhan";
    System.out.println("Nimi="+nimi+" Pikkus="+nimi.length());
    System.out.println("h asub kohal "+nimi.indexOf("h")); 
    System.out.println("Teine ja kolmas täht on "+
                        nimi.substring(2, 4)+"\n"+
                        "Lugemine algab nullist");
    if(nimi.equals("Juhan"))
      System.out.println("Nimi on endiselt Juhan");
    else 
      System.out.println("Nimi pole Juhan"); 
  }
}

Meetodi käivitamiseks kirjutatakse objekti nime ning tema
meetodi vahele punkt.
Tähtsamad sõne juures kasutatavad meetodid:
 meetodi nimi                  väljastab
length()                     pikkuse
indexOf                      koha, kust alamsõne algas. Kui 
                               ei leidu, siis väljastab -1
equals                       tõeväärtusena (boolean tõene/väär), 
                               kas sõnede väärtused võrduvad
substring                    alamsõne. Kui meetodile antakse üks 
                               täisarvuline parameeter siis väljastatakse
                               alamsõne alates määratud kohast kuni lõpuni.
                               Kui antakse kaks parameetrit, siis esimene
                               näitab algust (kaasaarvatud) ning teine lõppu
                               (väljaarvatud).

Meetodite täpsemad ingliskeelsed kirjeldused leiab dokumentatsioonist.  

Arvutamine

        Tähtsamad matemaatikafunktsioonid asuvad klassis Math. Nagu mujalgi,
nii ka siin tuleb meetodi välja kutsumiseks määrata meetodi omanik
(siin klass Math) ning siis meetodi nimi. 

public class Arvutus1{
  public static void main(String argumendid[]){
    double x=Math.PI/6;
    double siinus=Math.sin(x);
    System.out.println("Nurk x="+x+" sin(x)="+siinus);
    System.out.println(" cos(x)="+Math.cos(x)+
                           " tan(x)="+Math.tan(x));
    x=Math.random();
    int a=(int)(5*Math.random());
    double kuup=Math.pow(x, 3);
    System.out.println("x="+x+" a="+a+" x^3="+kuup);
  }
}

Meetod Math.random() väljastab juhusliku reaalarvu nulli ja ühe vahelt.  Kui soovitakse täisarvulist juhuarvu, siis saab ühe võimalusena korrutada  saadud reaalarv arvuga, kui suures vahemikus tahetakse juhuarvu saada ning siis võtta täisosa, nagu siin näites on tehtud. Kui pascalis tuli  reaalarvust täisarvu saamiseks kasutada funktsiooni round, siis java  puhul on lubatud reaalarvu täisarvuks muutmiseks (ning ka mitmetel muudel juhtudel) kirjutada soovitav andmetüüp avaldise ette sulgudes.  Uus tüüp on vaja ette kirjutada juhul, kui tüübimuundamisega võib andmeid  kaduma minna. Näiteks 
   int n;
   n=(int)4.7;
annab muutuja n väärtuseks nelja. 
   n=4.7 
aga kutsub esile veateate.

Tüübimuundamine on enam tähtis objektide ja pärimise juures. 

Abiinfo
Java keele kasutamisel on abiks sõnastik ehk API spetsifikatsioon. Nagu (võõr)keele juures pole lootust kõiki sõnu ja väljendeid pähe õppida, nii pole ka programmeerimiskeele juures vaja sellega liigselt vaeva näha. Mis kulub pähe see kulub, kuid unustamise puhuks on alati manuaal olemas,  tuleb vaid osata seda kasutada. Kui 1995 aastal välja tulnud java-versioonis  olid ametlikud kuus paketti kümnete klasside ning tuhatkonna meetodiga, siis 1999. aasta keskpaigaks on SUN välja lasknud juba 50 paketti ligi tuhande klassi ning kahekümne tuhande meetodiga. Vaevalt nende loetelu võtab mitusada lehekülge, rääkimata lähematest kirjeldustest. Enamikus lühemates programmides saab läbi kuni kümne klassi ning saja meetodiga, kuid keerulilsemate olukordade puhul on võimalus varust omale sõnastikust abi otsida.  Hierarhia ja viidete abil on sealt täiesti lootust midagi leida. 
        Seletan siinkohal lahti manuaali seletused kahe meetodi kohta paketist java.lang.Math. Kopeeritult näevad nad välja järgmised:

 static double  log(double a) 
     Returns the natural logarithm (base e) of a double value.

 static double  max(double a, double b) 
             Returns the greater of two double values.

Esimese meetodi nimi on log ning ta saab omale parametriks double tüüpi
reaalarvu. (Et muutuja nimeks on a, see ei muuda kasutamisel midagi.) Meetod väljastab väärtuse samuti tüübist double. Static tähendab, et meetod kuulub klassi (mitte isendi) juurde. Sellest edaspidi.  Seletus juures teatab, et (meetod) tagastab naturaallogaritmi (alusel e) (parameetrina antud) double tüüpi väärtusest. Kasutada saab seda näiteks
double x=Math.log(3.5);
Siinkirjeldatud meetod max väljastab samuti topelttäpsusega reaalarvu (double), väljastades suurema etteantud parameetritest.  Klassi String isendimeetod (static puudub) väljastab sõne pikkuse täisarvuna. 
        int length() 
             Returns the length of this string.

Liht- ja struktuurandmetüübid. Massiivid. 

Lihttüübid 
byte    - 8-bitine täisarv vahemikus -128 kuni 127.
short   - 16-bitine täisarv  -32768 kuni 32767.
int     - 32-bitine täisarv  -2147483648 kuni 2147483647.    
long    - 64-bitine täisarv  -9223372036854775808 kuni
                                     9223372036854775807.
float   - 32-bitine reaalarv ligikaudses vahemikus -3,4x10^38 
                  kuni 3,4x10^38 seitsme tüvekohaga. 
double  - 64-bitine ujukomaarv (reaalarv) ligikaudses vahemikus 
            -1,7x10^308 kuni 1,7x10^308 15 tüvekohaga. 
char    - 16-bitine Unicode sümbol. Näit. 'a', '\n',
boolean - tõeväärtustüüp võimalike väärtustega true ja false. 

Need kaheksa on "lihtsad" andmetüübid ilma riugasteta. Kui sinna tüüpi muutujasse midagi kirjutada, siis pole karta, et temaga "iseenesest" midagi juhtuks. Neid saab kasutada sarnaselt, nagu muutujaid pascaliski.  Tüüpiliselt kasutatavaks täisarvuks on int ning reaalarvuks double.  Tüüp byte on ühebaidine nagu üks bait kettalgi. Tüüp char on javas  16-bitine (pascali 8 vastu) ning tal on üle 64 tuhande võimaliku väärtuse.  Enamik Euroopa keeli saab väikeste mööndustega 256 tähega hakkama,  mida 8 bitti pakuvad, kuid ka hieroglüüfe sisaldavate ja muid paljutäheliste keelte  edasiandmiseks on lihtsam kasutada igale sümbolile ühte tähte, siis  ei pea imenippe rakendama tähtede surumiseks sinna, kuhu need ei mahu. Tähed kirjutatakse ühekordsete ülakomade vahele nagu näiteks 'm'. "m" on kompilaatori jaoks juba enam mitte lihttüüp char, vaid struktuurne tüüp String. Enamasti ongi programmides lihtsam kasutada sõnet kui tähte. 
        Lihttüüpide nimed kirjutatakse väikese tähega, struktuurtüüpide  omad soovitatavalt suurega. Siis on kirjutamise käigus hea eristada, millega on tegu.  
Arvusüsteemid
        Täisarve saab lisaks kümnendsüsteemile kirjutada ka kaheksand- ja kuueteistkümnendsüsteemis.  Kaheksandsüsteemis arvule tuleb ette  kirjutada 0, kuueteistkümnendsüsteemis arvule 0x. Nii et 12, 014 ja  0xC on java kompilaatori jaoks üks ja seesama asi. Enamasti piisab kasu- tamisel kümnendsüsteemist, kuid pildi joonistamisel kaheksat värvi kasutades on hea pildi punkte masinale kaheksandsüsteemis ette kirjutada või mälust lugeda. 
        Täisarvud loeb kompilaator automaatselt olevaks tüübis int.  Kui soovime talle rõhutada, et tegu on nimelt tüübist short, siis tuleb tüübi nimi arvule sulgudes ette kirjutada nt. (short)12 . Sama lugu ka reaalarvudega, kus automaatselt arvab kompilaator punkti esinemise korral olevat tegemist kahekordse täpsusega ujukomaarvuga (double). Tüüpi long saab rõhutada, lisades arvu lõppu tähe l nt. 12345l ning float puhul võib lõppu  lisada tähe f. 
Sisend klaviatuurilt
	Klaviatuurilt saab sisestada vaid sõnena. Juhul kui meil on vaja  sisestatut intepreteerida mõne teise tüübina, siis tuleb tüüp vastavate meetodite abil muuta. Sõne püüab täisarvuliseks objektiks muuta klassi Integer meetod valueOf. Et objektist (kus on lisaks väärtusele ka meetodid) väärtust kätte saada, tuleb  käivitada ta meetod (ehk saata talle teade) intValue(). 

import java.io.*;
public class Sisse1{
  public static void main(String argumendid[]) throws Exception{
    int arv;
    double distants;
    String s;
    PrintWriter valja=new PrintWriter(System.out, true);
    BufferedReader sisse=new BufferedReader(
      new InputStreamReader(System.in)
    );
    valja.println("Osalejate arv:");
    s=sisse.readLine();
    arv=Integer.valueOf(s).intValue();
    valja.println("Vahemaa:");
    distants=Double.valueOf(sisse.readLine()).doubleValue();
    valja.println("Kokku läbiti "+arv*distants+" km");
  }
} 

Käsklus import java.io.* lubab kasutada paketti java.io kuuluvaid kõiki klasse. Siin programmis on neist kasutatud PrintWriter, BufferedReader ja InputStreamReader. InputStreamReader'it kasutatakse selles progammis sisendvoost System.in saabuva BufferedReader'ile "söödavaks muutmiseks". 

Massiiv
	Hulga ühetüübiliste andmete hoidmiseks ja kasutamiseks saab kasutada
massiive. 

---

public class Massiiv1{
  public static void main(String argumendid[]){
    int[] ruudud = new int[5];
    for(int i=0; i<5; i++){
      ruudud[i]=i*i;
    }
    System.out.println("Arvu 2 ruut on "+ruudud[2]);
  }
}

---

     Massiivi elemendid hakkavad lugema numbrist 0. Korraldus new int[5] loob viie- elemendilise täisarvumassiivi, mille esimeseks elemendiks on element järjenumbriga 0 ning viimase elemendi järjenumbriks on 4. Esimeses kümnes võib selline lähenemine paista harjumatuna, kuid alustades nullist, algab järgmine kümme arvust 10 (mitte 11). Tegemist on sama probleemiga, et kas uut aastatuhandet hakata lugema aastast 2000 või 2001. Java (ning ka C  ja mõnes muuski) keeles loetakse numbreid alates nullist nagu sündinud lapsel, kes saab aastaseks alles pärast ühe aasta möödumist sünnist.
	Massiivi elemendid võib ka massiivi loomisel algväärtustada.

public class Massiiv2{
  public static void main(String argumendid[]){
    String nimed[]={"Juku", "Kati", "Siim"};
    System.out.println("Nimekirja alguses on "+nimed[0]);
    System.out.println("Kogu nimekiri koosneb nimedest:");
    for(int nr=0; nr<nimed.length; nr++){
      System.out.println(nr+1+". "+nimed[nr]);
    }
  }
}    

	Massiivi juurde kuuluv väli length näitab massiivi elementide arvu. Siinses näites oli elementide arvuks kolm. Massiivi tunnus võib kirjeldamisel olla nii  muutuja tüübi kui nime taga. String nimed[] ning String[] nimed tähendavad sama.  Massiivid võivad olla ka mitmemõõtmelised. Niipalju, kui soovitakse mõõtmeid, niipalju tuleb ka sulupaare kirjutada. Näiteks 
   int tulemused[][]=new int[5][3]
loob kahemõõtmelise massiivi viie rea ja kolme veeruga. 

Kokkuvõte
        Sellel semestril käsitletakse Java keele kaudu objektorienteeritud programmeerimist ja võrguprogrammeerimise võimalusi. Java baitkood koosneb lihtsalt erinevatele protsessoritele tõlgitavatest käskudest ning vajab käivitamiseks intepretaatorit. Java programmeerimiskeele loomisel on võetud aluseks keel C (ja C++), püüdes sealsetest kogemustest õppides muuta Java keel kergemini õpitavaks ning vead programmi seest kergemini leitavaks. 
Programmi käskudeks on valmis olevate klasside meetodid.  Käskude jada moodustab meetodi, meetodid klassi. Programmi käivitamisel asutakse täitma meetodit nimega main. 
        While-tsükkel töötab nagu pascalis. Tsükli sisu täidetakse senikaua kui tingimus on tõene. For-tsüklis on lisatud koht eel- väärtustamiseks enne tsüklisse sisenemist ning tsüklimuutuja  väärtuse muutmiseks pärast tsükli sisu läbimist. Käsusulgudeks on loogelised sulud {}.
        If-valikut täidetakse juhul, kui tingimus on tõene. Vajadusel võib lisada ka else-osa. 
        Sõne pikkusel on piiriks vaid mälumaht. Ta on objekt erinevalt lihttüüpidena olevast täis- ning reaalarvust. Temalt saab küsida tema  omadusi (nt. pikkust, alamsõnet) meetodi käivitamise teel. 
        Põhilised arvutusoperatsioonid paiknevad klassis Math. Vanu
võimalusi meelde tuletada ning uusi leida saab API spetsifikatsioonist. 
Sisukord

Java ajalugu	1
Töökiirus	1
Java ja C	1
Keele maht ja areng	2
Näide	2
Seletus	2
Andmetüübid, tsüklid, valikud	3
Abiinfo	5
Liht- ja struktuurandmetüübid. Massiivid.	6
Lihttüübid	6
Arvusüsteemid	7
Sisend klaviatuurilt	7
Massiiv	8
Kokkuvõte	8
Sisukord	9