# Referenz (Pointer, Zeiger)  in Java



## 82kolu (13. Mai 2015)

Hallo Leute,
ich komm nemme weiter.
in C++ kann man einfach mit * oder & arbeiten aber wie macht man das in Java`?
alles in einem Package!

Codebeispiel:

```
Klasse Autobahn!
boolean strasse = true;
public static void getAuto(boolean befahrbar) {
		befahrbar=strasse;
}
```


```
Klasse Auto!
private void kannGefahrenWerden() {
		// TODO Auto-generated method stub
		Autobahn.getAuto(befahrbar);
//befahrbar wird nie verändert. Warum weiss ich aber wie kann ichs verändern?
}
```

Danke schon mal :rtfm:


----------



## Gucky (13. Mai 2015)

Was du meinst ist ein sog. Getter. Du musst den Wert einfach zurückgeben.


----------



## 82kolu (13. Mai 2015)

Hey, 
vorab danke.
Aber das ist nicht wonach ich suche.
wenn ich beispielsweise 5 boolean ändern möchte dann müsste ich ja 5 methoden schreiben


----------



## Gucky (13. Mai 2015)

Genau das haben Getter und Setter an sich, dass nur ein Wert geändert oder zurückgegeben wird. Aber natürlich kannst du auch Methoden, wie

```
public void setter(boolean paramBool1, boolean paramBool2, boolean paramBool3, boolean paramBool4, boolean paramBool5){
   //doSomeSetterStuff
}
```
schreiben. Ob das Sinn macht steht auf einem anderen Blatt.


----------



## 82kolu (13. Mai 2015)

Hey, jo das funktioniert wenn man in der gleichen Klasse hantiert.
Sobald man aber klassenübergreifend arbeitet ist es so nicht mehr möglich.
siehe mein Codbeispiel


----------



## Gucky (13. Mai 2015)

Doch das funktioniert. Dein Beispiel ist ein bisschen wirr, weshalb ich es nicht so ganz verstehe.
Wenn du JFrame#setWidth(200); aufrufst, dann wird im JFrame Objekt, auf das setWidth aufgerufen wird eine Variable geändert. Und wenn du int i = 200; JFrame#setWidth(i); aufrufst gibt es dasselbe Resultat.


Wenn du JFrame#getWidth() aufrufst wird ein int zurückgegeben.
Willst du fünf Werte auf einmal zurückgeben, musst du mit einem Array und einer Dokumentation arbeiten (sonst weißt du bald nicht mehr, was in welchem Feld steht) oder mit einer Containerklasse, ähnlich einem Struct.


----------



## 82kolu (13. Mai 2015)

Kannst du mir n Beispiel für boolean-Werte machen das ich des verstehe.
Also ich habs so gemacht und so gehts net.

```
public void setter(boolean paramBool1, boolean paramBool2, boolean paramBool3, boolean paramBool4, boolean paramBool5){
   paramBool1 = true;
    paramBool2 = ....
}
```


```
boolean  paramBool1 = false;
Klasse.setter(paramBool1, paramBool2, paramBool3, paramBool4, paramBool5);
```
bei mir ist nach dem Aufruf der setter Methode der Parameter  paramBool1 =  false;
und ich weiss auch warum.
In C++ ist das genauso, nur wenn man bei der Methode ein *oder ein & macht dann wird die variable verändert

Danke


----------



## Gucky (13. Mai 2015)

Ach so meinst du das.
Das ist in Java nicht möglich. Hier gibt es kein Call-By-Reference sondern nur Call-By-Value. Wird eine Methode mit Parametern aufgerufen, so wird eine Kopie der Variablen erstellt und diese an die Methode übergeben. Der Ursprungswert kann nicht verändert werden.

Du müsstest mit Gettern arbeiten, die Werte zurückgeben. Also auto.getFahrbar().
Eine Alternative wäre, dass du ein Array geeigneter Länge übergibst und dort die Werte hineinschreibst. Das ist aber sehr unschön.


----------



## 82kolu (13. Mai 2015)

Oh... okay. Ja das wist wirklich sehr unschön....


Trotzdem vielen Dank!!
Ich sitz schon seit 6 Stunden dran und denk mir das muss doch gehen....

Danke für die Zeit


----------



## consider (14. Mai 2015)

Aber als kleine Hilfe (so wird es vielleicht etwas schöner): Es wird zwar eine <<Kopie>> der Referenz übergeben, diese verweist aber logischerweise noch auf selbe Objekt. Die Referenz wird als quasi by Value übergeben. Es läuft also immer per by value, nuir kann man dadurch, dass bei eigenen Datentypen die Referenz by Value übergeben wird, noch etwas machen.

Vorteil: Da auf selbe Objekt referenziert wird, kann man dieses ändern, als wär by Reference übergeben worden.
Nachteil: Es bleibt by Value. Du kannst nicht auf ein neues Objekt referenzieren, da nur die Kopie der Referenz überschrieben wird.

Daher wäre es für dein Vorhaben eventuell hilfreich, keine primitiven sondern eigene Datentypen zu verwenden. (und boolean eventuell zu kapseln)

Beispiel:


```
package reforval;

public class Test {
	private int myValue;

	public Test(int i) {
		setMyValue(i);
	}

	public int getMyValue() {
		return myValue;
	}

	public void setMyValue(int myValue) {
		this.myValue = myValue;
	}

	@Override
	public String toString() {
		return "Test [myValue=" + myValue + "]";
	}
	
}
```

Ein Testobjekt.


```
package reforval;

public class RefernceOrValue {

	public static void main(String[] args) {
		Test test = new Test(5);
		change(test);
		System.out.println(test);

	}

	private static void change(Test t) {
		t.setMyValue(10);
	}

}
```

Ergebnis: 10 Es wird zwar die Referenz per Value übergeben, also eine Kopie erstellt, wleche jedoch noch auf selbe Objekt zeigt.
Das verhält sich also erst mal grob wie bei "per Reference". Es bleibt jedoch bei by Value:


```
package reforval;

public class RefernceOrValue {

	public static void main(String[] args) {
		Test test = new Test(5);
		change(test);
		System.out.println(test);

	}

	private static void change(Test t) {
		t = new Test(10);
	}

}
```

Ergebnis 5: Es wird nur die lokale Kopie der Referenz neu belegt. Die äußere Kopie bleibt davon unberührt.


----------

