Primitiivityypit ja viitetyypit
Ymmärrä Java-kielen primitiivityyppien ja viitetyyppien perustavanlaatuinen ero.
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); // trueViitetyypit
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); // 3Pino- 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); // 20Kopiointisemantiikka: 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]); // 99Kääreluokat: primitiivien paketointi
Jokaisella primitiivillä on vastaava kääreluokka paketissa java.lang:
int→Integerdouble→Doubleboolean→Booleanchar→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-324Autoboxingin 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 mutatedKä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ä
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
- Primitiivityypit ja viitetyypit
- Laajentavat ja supistavat muunnokset
- instanceof-operaattori
- Tyyppimuunnokset käytännössä