Java Academy · Oppitunti

Arvon välitys Javassa

Ymmärtäkää Javan arvon välitys: primitiivit ja viitteet, uudelleensijoitus ja mutaatio sekä taulukoihin ja muuttumattomuuteen liittyvät sudenkuopat.

Oppitunti 1/38 vaihetta

Arvon välitys Javassa on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/3. 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ä 3 oppituntia.

Arvon välityksen yleiskatsaus

Tavoite: Opetella, miten Java välittää parametreja. Primitivi- ja viitetyyppejä verrataan uudelleensijoittamiseen ja muuttamiseen, taulukoihin sekä muuttumattomuuteen.

Primitiivien kopiointi

Primitiivit välitetään arvona: kutsuttu metodi saa kopion. Parametrin uudelleensijoittaminen ei muuta kutsujan muuttujaa.

public class Main {
  static void inc(int x) {
    x = x + 1; // modifies the local copy only
  }
  public static void main(String[] args) {
    int a = 5;
    inc(a);
    System.out.println("a after inc(a) = " + a); // still 5
  }
}

Viitteet: muuttaminen vs. uudelleensijoittaminen

Olioiden tapauksessa viite kopioidaan. Sen kautta tehdyt muutokset vaikuttavat kutsujan olioon, mutta parametrin uudelleensijoittaminen ei vaikuta siihen.

public class Main {
  static class Box { int n; }
  static void setTo999(Box b) { b.n = 999; } // mutate via copied reference
  static void reassign(Box b) { b = new Box(); b.n = 123; } // reassign local copy only
  public static void main(String[] args) {
    Box bx = new Box();
    bx.n = 10;
    setTo999(bx);
    System.out.println("after setTo999: bx.n = " + bx.n); // 999
    reassign(bx);
    System.out.println("after reassign: bx.n = " + bx.n); // still 999
  }
}

Taulukot: muuttaminen vs. uudelleensijoittaminen

Taulukot ovat olioita. Taulukon muuttaminen vaikuttaa kutsujaan, mutta parametrin uudelleensijoittaminen ei korvaa kutsujan taulukkoa.

public class Main {
  static void fillZero(int[] a) {
    for (int i = 0; i < a.length; i = i + 1) a[i] = 0; // mutate caller array
  }
  static void replace(int[] a) {
    a = new int[] {9, 9, 9}; // reassign local copy of the reference
  }
  public static void main(String[] args) {
    int[] arr = {1, 2, 3};
    fillZero(arr);
    System.out.println("after fillZero: " + arr[0] + "," + arr[1] + "," + arr[2]); // 0,0,0
    replace(arr);
    System.out.println("after replace:  " + arr[0] + "," + arr[1] + "," + arr[2]); // still 0,0,0
  }
}

Muuttumaton vs. muuttuva

String on muuttumaton ja palauttaa uusia olioita; StringBuilder on muuttuva ja muuttaa samaa instanssia.

public class Main {
  static void tryChangeString(String s) {
    s = s + "!"; // new String; original unchanged
  }
  static void changeBuilder(StringBuilder sb) {
    sb.append("!"); // mutates same object
  }
  public static void main(String[] args) {
    String s = "hi";
    tryChangeString(s);
    System.out.println("after tryChangeString: " + s); // "hi"

    StringBuilder sb = new StringBuilder("hi");
    changeBuilder(sb);
    System.out.println("after changeBuilder:  " + sb.toString()); // "hi!"
  }
}

Oikeaoppinen vaihto

Koska parametrit ovat kopioita, primitiivien vaihtaminen metodin sisällä ei vaikuta kutsujaan. Palauta uudet arvot tai säilö ne säilöolioon.

public class Main {
  static void trySwap(int a, int b) {
    int t = a; a = b; b = t; // swaps local copies only
  }
  static int[] swap(int a, int b) {
    return new int[] { b, a }; // return results to the caller
  }
  public static void main(String[] args) {
    int x = 1, y = 2;
    trySwap(x, y);
    System.out.println("after trySwap: x=" + x + ", y=" + y); // 1,2
    int[] res = swap(x, y);
    x = res[0]; y = res[1];
    System.out.println("after swap:    x=" + x + ", y=" + y); // 2,1
  }
}

Arvon välityksen tarkistus

Pikatarkistus: Mikä Java-parametrien välitystä koskeva väite on oikein?

Kertaus ja seuraava aihe

Kertaus: Tutustuttiin primitiiveihin ja viitteisiin, muuttamiseen ja uudelleensijoittamiseen, olioina toimiviin taulukoihin, muuttumattomuuteen sekä turvalliseen vaihtokuvioon. Seuraavaksi käsitellään staattisia ja instanssimetodeja.

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 ”Arvon välitys Javassa” ilmainen?

Kyllä – oppitunnin ”Arvon välitys Javassa” 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ä 3 oppituntia.

Mitä opin oppitunnilla ”Arvon välitys Javassa”?

Ymmärtäkää Javan arvon välitys: primitiivit ja viitteet, uudelleensijoitus ja mutaatio sekä taulukoihin ja muuttumattomuuteen liittyvät sudenkuopat. 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/3.

Kuinka kauan ”Arvon välitys Javassa”-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. Arvon välitys Javassa
  2. Staattiset ja instanssimetodit
  3. Metodien hajottaminen ja siisti koodi
← Takaisin: Java Academy