Java Academy · Oppitunti

Primitiivityypit ja viitetyypit

Ymmärrä Java-kielen primitiivityyppien ja viitetyyppien perustavanlaatuinen ero.

Oppitunti 1/413 vaihetta

Primitiivityypit ja viitetyypit on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Java Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Java Academy-kurssilla on yhteensä 4 oppituntia.

Primitiivi- ja viitetyypit

Javassa on kaksi perustavanlaatuista tietotyyppien luokkaa: primitiivityypit ja viitetyypit. Niiden eron ymmärtäminen on ratkaisevan tärkeää oikean ja tehokkaan Java-koodin kirjoittamisessa.

Kahdeksan primitiivityyppiä

Javassa on täsmälleen kahdeksan primitiivityyppiä:

  • byte (8-bittinen kokonaisluku)
  • short (16-bittinen kokonaisluku)
  • int (32-bittinen kokonaisluku)
  • long (64-bittinen kokonaisluku)
  • float (32-bittinen desimaaliluku)
  • double (64-bittinen desimaaliluku)
  • char (16-bittinen Unicode-merkki)
  • boolean (true/false)

Primitiivit sisältävät arvon suoraan muistissa — ilman olion aiheuttamaa lisätilaa.

int age = 25;
double price = 19.99;
boolean active = true;
char grade = 'A';
long population = 8_000_000_000L;

System.out.println(age);       // 25
System.out.println(price);     // 19.99
System.out.println(active);    // true

Viitetyypit

Viitetyyppi tallentaa muistiosoitteen eli viitteen, joka osoittaa keossa olevaan olioon. Näitä ovat muun muassa:

  • Luokat (esimerkiksi String, Scanner)
  • Taulukot (esimerkiksi int[])
  • Rajapinnat
  • Enumeraatiot ja tietueet

Muuttuja ei sisällä oliota — se sisältää osoittimen siihen.

String name = "Alice";       // reference to a String object
int[] scores = {90, 85, 92}; // reference to an array object

// name holds a reference, not the characters directly
System.out.println(name.length());   // 5
System.out.println(scores.length);   // 3

Pino- ja kekomuisti

Primitiivimuuttujat tallennetaan pinoon — kyseessä on nopea ja lyhytkestoinen muisti, joka liittyy metodikutsuihin.

Viitetyyppien oliot sijaitsevat keossa — kyseessä on suurempi ja pitkäkestoisempi muisti, jota roskienkeruu hallinnoi. Viite eli osoite itse sijaitsee pinossa.

// Stack: holds the int value directly
int x = 42;

// Stack: holds reference; Heap: holds the Person object
class Person {
    String name;
    int age;
}

Person p = new Person(); // p is a reference on stack, object on heap
p.name = "Bob";
p.age = 30;

null: puuttuva viite

Viitemuuttujille voidaan antaa arvo null, mikä tarkoittaa, etteivät ne viittaa mihinkään olioon. Primitiivit eivät voi olla null-arvoja — niillä on aina jokin arvo.

Null-viitteen käyttäminen aiheuttaa NullPointerException-poikkeuksen (NPE) — yhden Javan yleisimmistä ajonaikaisista virheistä.

String s = null;
// int n = null; // Compile error — primitives can't be null

try {
    System.out.println(s.length()); // NullPointerException!
} catch (NullPointerException e) {
    System.out.println("Caught NPE: reference was null");
}

Kopiointisemantiikka: primitiivit

Kun sijoitat primitiivimuuttujan toiselle muuttujalle, Java kopioi arvon. Yhden muuttaminen ei vaikuta toiseen — muuttujat ovat täysin itsenäisiä.

int a = 10;
int b = a;  // b gets a copy of the value 10

b = 20;     // changing b does NOT affect a

System.out.println(a); // 10
System.out.println(b); // 20

Kopiointisemantiikka: viitteet

Kun sijoitat viitemuuttujan toiselle muuttujalle, molemmat muuttujat viittaavat samaan olioon. Olion muokkaaminen yhden viitteen kautta näkyy myös toisen viitteen kautta.

int[] arr1 = {1, 2, 3};
int[] arr2 = arr1; // arr2 points to the SAME array

arr2[0] = 99; // modifies the shared array

System.out.println(arr1[0]); // 99 — arr1 sees the change too!
System.out.println(arr2[0]); // 99

Kääreluokat: primitiivien paketointi

Jokaisella primitiivillä on vastaava kääreluokka paketissa java.lang:

  • int → Integer
  • double → Double
  • boolean → Boolean
  • char → Character

Kääreluokkien avulla primitiivejä voidaan käyttää olioina — tämä on tarpeen esimerkiksi kokoelmissa, kuten List<Integer>.

Integer boxed = Integer.valueOf(42); // explicit boxing
int unboxed = boxed.intValue();       // explicit unboxing

// Autoboxing / auto-unboxing (Java does this automatically)
Integer auto = 100;  // autoboxed
int val = auto;      // auto-unboxed

System.out.println(Integer.MAX_VALUE);  // 2147483647
System.out.println(Double.MIN_VALUE);   // 5.0E-324

Autoboxingin sudenkuopat

Autoboxing on kätevää, mutta se voi aiheuttaa huomaamattomia virheitä. Integer välimuistittaa arvot väliltä -128–127 — tämän alueen ulkopuolella == vertaa viitteitä, ei arvoja.

Käyttäkää aina .equals()-metodia kääreluokkaolioiden vertaamiseen.

Integer a = 127;
Integer b = 127;
System.out.println(a == b);      // true (cached)

Integer c = 200;
Integer d = 200;
System.out.println(c == d);      // false (different objects!)
System.out.println(c.equals(d)); // true (correct comparison)

Metodien parametrit: arvon välitys

Java käyttää aina arvon välitystä. Primitiivien tapauksessa arvo kopioidaan. Viitteiden tapauksessa viite eli osoite kopioidaan — molemmat viittaavat samaan olioon, mutta metodin sisältä ei voi sijoittaa kutsujan muuttujaan uutta arvoa.

static void doubleValue(int n) {
    n = n * 2; // only modifies the local copy
}

static void clearArray(int[] arr) {
    arr[0] = 0; // modifies the shared object
}

int x = 5;
doubleValue(x);
System.out.println(x); // still 5

int[] nums = {10, 20, 30};
clearArray(nums);
System.out.println(nums[0]); // 0 — object was mutated

Käytännön yhteenvetotaulukko

Tiivis vertailu primitiivi- ja viitetyypeistä:

  • Tallennus: primitiivi → arvo pinossa; viite → osoite pinossa + olio keossa
  • Oletusarvo: primitiivi → 0/false/\u0000; viite → null
  • Voi olla null: primitiivi → Ei; viite → Kyllä
  • Sijoitus kopioi: primitiivi → arvon; viite → osoitteen
  • Kokoelmissa: primitiivit tarvitsevat kääreluokat

Pikatarkistus

Mitä tapahtuu, kun suoritat seuraavan koodin?

Integer x = 200;
Integer y = 200;
System.out.println(x == y);

Yhteenveto: primitiivi- ja viitetyypit

Tämän oppitunnin keskeiset asiat:

  • Javassa on 8 primitiivityyppiä, jotka tallennetaan suoraan pinoon
  • Viitetyypit tallentavat keossa olevan olion osoitteen; muuttuja sisältää tämän osoitteen
  • Primitiivit kopioidaan arvona; viitteet kopioidaan osoitteena
  • Viitemuuttujat voivat olla null-arvoja; primitiivit eivät voi
  • Kääreluokat (Integer, Double jne.) paketoivat primitiivit olioiksi
  • Java käyttää aina arvon välitystä — myös viitteitä välitettäessä
Aloita maksutta

Opi Java tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
104
Oppitunnit
374

Usein kysytyt kysymykset

Onko oppitunti ”Primitiivityypit ja viitetyypit” ilmainen?

Kyllä – oppitunnin ”Primitiivityypit ja viitetyypit” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Java Academy-kurssin, päivitä CoddyKit PROhon. Java Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Primitiivityypit ja viitetyypit”?

Ymmärrä Java-kielen primitiivityyppien ja viitetyyppien perustavanlaatuinen ero. Harjoittelet Java Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Java Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Java Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”Primitiivityypit ja viitetyypit”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Java Academy-oppitunnilla?

Kyllä. Jokainen Java Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Primitiivityypit ja viitetyypit
  2. Laajentavat ja supistavat muunnokset
  3. instanceof-operaattori
  4. Tyyppimuunnokset käytännössä
← Takaisin: Java Academy