Poglavje 5
Podatkovni tipi in konstante

Java je strogo tipiziran programski jezik, kar pomeni, da moramo vsako spremenljivko pred uporabo deklarirati, oziroma, vsaki spremenljivki moramo določiti njen tip. Tako, na primer, z deklaracijo

 

  int i;

prevajalniku povemo, da bo i spremenljivka celoštevilskega tipa int.

5.1 Primitivni podatkovni tipi

Tip spremenljivke je bodisi referenca na objekt (o tem bomo več govorili v poglavju o objektnem programiranju) bodisi en od osmih primitivnih javanskih tipov.

Tip Pomen VelikostPrivzeta vrednost








char

znak 2 \u0000’




boolean

logični vrednosti

true /

false

1

false





byte

celo število 1 0




short

celo število 2 0




int

celo število 4 0




long

celo število 8 0L




float

realno število (enojna natančnost)4 0.0f




double

realno število (dvojna natančnost)8 0.0d




 

Velikost posameznega primitivnega podatkovnega tipa je natančno določena in ni odvisna niti od arhitekture niti od prevajalnika niti od izvajalnega okolja (JVM). Programer lahko zato vedno predpostavi, da bo program, ki uporablja enega od teh tipov, v vseh javanskih okoljih delal popolnoma enako. V zgornji tabeli je velikost posameznega tipa predstavljena v tretjem stolpcu, številka v njem predstavlja število bajtov (na primer, tip int je v javi predstavljen s 4 bajti oziroma z 32 biti).

Lokalne spremenljivke (t.j. spremenljivke, ki jih uporabljamo le znotraj neke metode) moramo pred uporabo obvezno inicializirati (določiti moramo začetno vrednost). Uporaba spremenljivk brez znane začetne vrednosti lahko povzroči težave pri delovanju programa (rezultati metod so v tem primeru nepredvidljivi), zato prevajalnik take uporabe ne dovoli. Ker koda

 

  int i; 
  i = i+1;

nima pravega smisla (kakšna pa je vrednost spremenljivke i, ki jo želimo povečati?) bo prevajalnik v takem primeru javil napako “variable k might not have been initialized” in programa ne bo prevedel.

V določenih primerih (na primer pri deklaraciji atributov pri objektnem programiranju) pa se začetna vrednost spremenljivke določi avtomatsko. V teh primerih se vrednost spremenljivke nastavi na 0, karkoli že 0 za tisti tip pomeni (na primer, 0 pri tipu boolean pomeni vrednost false). Natančne privzete vrednosti za posamezen primitivni tip so predstavljene v zgornji tabeli v zadnjem stolpcu.

5.1.1 Znakovni tip char

Tip char se v javi uporablja za shranjevanje znakov. Spremenljvka tipa char lahko hrani natanko en znak, na primer a, X, ali (presledek), ne more pa biti “prazna” (). Vsak znak je v javi predstavljen z dvema bajtoma (16 bitov), zato lahko v spremenljivki tipa char shranimo poljuben Unicode znak.

 

  char pi = \u03C0; //  Unicode znaka  pi

Znaki in števila so v računalniku med seboj močno povezani. Vsakemu znaku pripada eno število in obratno. Za pretvorbo med osnovniki znaki in števili java uporablja Unicode tabelo. Prvih 127 znakov v tej tabeli ustreza prvim 127 znakom ASCII tabele in sicer:

Povezava med števili in znaki je tako velika, da pri delu s števili in znaki lahko izmenično uporabljamo ene in druge, java pa pri tem sam poskrbi za pravilno pretvorbo. Z znaki lahko tudi računamo.

 

    char a = 65;  // a = A (ASCII tabela) 
 
    char b = A, c = D; 
    int i = c - b;  // i = 3 (’D - A = 3) 
 
    char p = ; 
    System.out.printf("ASCIIkodapresledkaje:%d", (int) p);

Znakovne konstante

Znakovne konstante lahko določimo z direktnim vpisom (znak = a), s pomočjo Unicode kode (char = \u####) ali s pomočjo t.i. ubežnih sekvenc – zaporedja dveh ali več znakov, ki imajo poseben pomen:

ZnakPomen ZnakPomen




\n prehod v novo vrstico\t tabulator
\b pomik nazaj \r pomik na zacetek vrstice
\f nova stran \a zvočni signal
\\ znak \ \? znak ?
\znak ’ \znak ”

 

   char a = A,        // znak A 
        b = \n,       // nova vrsta 
        c = \a,       // zvoncek 
        pi = \u03C0;  // Unicode znak pi

Izziv 5-I. o Napiši program, ki izpiše ASCII tabelo, kot prikazuje spodnja slika.

ASCII tabela. Kodo posameznega znaka izračunamo tako, da številko vrstice pomnožimo z 8 ter ji prištejemo številko stolpca; primer: znak ’1’ se nahaja v vrstici 6 in stolpcu 1, torej je njegova ASCII koda enaka 6 * 8 + 1 = 49.
            0   1   2   3   4   5   6   7  
         --------------------------------  
       4 |      !   "   #   $   %   &   ’  
       5 |  (   )   *   +   ,   -   .   /  
       6 |  0   1   2   3   4   5   6   7  
       7 |  8   9   :   ;   <   =   >   ?  
       8 |  @   A   B   C   D   E   F   G  
       9 |  H   I   J   K   L   M   N   O  
      10 |  P   Q   R   S   T   U   V   W  
      11 |  X   Y   Z   [   \   ]   ^   _  
      12 |  ‘   a   b   c   d   e   f   g  
      13 |  h   i   j   k   l   m   n   o  
      14 |  p   q   r   s   t   u   v   w  
      15 |  x   y   z   {   |   }   ~

 

5.1.2 Celoštevilski podatkovni tipi

Java pozna 4 celoštevilske podatkovne tipe, ki se med seboj razlikujejo po številu bajtov, ki jih zasedejo v pomnilniku in posledično po velikost števil, ki jih lahko hranijo. Število bajtov in obseg števil posameznega tipa je prikazan s spodnjo tabelo.  

TipBajtiObseg





byte 1 -128 127  





short 2 -32.768 +32.767 (32kb)





int 4 -2.147.483.648 +2.147.483.647 (2ib)





long 8 –9,223,372,036,854,775,808+9,223,372,036,854,775,807(9Eib)





Vsi javanksi celoštevilski tipi so predznačeni.

Številske konstante

Konstanto celoštevilskega tipa lahko podam v treh številskih sistemih: desetiškem, osmiškem in šesnajstiškem. Prve podajamo na običajen način (brez predpone, na primer takole: int x = 5;, druge in tretje pa s predponama 0x in 0b.

 

  int a= 45;             // a = 45 
  int b=-1;              // b = -1 
  int c=012;             // c = 10  (osmisko) 
  int d=0xFF;            // d = 255 (sestnajstisko)

5.1.3 Realni podatkovni tipi

Java pozna 2 podatkovna tipa za zapis decimalnih števil: float in double. Pri izbiri tipa se odločamo med požrešnostjo (float zasede dvakrat manj pomnilnika kot double) in natančnostjo (pri double java uporablja dvojno natančnost, kar v praksi pomeni, da bo rezultat načeloma bolj pravilen (na več decimalnih mest)).

Decimalne konstante

Decimalno konstanto podamo na običajen način s pomočjo decimalne pike ali pa s pomočjo znanstvenega zapisa (ang. scientific notation). V primeru spodaj spremenljivkama d1 in d2 priredimo isto vrednost - prvi na klasičen način, drugi v znanstvenem zapisu. Konstanta tipa float se konča z znakom f.

 

  double d1 = 123.4; 
  double d2 = 1.234e2; 
  float  f1 = 123.4f;

5.2 Nizi

Niz, ki je v javi predstavljen z razredom String, deklariramo in inicializiramo na enega od naslednjih načinov  

  String niz1 ="Tojenekniz"; 
 
  String niz2; 
  niz2 = "Danesjelepdan"; 
 
  String niz3 = new String("Tuditakogre");

Dolžino niza dobimo z metodo length()

 

  String a="POMLAD"; 
  int dolzina = a.length() ;       //   dolzina =  6

i-to črko pa s klicem metode charAt()  

  System.out.println(a.charAt(3));     // izpise L

Dva niza primerjamo z metodo equals().  

  String a = preberiIme(); // prebere ime in ga shrani v a 
 
  // NAROBE!                   // PRAVILNO!!! 
  if (a == "Lojze") ...        if (a.equals("Lojze"))  ...

Niza v Javi ne moremo spreminjati – metodo setCharAt() boste zato iskali zaman! Kadar delamo s spreminjajočim se nizom, uporabimo razred StringBuffer (glej naslednje poglavje).

Naloga 5-I. Napiši metodo palindrom(), ki preveri, ali je dani niz palindrom (t.j., ali se dani niz enako bere v obe smeri, ko na primer niz “cepec”).  

Nalogo najlažje rešimo tako, da primerjamo prvo in zadnjo črko, drugo in predzadnjo črko, tretjo in predpredzadnjo črko, .... Z drugimi (računalniškimi) besedami; z indeksom i se sprehodimo od 0 do polovice dolžine niza in primerjamo črki, ki sta i znakov oddaljeni od začetka in od konca niza. Če pri vseh primerjavah naletimo na ujemanje, je niz palindrom.

Rešitev naloge 5-I.: Preverjanje palindromov razno/Palindrom.java

 

Razred String ponuja obilo metod za delo z nizi, med drugim:

compareToIgnoreCase() (primerja dva niza in pri tem ignorira velikost črk) startsWith() (preveri, ali se niz začne z danim podnizom), endsWith() (preveri, ali se niz konča z danim podnizom), indexOf() (poišče prvo pojavitev črke ali podniza v nizu), lastIndexOf() (poišče zadnjo pojavitev črke ali podniza v nizu), substring() (vrne podniz), replace() (zamenja del niza z drugimi nizom), split() (razbije niz na dele), ... Podrobnosti o metodah naj bralec poišče na domači strani (Google: java String).

5.2.1 Razbitje nizov – metoda split

Niz, ki vsebuje več podatkov ločenih z nekim ločilom, na dele razbijemo s pomočjo metode split. Rezultat klica te metode je tabela nizov. Primer: na Linux sistemih so v datoteki /etc/passwd zapisani osnovni podatki o uporabnikih sistema (uporabniško ime, geslo, domač direktorij in podobno). Posamezni deli vrstice so med seboj ločeni z dvopičjem. Primer vrstice, ki opisuje uporabnika “lojze”, je podan spodaj:

lojze:x:131:100:Lojze Kranjc:/home/lojze:/bin/bash

Če želimo izpisati samo ime in priimek uporabnika “leo”, moramo niz razbiti na posamezne dele in izpisati peti podatek:

 

String vrstica = "leo:x:131:100:LeoNovak:/home/leo:/bin/bash"; 
String polja[] = vrstica.split(":"); 
System.out.println(polja[4]);  // izpis: Leo Novak

Naloga 5-II. V datoteki studenti.txt so zapisani podatki o študentih. Vsakemu študentu pripada vrstica oblike

ID:Ime:Priimek:OcenaOP2:Visina:BarvaLas

Primer datoteke s podatki o študentih:

63000001:Micka:Kovaceva:9:183.5:RJAVA  
63000002:Janez:Novak:8:176:RDECA  
63000003:Miha:Dolzan:10:180.5:CRNA  
63000004:Metka:Maze:10:178.5:RJAVA  
63000005:Tadej:Hocevar:9:165.2:CRNA  
63000006:Stefka:Drobtina:6:178:BLOND

Preberi datoteko in izpiši imena vseh študentov, ki imajo rjave lase.  

Rešitev naloge 5-II.: Izpis vseh rjavolascev razno/RjaviLasje.java

 

5.2.2 Razred StringBuffer

V javanski dokumentaciji piše, da razred String ne dopušča spreminjanja nizov – to pomeni, da se niz, ki ga hrani objekt tega razreda, ne more spremeniti. Pa je to res? Kaj izpiše spodnji program?

 

  String dan = "ponedeljek"; 
  dan = "torek"; 
  System.out.println("Danesje" + dan);

Program izpiše “Danes je torek”. Se torej niz lahko spreminja? Odgovor je: NE! Razložimo. Z ukazom dan = "ponedeljek"; se je ustvaril objekt razreda String (njegova vsebina je “ponedeljek”), spremenljivka dan pa je shranila referenco na ta objekt. Z ukazom dan = "torek"; se ustvari NOV objekt razreda String z vsebino “torek”, spremenljivka dan pa po novem hrani referenco (pokaže) na ta objekt. Objekt z vsebino “ponedeljek” se pri tem ni prav nič spremenil, le za spremenljivko dan je postal nezanimiv.

Zapomnite si torej naslednje: nizi tipa String se ne morejo spreminjati. Če potrebujemo spremenljivko, ki bo hranila “spreminjajoč se” niz, zanjo uporabimo razred StringBuffer.

 

  StringBuffer ime = new StringBuffer("miha"); 
  ime.setCharAt(0, M); 
  System.out.println(ime);

Naloga 5-III. Napiši metodo

     String dodajKImenu(String ime, String dodatek),

ki k danemu imenu datoteke doda predpisani niz. Primer: ob klicu dodajKImenu("podatki.txt", "CRC") naj metoda vrne niz “podatkiCRC.txt”.  

Rešitev naloge 5-III.: Dodatek k imenu datoteke razno/DodajKImenu.java

 

5.3 Tabele

Tabela v Javi ima nespremenljivo dolžino – ko enkrat povemo, koliko elementov bo tabela vsebovala, tega ne moremo več spremeniti. Tabelo inicializiramo na več načinov.

 

  int tabela[] = new int[3]; // v tabeli hranimo 3 stevila 
  tabela[0] = 15; tabela[1] = 7; tabela[2] = 105; 
 
  String imena[] = {"Micka", "Miha", "Janez", "Lojzka"}; 
  System.out.println(imena[2]);   // Janez

Velikost tabele dobimo z atributom length

 

  System.out.println(tabela.length);  // 3 
  System.out.println(imena.length);   // 4

Prvi element tabele ima indeks 0, zadnji pa tabela.length-1.

Naloga 5-IV. Napiši program, ki prebere niz, premeša njegove črke in ga izpiše.  

Rešitev naloge 5-IV.: Program izpiše anagram prebranega niza razno/Anagram.java

 

Naloga 5-V. V datoteki besede.txt so zapisane besede, v datoteki skrivno.txt pa je navodilo, kako iz besed sestaviti sporočilo (datoteka skrivno.txt vsebuje zaporedje parov stevilka_besede, stevilka_crke). Primer:

besede.txt:

To je vsebina datoteke z besedami. V njej so razlicne besede  
ki imajo lahko pomen ali pa tudi ne.

skrivno.txt:

4 3 19 2 3 2 4 3

Pomen skrivnega besedila: 4 3 (4. beseda, 3. crka: t), 19 2 (19. beseda, 2. crka: e), 3 2 (3. beseda, 2. crka: s) in 4 3 (4. beseda, 3. crka: t) – test.

Napiši program, ki s pomočjo obeh datotek sestavi sporočilo in ga izpiše na zaslon.
Opomba: koda 0 0 pomeni presledek!.  

Opombe k rešitvi:

Rešitev naloge 5-V.: Skrivno sporočilo razno/Skrivno.java

 

Naloga 5-VI. Iz standardnega vhoda preberi tri števila in izpiši njihovo povprečje in standardni odklon.  

Da bomo lažje razumeli navodila naloge, si najprej oglejmo definicijo matematičnih pojmov povprečje in odklon. Recimo, da imamo zaporedje x1,x2,x3,,xN, potem sta povprečje x in standardni odklon σ definirana takole:

                    ∘ ---------------
--  ∑N    x           ∑N    (x - x )2
x = ---i=1--i,  σ =    ---i=1-------i--.
       N                    N

(povprečje pove povprečno vrednost členov zaporedja, standardni odklon pa povprečno odstopanje posameznega člena zaporedja od povprečja).

Računanja povprečja se lahko lotimo tako, da enkrat preberemo zaporedje, sproti seštevamo njegove člene, na koncu pa dobljeno vsoto delimo s številom prebranih členov (glej nalogo 2-VIII na strani ). Podoben postopek bi radi uporabili tudi za računanje standardnega odklona, toda pri tem naletimo na težavo: zaporedje moramo prebrati dvakrat . Prvič zato, da izračunamo povprečje, drugič zato, da posamezne člene zaporedja odštevamo od povprečja, kvadriramo in kvadrate seštevamo. Dvojno branje v praksi ni priporočljivo (predstavljajte si, da mora uporabnik, če želi izračunati standardni odklon, dvakrat vtipkati celotno zaporedje), zato bomo nalogo rešili tako, da si bomo prebrane podatke zapomnili.

Prebrane člene zaporedja bomo shranili v spremenljivke x1, x2, x3. Uvedli bomo še štiri spremenljivke: vsota1 (vsota vseh členov zaporedja - vrednost vsote iz prve formule), vsota2 (vsota kvadratov razlik povprečja in posameznih členov - vrednost vsote iz druge formule) ter pov (povprečje) in odk (standardni odklon). Za računanje kvadrata bomo uporabili metodo Math.pow(base, exp), za računanje korena pa Math.sqrt(num).

Rešitev naloge 5-VI.: Povprečje in standardni odklon tabele/Odklon1.java

 

Nalogo 5-VI smo sicer rešili, toda rešitev ni najboljša, saj bi potrebovali kar precej časa, če bi želeli program spremeniti tako, da bi nam računal povprečje in odklon, na primer, desetih prebranih števil: namesto treh vrstic za branje (vrstice 16, 17 in 18) bi imeli 10 takih vrstic, namesto vsote treh spremenljivk v 21. in 25. - 27. vrstici bi imeli vsoto desetih spremenljivk, namesto s tri bi v 22. in 28. vrstici delili z deset. Spremembe sicer niso zelo zahtevne, obstaja pa velika verjetnost, da bi se programer, ki bi program popravljal, zmotil (verjetnost napake bi se seveda povečala, če bi želeli program prilagoditi za delo s 100 številkami). Poleg tega je program neuporaben, če ga moramo spremeniti vsakič, ko se spremeni sorazmerno majhna stvar (število vhodnih podatkov). Omenjeno slabost bomo odpravili v naslednji nalogi.

Naloga 5-VII. Popravi program tabele/Odklon1.java tako, da bo število vpisanih podatkov (med 1 in 50) lahko določil uporabnik (in ne programer, kot je bilo to v tabele/Odklon1.java).  

Pri reševanju naloge 5-VII bomo potrebovali več spremenljivk - če uporabniku dovolimo vpis do 50 števil, potrebujemo 50 spremenljivk: x1, x2, ..., x49, x50. Toda, že deklaracija petdesetih spremenljivk (vrstico 11, v kateri smo deklarirali tri spremenljivke moramo razširiti tako, da bodo v njej deklarirane vse omenjene spremenljivke) je duhamorno opravilo, rezultat pa je nepregleden:

 

  double x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13, 
         x14,x15,x16,x17,x18,x19,x20,x21,x22,x23,x24, 
         x25,x26,x27,x28,x29,x30,x31,x32,x33,x34,x35, 
         x36,x37,x38,x39,x40,x41,x42,x43,x44,x45,x46, 
         x47,x48,x49,x50;

Zato tak pristop k reševanju ni najboljši. Za 50 spremenljivk potrebujemo kompaktnejši (in s tem tudi bolj učinkovit) zapis. Kot večina programskih jezikov nam tudi java za reševanje tovrstnih problemov ponuja tabele. Namesto petdesetih spremenljivk bomo imeli eno spremenljivko, ki bo hranila 50 vrednosti. Do posamezne vrednosti bomo prišli tako, da bomo ob imenu spremenljivke navedli še indeks (zaporedno številko posamezne vrednosti). Tabelo petdesetih vrednosti tipa double deklariramo z

 

  double x[50];

Uporaba vrednosti iz tabele se od uporabe petdesetih spremenljivk razlikuje še v dveh podrobnostih:


images/tabelaD.eps

Slika 5.1: Deklaracije tabele petdesetih elementov in shematski prikaz pomnilniških celic, ki tej tabeli pripadajo


Program tabele/Odklon1.java lahko zdaj popravimo tako, da bo omogočal vpis do 50 števil (glej program tabele/Odklon2.java):

Rešitev naloge 5-VII.: Povprečje in standardni odklon tabele/Odklon2.java

 

Naloga 5-VIII. Popravi program Loto.java (glej nalogo 2-VII) tako, da se izpisana števila ne bodo ponavljala.  

Nalogo bomo rešili takole: najprej bomo izbrali prvo naključno število in si ga zapomnili; potem bomo izbrali še 6 števil in sicer tako, da bomo i-to število izbirali toliko časa, dokler ne bo različno od vseh prejšnjih izbranih števil. Izbrana števila bomo hranili v tabeli.

Rešitev naloge 5-VIII.: Izpis števil za loto (brez ponavljanja) tabele/Loto2.java

 

5.3.1 Povzetek dejstev o tabelah

S pomočjo prejšnjih primerov smo spoznali, kako uporabljamo tabele za reševanje preprostih nalog. Pri tem smo se naučili naslednje:

5.3.2 Večdimenzionalne tabele

V prejšnjem razdelku smo spoznali enodimenzionalne tabele. Pri njih do elementov dostopamo z enojnim indeksom: a[0], a[1], .... V programskem jeziku java lahko deklariramo tudi dvo- ali večdimenzionalno tabelo. Do elementov n-dimenzionalne tabele dostopamo z n indeksi; tako, na primer, do elementov dvodimenzionalne tabele dostopamo z dvema indeksoma (a[0][0], a[0][1], a[1][0], ...), do elementov v tridimenzionalni tabeli s tremi indeksi (a[0][0][0], a[0][1][5], a[2][1][7], ...), in tako naprej.

Celoštevilsko dvodimenzionalno tabelo velikosti 3x3 deklariramo z

 

  int a[][] = new int [3][3];

Naloga 5-IX. Napiši program za risanje grafov matematičnih funkcij na tekstoven zaslon. Primer izhoda je prikazan na sliki 5.2.  


                              |  
                              |  
      ****                    |     ***  
     *    *                   |   **   *  
    *      *                  |         *  
   *                          |  *       *  
            *                 | *         *  
  *          *                |*  
 *                            |            *  
              *               *  
*--------------*----------------------------*--------------*  
                             *|              *  
                *             |                           *  
                            * |               *          *  
                 *         *  |                *  
                  *       *   |                         *  
                   *          |                 *      *  
                    *   **    |                  *    *  
                     ***      |                   ****  
                              |  
                              |  
 


Slika 5.2: Primer izhoda programa tabele/Graf.java (funkcija: sin(x))


Dejstva in način razmišljanja pri reševanju zastavljene naloge:

Oboroženi s pravkar pridobljenim znanjem lahko program za risanje grafov napišemo v celoti.

Rešitev naloge 5-IX.: Risanje funkcij tabele/Graf.java

 

Izziv 5-II. o Popravi program tabele/graf.c tako, da bo omogočal interaktivno uporabo (parametre x1, x2, y1, y2 in funkcijo bo lahko določil uporabnik med samim izvajanjem programa), kot prikazuje spodnja slika.  

Interaktivni del programa za risanje grafov matematičnih funkcij
[user@localhost]# ./graf 
Vpisi x1: -3.14 
Vpisi x2: 3.14 
Vpisi y1: -1 
Vpisi y2: 1 
Izberi funkcijo: 
0 .. sin, 1 ... cos, 2 ... tan, 3 ... e^x

Izziv 5-III. o Napiši program, ki bo dvema igralcema omogočal igranje igre križci in krožci. Igralec, ki je na vrsti, vpiše x in y koordinati svoje poteze. Program posamezno potezo vpisuje v znakovno tabelo velikosti 3x3 (’ ’ ... polje je prazno, ’o’ ... na polju je krogec, ’x’ ... na polju je križec). Po vsaki vpisani potezi naj program izpiše trenutno stanje na igralni plošči.
 

Večdimenzionalne tabelarične konstante
n-dimenzionalno tabelo inicializiramo kot tabelo (n - 1)-dimenzionalnih tabel. Dvodimenzionalno tabelo torej inicializiramo kot tabelo enodimenzionalnih tabel.

 

  int y[3][3] = { 
      {7, 2, 1},   /* y[0][0], y[0][1], y[0][2] */ 
      {3, 9, 4},   /* y[1][0], y[1][1], y[1][2] */ 
      {5, 8, 6}    /* y[2][0], y[2][1], y[2][2] */ 
  };

5.4 Ovojni podatkovni tipi

Java je skoraj povsem objektno usmerjen programski jezik. To pomeni, da je skoraj vse, s čimer dela programer v Javi, objekt. O objektnem programiranju bomo več govorili v enem od naslednjih poglavij, tu omenimo le to, da so primitivni podatkovni tipi tista velika izjema, zaradi katere smo morali v prejšnjem stavku dodati besedo skoraj. Primitivni podatkovni tipi so namreč edini del Jave, ki je popolnoma ne-objektno usmerjen. Z drugimi besedami, ko delamo s primitivnimi podatkovnimi tipi, NE delamo z objekti.

Tip Število bitovOvojni tip



byte 8 Byte
short 16 Short
int 32 Integer
long 64 Long
float 32 Float
double 64 Double
char 16 Character
boolean Boolean

Most med ne-objektnim in objektnim svetom predstavljajo t.i. ovojni podatkovni tipi – za vsak primitivni tip obstaja pripadajoč ovojni tip (tipu int pripada ovojni tip Integer, tipu char ovojni tip Character in podobno – glej zgornjo tabelo).

 

  int a = 5;   // primitivni tip z vrednostjo 5 
  Integer aObj = new Integer(5);  // objekt tipa Integer

Ena od prednost primitivnih podatkovnih tipov je, da lahko nad njimi izvajamo atomarne operacije

 

  int a = 5, b = 7; 
  int c = a + b;

z objekti pa tega ne moremo početi:

 

  Integer aObj = new Integer(5); 
  Integer bObj = new Integer(7); 
  Integer cObj = aObj + bObj;    // NAPAKA!!!

Najpogosteje se bomo z ovojnimi podatkovnimi tipi srečali pri pretvorbo niza v primitivni tip in obratno, pri pretvorbi primitivnega tipa v niz.

 

  String odgovorStr = "42"; 
  int    odgovor    = Integer.parseInt(odgovorStr); //42 
 
  String piStr = "3.14"; 
  double pi    = Double.parseDouble(piStr); //3.14

in obratno, za pretvorbo primitivnega tipa v niz

 

  String aStr = Integer.toString(15);  // "15" 
  String bStr = Double.toString(2.78); // "2.78"

Naloga 5-X. Preberi datoteko studenti.txt, v kateri so zapisani podatki o študentih (glej nalogo 5-II) in izpiši povprečno oceno vseh študentov, ki so višji od višine, podane v prvem argumentu programa.  

Rešitev naloge 5-X.: Selektiven izpis ocene razno/PovprecnaOcena.java