# Von einer Methode auf eine lokale Variable in der Main zugreifen?



## der neugirige (7. Jul 2011)

Hallo,

habe mal wieder Schwierigkeiten und komme einfach nicht weiter.;(

Habe hier eine Aufgabenstellung aus einer alten Klausur die wie folgt heißt:
Ergänzen Sie die Klasse „FussballStat“ um eine Methode mit dem folgenden Methodenkopf:

```
Spieler[ ] getSpielerMitNToren (int n)
```
Diese Methode liefert ein Array mit allen Spielern aus „mannschaften“, die n Tore geschossen
haben.  

Die vorgegebene Klasse „FussballStat“ sieht so aus:

```
public class FussballStat {

	public static void main(String[] arg) {
		
		private List<Mannschaften> mannschaften = new LinkedList<Mannschaften>();
		Spieler[] spieler1 = {new Spieler("Podolski"), new Spieler("Schweinsteiger")};
		
		LinkedList<Spieler> spieler2 = new LinkedList<Spieler>();
		spieler2.add(new Spieler("Lucio"));
		ArrayList<Spieler> spieler3 = new ArrayList<Spieler>();
		spieler3.add(new Spieler("Robben"));
		Spieler[] spieler4;
		
		mannschaften.add(new Mannschaften(spieler1));
		mannschaften.add(new Mannschaften(spieler2));
		mannschaften.add(new Mannschaften(spieler3));
		spieler4 = mannschaften.get(0).getSpieler1();
		
		}
// weitere methoden...
	// mein bescheidener Versuch die Methode zu implementieren
	/*
	 	 Spieler[] getSpielerMitNToren(int n){
			for(Mannschaften mn: mannschaften)
			return null;
			
		}
		*/	 
}
```

Neben der Klasse FussballStat ist noch die Klasse Spieler vorgegeben:

```
public class Spieler {

	private String name;
	private int tore = 0;
	
	Spieler(String name){
		this.setName(name);
	}
	public void addTor(){
		tore++;
		
	}
	public int getTore(){
		return tore;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public String toString(){
		return name;
	}
}
```
1. Wie schaffe ich es auf die Variable "mannschaften" von der Methode getSpielerMitNToren() zu zugreifen?
2. Die Variable "mannschaften" in Zeile 5 ist mit private versehen Eclipse meldet mit hier einen Fehler und will es weg haben, wo liegt hier der Problem?

Ich will jetzt keine Komplettlösung für die Methode nur einen Tip wie ich die Variable auslesen kann.

Danke schon einmal im Voraus.
LG


----------



## tfa (7. Jul 2011)

Auf eine lokale Variable kann man nur innerhalb der Methode, in der sie definiert ist, zugreifen. Nicht von anderen Methoden aus. Eine lokale Variable als private zu deklarieren geht auch nicht.
Du musst das anders lösen, etwa durch eine Member-Variable. Definiere die mannschaften-Variable außerhalb von main(). Dann musst du dort noch ein FussballStat-Objekt anlegen und kannst dann von sämtlichen (nicht-statischen) Methoden auf deine mannschaften zugreifen.


----------



## der neugirige (7. Jul 2011)

Hallo,

und Danke dir für die Antwort.

Diese Möglichkeit ist mir auch bekannt gewesen aber ich bin mir nicht sicher ob es der Aufgabenstellung, mit der vorgegebenen Classe "FussballStat", entsprechen würde.

Und du bist dir sicher das es keinen weg gibt auf die Variable zuzugreifen?


LG


----------



## nrg (7. Jul 2011)

du kannst sie auch ganz einfach der methode übergeben. ansonsten siehe tfa


----------



## Murray (7. Jul 2011)

Bist du sicher, dass die Klasse so vorgegeben ist mit der private-Deklaration von mannschaften innerhalb der main-Methode?


----------



## der neugirige (7. Jul 2011)

@ Murray.
Ja, steht so in der Aufgabenbeschreibung drin.

@ nrg:
 der Methode wird nur ein int wert übergegeben.

```
Spieler[ ] getSpielerMitNToren (int n)
```

LG


----------



## Murray (7. Jul 2011)

der neugirige hat gesagt.:


> @ Murray.
> Ja, steht so in der Aufgabenbeschreibung drin.


Das ist Quatsch - und syntaktisch falsch, daher nicht übersetzbar.

Die Aufgabe ist so also nicht lösbar. Entweder änderst du die Deklaration der lokalen Variablen (private müsste einfach weggelassen werden) und  änderst ebenfalls die vorgebenen Signatur der zu schreibenden Methode, indem du dort mannschaften als Parameter übergibst, oder du machst mannschaften zu einer Member-Variablen der Klasse.


----------



## gafktor (7. Jul 2011)

Das ganze scheint mir so etwas sinnfrei zu sein.
Allerdings gib es noch einige Variablen an Listen, die nachher nicht mehr auftauchen(Spieler als Array, LinkedList, ArrayList) und *// Weitere Methoden ...* die evtl. einen indirekten Zugriff ermöglichen. Nur mal so als Anmerkung

mfg 
gafktor


----------



## der neugirige (7. Jul 2011)

Hallo,

hab hier mal die komplette Aufgabenstellung beigefügt
vielleicht übersehe ich ja einiges.

wie würde den so eine Methode ausschauen die einen indirekten Zugriff erlauben würde?

LG


----------



## Marcinek (7. Jul 2011)

Das ist ein Tippfehler in der Aufgabenstellung.

Du müsstest sonst sowas machen


```
getNTore (int tore, List<Mannschaften> mannschaften) {}
```


----------



## gafktor (8. Jul 2011)

Wie wär es denn zuerst Aufgabe a) zu lösen?


----------



## der neugirige (8. Jul 2011)

Hallo,

Danke erstmal für die Antworten.

@Marcinek:
das mit dem Tippfehler kann gut möglich sein, aber ich weiss es nicht. 

@gafktor:
Die Aufgabe a) habe ich eigentlich gemacht. Ist wahrscheinlich keine ideale Lösung, aber Eclipse meckert nicht bei der Initialisierung in der Klasse FussballStat  und wenn die Methode getSpielerMitNToren() implementiert ist, kann ich dann  auch sehen ob die Aufgabe 4a) korrekt ausgeführt wird .

LG


----------



## gafktor (8. Jul 2011)

Hallo

wenn ich deine Aufgabe richtig verstehe brauchst du für Aufgabe b) einen Zugriff auf alle Spieler die in der Liste mannschaften enthalten sind und sollst in Aufgabe a) die Klasse Mannschaft so implementieren das die Klasse Fussballstat lauffähig ist. Was hindert dich also in der Klasse Mannschaft eine (statische) List oder was auch immer zu implementieren und wenn der Konstruktor aufgerufen wird diese entsprechend fort zuschreiben. Dann kannst du in der zu erstellenden Funktion direkt auf die Spielerliste zugreifen und wie auch gewünscht auswerten.

mfg
gafktor


----------



## der neugirige (9. Jul 2011)

Hallo
@gafktor:

was mich daran hindert? - eigentlich garnichts, ausser mein falsches Verständnis für die Aufgabe .
Das mit der statischen Variable ist auch eine Möglichkeit aber würde sie dann nicht zusätzlich zu der anderen Variable "mannschaften" Platz im Speicher verbrauchen?

LG


----------



## gafktor (10. Jul 2011)

Naja,

wenn die Variable static ist gilt sie für die Klasse mannschaft einmalig, wird also nicht für jede Mannschaft angelegt. Will heissen, du hast genau eine List mit allen Spielern egal, wiewiel mannschaften existieren. Davon abgesehen hält die List ja nicht das Object Spieler sondern eine Referenz auf den Speicherplatz wo der Spieler gerade rumlungert. Du solltest vieleicht darauf achten, diese List nicht bei jedem Konstruktoraufruf auf einen neuen Wert zu setzen. Ich würd mir dazu evtl. eine eigene Funktion basteln -> addSpielerList(Spieler spieler) die ich im Konstruktor ziehen würde.

mfg
gafktor


----------



## diggaa1984 (10. Jul 2011)

wäre aber n hässliches geplantes design vom aufgabensteller


----------

