# Wert von globalen Variablen über eine Methode ändern



## mezzix (17. Nov 2013)

Hi,
ich habe in meiner Main zwei Variablen z.B. int a und int b. Nun greife ich von der Methode 1 außerhalb der Main auf die beiden Variablen zu und möchte den Wert verändern. Diesen Wert brauch ich für eine dritte Methode. Problem ist, sobald ich aus der ersten Methode raus bin, bekommen die Variablen a und b wieder den Wert, der in der Main angegeben wurde. Wie behalten die Variablen den Wert, den ihnen Methode 1 gibt?
Alle Methoden sind übrigens in derselben Klasse.


----------



## njans (17. Nov 2013)

ints sind primitive Typen, die kannst du nicht referenzieren und den Wert verändern, es sei denn du greifst auf die variablen direkt zu:

Hast du sowas gebaut?

```
public static void main(string[] args)
{
int a = 5;
int b = 6;

aendere(a,b);
}

public static void aendere(int a, int b)
{
a = 10;
b = 12;
}
```

Das geht nicht in Java. bei primitiven typen bekommst du in Java immer nur den Wert, nicht die Referenz.
Aber du könntest das machen, auch wenn es eher nicht zu empfehlen ist:


```
private static int a = 5;
private static int b = 6;

public static void main(string[] args)
{
aendere();
}

public static void aendere()
{
a = 10;
b = 12;
}
```


----------



## mezzix (17. Nov 2013)

Genau, das obere Beispiel trifft mein Problem. Dein nicht zu empfehlendes Beispiel löst das Problem auch nicht, aber warum ist dies nicht empfehlenswert?


----------



## njans (17. Nov 2013)

Weil du statische Variablen verwendest und das ist in den meisten Fällen ungünstig, weil es zum einen nicht Objektorientiert ist. Zum anderen hättest du dann für jedes Objekt deiner Klasse nur genau eine variable a und b. Wenn ein Objekt da etwas ändert, dann sehen das alle.

Zeig doch mal deinen Code und dann kann man dazu sicherlich eine objektorientierte Lösung finden.


----------



## mezzix (17. Nov 2013)

njans hat gesagt.:


> Weil du statische Variablen verwendest und das ist in den meisten Fällen ungünstig, weil es zum einen nicht Objektorientiert ist. Zum anderen hättest du dann für jedes Objekt deiner Klasse nur genau eine variable a und b. Wenn ein Objekt da etwas ändert, dann sehen das alle.
> 
> Zeig doch mal deinen Code und dann kann man dazu sicherlich eine objektorientierte Lösung finden.



Objektorientiert habe ich nur bisher noch nicht gearbeitet. Das ganze ist auch eine Hausarbeit, soll ich den Code trotzdem mal posten?


----------



## njans (17. Nov 2013)

Ja bitte.


----------



## mezzix (17. Nov 2013)

[JAVA=42]

public class Nr2 {
	public static void main (String[] args) {
		String [][] spielfeldNummern = {{" 4", "14", " 6", "11"}, {"10", "15", "13", " 3"}, {" 9", " 5", " 1", "12"}, {" 7", " 2", " 8", "  "}};;
		int zeileLeer=0;
		int spalteLeer=0;
		while (true) {
		spielfeld(spielfeldNummern);
		leeresFeldFinden(zeileLeer, spalteLeer, spielfeldNummern);
		int zeile = IO.readInt("Welche Zeile:");
		int spalte = IO.readInt("Welche Spalte:");
		verschieben(zeile, spalte, zeileLeer, spalteLeer, spielfeldNummern);
		}
	}
	public static void spielfeld(String [][] spielfeldNummern) {
		System.out.println("+ -- + -- + -- + -- +");
		System.out.println("| " +spielfeldNummern[0][0] +" | " +spielfeldNummern[0][1] +" | " +spielfeldNummern[0][2] +" | " +spielfeldNummern[0][3] +" |");
		System.out.println("+ -- + -- + -- + -- +");
		System.out.println("| " +spielfeldNummern[1][0] +" | " +spielfeldNummern[1][1] +" | " +spielfeldNummern[1][2] +" | " +spielfeldNummern[1][3] +" |");
		System.out.println("+ -- + -- + -- + -- +");
		System.out.println("| " +spielfeldNummern[2][0] +" | " +spielfeldNummern[2][1] +" | " +spielfeldNummern[2][2] +" | " +spielfeldNummern[2][3] +" |");
		System.out.println("+ -- + -- + -- + -- +");
		System.out.println("| " +spielfeldNummern[3][0] +" | " +spielfeldNummern[3][1] +" | " +spielfeldNummern[3][2] +" | " +spielfeldNummern[3][3] +" |");
		System.out.println("+ -- + -- + -- + -- +");
	}

	public static void leeresFeldFinden(int zeileLeer, int spalteLeer, String [][] spielfeldNummern) {
		for (int a=0; a<spielfeldNummern.length; a++) {
			for (int b=0; b<spielfeldNummern.length; b++) {
				if (spielfeldNummern[a]*.equals("  ")) {
					zeileLeer = a;
					spalteLeer = b;
				}
			}
		}
	}

	public static void verschieben(int zeile, int spalte, int zeileLeer, int spalteLeer, String[][] spielfeldNummern) {
		if (überprüfen(zeile, spalte, zeileLeer, spalteLeer) == false) {
			System.out.println("Falsche Eingabe!");
		}
		if (überprüfen(zeile, spalte, zeileLeer, spalteLeer) == true) {
			String a = spielfeldNummern[zeile] [spalte];
			spielfeldNummern[zeile] [spalte] = spielfeldNummern[zeileLeer][spalteLeer];
			spielfeldNummern[zeileLeer][spalteLeer] = a;
		}
	}

	public static boolean überprüfen(int zeile, int spalte, int zeileLeer, int spalteLeer) {
		if (zeileLeer == zeile+1) {
			if (spalteLeer == spalte+1) {
				return true;
			} else if (spalteLeer == spalte-1) {
				return true;
			} else if (spalteLeer == spalte) {
				return true;
			} else {
				return false;
			}
		} else if (zeileLeer == zeile-1) {
			if (spalteLeer == spalte+1) {
				return true;
			} else if (spalteLeer == spalte-1) {
				return true;
			} else if (spalteLeer == spalte) {
				return true;
			} else {
				return false;
			}
		} else if (zeileLeer == zeile) {
			if (spalteLeer == spalte+1) {
				return true;
			} else if (spalteLeer == spalte-1) {
				return true;
			} else if (spalteLeer == spalte) {
				return true;
			} else {
				return false;
			}
		} else {
			return false;
		}		
	}
}

[/code]*


----------



## mezzix (17. Nov 2013)

Problem hat sich gelöst. Ich habe einfach die Methode leeresFeldFinden in die Main verschoben.


----------



## Georgius (23. Nov 2013)

[XML][/XML]Hi

Bin auch ganz neu, kann also absoluter Schwachsinn sein was ich schreibe.

1. Würde ich eine for-Schleife für spielfeld verwenden um den Text auszugeben.
2. Brauchst Du die Variablen zeileLeer und spalteLeer ja garnicht an leeresFeldFinden übergeben, werden ja nicht ausgelesen.

Text wird weiter bearbeitet


----------

