Miten ihmeessä String-muuttujaa voi muokata funktion sisällä, jos se on määritelty eri aliohjelmassa? Olen viettänyt koko aamun Googlen parissa, mutta en tunnu löytävän oikeita hakusanoja.
Kirjoitin testiohjelman näin:
public static void aliohjelma(String mj) { mj = "testi"; } public static void main(String ag[]) { String merkkijono = null; aliohjelma(merkkijono); System.out.print(merkkijono); // tulostaa null }
Eikä tämä ilmeisesti toimi. Tietenkin returnin avulla homma toimii, mutta se on todella epäkäytännöllinen tapa, jos haluaa muokata useita String-muuttujia aliohjelmassa.
String on mallia immutable, ts. jokainen muutos merkkijonoon luo taustalla uuden merkkijono-olion. Käytä tarvittaessa StringBuilderia. Paluuarvot ovat kivoja.
String-muuttuja on viittaus muistipaikkaan, josta löytyy tekstiä sisältävä olio. Funktiokutsussa kopioituu merkkijono-Stringin osoite mj nimiseen muuttujaan. Nämä kaksi muuttujaa siis osoittavat samaan paikkaan muistissa, joten muutokset molemmille oliolle vaikuttavat samaan muistipaikkaan.
tkok kirjoitti:
Funktiokutsussa kopioituu merkkijono-Stringin osoite mj nimiseen muuttujaan.
Kuitenkin funktion sisällä mj asetetaan heti viittaamaan toiseen merkkijono-olioon, "testi", joten yhteys argumentin viittaamaan olioon katoaa.
tkok kirjoitti:
Nämä kaksi muuttujaa siis osoittavat samaan paikkaan muistissa, joten muutokset molemmille oliolle vaikuttavat samaan muistipaikkaan.
Mihin tämä liittyy? Tuollaista muutosta ei merkkijono-oliolle voi Javassa tehdä.
Burton kirjoitti:
Eikä tämä ilmeisesti toimi. Tietenkin returnin avulla homma toimii, mutta se on todella epäkäytännöllinen tapa, jos haluaa muokata useita String-muuttujia aliohjelmassa.
Java on epäkäytännöllinen monessa suhteessa... ;-)
Tee uusi (merkkijonoja sisältävä) olio, niistä kielen parissa pidetään.
Aihe on jo aika vanha, joten et voi enää vastata siihen.