kann mir jemand anhand eines Beispiels den Unterschied zwischen call by value und call by reference erklären?
private final double MWST = 1.19;
void bearbeiteArtikel(int i_nr, double d_Wert)
{
double d_ArtikelBrutto = d_Wert * MWST;
System.out.println("Artikel" + i_nr + "netto:" + d_Wert + "Brutto:" + d_ArtikelBrutto);
}
public static void main(String[]args)
{
bearbeiteArtikel(1, 12.90);
bearbeiteArtikel(2, 1.90);
}
private final double MWST = 1.19;
void berechneBrutto(double d_Wert, double rdOutWert)
{
rdOutWert = d_Wert * MWST;
}
public static void main(String[]args)
{
double dBrutto;
berechneBrutto(12.90, dBrutto);
System.out.println(dBrutto);
berechneBrutto(25.90, dBrutto);
System.out.println(dBrutto);
// Call by reference
void main()
{
int a = 1;
byReference(a);
// Hier is a==2
byValue(a);
// Hier is immernoch a==2
}
void byReference(int &x) // Das & heißt call-by-reference
{
// Hier is x==1
x = 2;
}
void byValue(int x)
{
// Hier is x==2
x = 3;
}
int x = 1;
methode(int x){ /* x wird verändert*/ }
// x außerhalb der methode ist immernoch 1, da in der methode nur mit ner kopie gearbeitet wird
Object yxz = null;
methode(Object yxz){ /* Object yxz wird verändert*/ }
// xyz hat außerhalb der methode den wert, den es in der methode bekommen hat, weil in der methode auf einer referenz von xyz gearbeitet wird
Also, ich hatte das eigentlich so gelernt, dass Java bei primitiven Datentypen mit Call by Value arbeitet, bei Objekten allerdings implizit mit Call by Reference. Oder irre ich mich da?Marco13 hat gesagt.:In Java gibt es NUR call by value.
da hast du recht @ gast
Es gibt in Java keinen Call-By-Rerefence, wurdfe doch schon gesagt.also meinst du, du arbeitest bei nem methodenaufruf mit einem übergebenen objekt mit ner kopie? oder streiten wir uns jetzt über die haarspalterei, das man der methode dann eine kopie der referenz übergibt?
ja @tfa, aber es hat den selben effekt eine referenz auf das objekt eben auch wenns nur ne kopie der eigentlichen referenz ist!
public class Foo {
public static void main(String[] args) {
Foo foo = new Foo();
bar(foo);
System.out.println(foo != null); // <= true!!!
}
public static void bar(Foo foo) {
foo = null;
}
}