# Wie kann man Variablenwerte der main-Klasse in eine Unterklasse übrgeben?



## Migelito (14. Juni 2010)

Hallo, ich hab ein Problem auf das ich selber nicht komme, weil mir dazu einfach dir Erfahrung mit Java fehlt.
Hab eine Textdokument eingebunden und möchte in einer Unterklasse Namens "holeMessDat" die vorliegenden Daten weiter verarbeiten.

Aber wie kann ich das umsetzt, das ich aus der Klasse Main die Werte des Dokuments in die Unterklasse bekomme?

Java-Quelltext-Ausschnitt der beiden Klassen:


package Mess_Statistik;

public class holeMessDat 
{
	public test()
	{
		                                        // Wie bekomme ich hier die Variable "zeile" rein? 
	}
}

........

String  zeile = "";
FileReader cach = null;
holeMessDat mess = new holeMessDat();
.........
while(zeile != null)
{
	  System.out.println(zeile);	
	  zeile = messData.readLine();
 }
//  An dieser Stelle würde ich gerne die Stringvariable "zeile" an das Unterprogramm "holeMessDat" übergeben
.........


----------



## CPoly (14. Juni 2010)

Vorneweg: Für solche Fragen ist das Forum *nicht* gedacht. Das sind absolute Grundlagen.

Erweitere die Methode "test()" um einen Parameter

```
public test(String var)
{
    System.out.println(var);
}
```

und übergib den String


```
mess.test(zeile);
```

Übrigens ist beim Aufruf an der Stelle, wo du es möchtest, die Variable "zeile" immer NULL.


----------



## Migelito (14. Juni 2010)

ne... also das war nix mit deinem tipp. so kann das auf keinen fall gehen, weil mir Eclipse nur noch mehr fehler anzeigt als gedacht.

Wenn das so leicht wäre unter Klassen Variablenwerte zu übergeben, dann hätte ich hier bestimmt nicht rein geschrieben!


----------



## janus23 (14. Juni 2010)

Ja, weil bei der Methode der Datentyp fehlt

```
public void test(String str){...}
```

Und das sind wirklich Grundlagen....


----------



## Matt297 (14. Juni 2010)

Es ist so leicht wie es auch aussieht. Das Klassen bzw. Objekte miteinander auf bestimmten Kanälen(Funktionen/Parameter) kommunizieren können ist ein Elementarer Bestandteil der OOP. Ohne dich beleidigen zu wollen, empfehle ich dir wirklich dir die Grundlagen anzuschauen.

Um dir das jetzt aber zu zeigen, wie es geht, mal ein komplettes Beispiel:


```
public class HauptKlasse {

  public static void main(String[] args) {
    UnterKlasse objekt = new UnterKlasse();
    objekt.wasAusgeben("Dieser Text wird ausgegeben");
  }
}

public class UnterKlasse {

  public UnterKlasse() {}

  public void wasAusgeben(String einText) {
    System.out.println(einText);
  }
}
```

Wie du siehst, geht alles über Parameter, die Variable "einText" könntest du dir jetzt in eine lokalen Eigenschaft speichern und hättest so in der ganzen UnterKlasse Zugriff darauf.


----------



## Migelito (14. Juni 2010)

Muchacho, du weisst garnicht wie sehr du mir da geholfen hast. Auch wenn das nur grundlagen für dich sind, aber für mich ist das ein sehr großer schritt 
nach vorne.

Vielen dank, für deine Erleuchtung ^^


----------



## Migelito (15. Juni 2010)

kurze Rückfrage...

wie geht das mit einer coll by value Class?

wollte nach Übergabe in die Unterklasse zum schluss wieder an die Hauptklasse zurück geben.
das muss ich doch mit return machen. Aber das geht wohl nicht mit void zusammen.


----------



## Kai008 (15. Juni 2010)

Dann musst du void eben mit der Klasse oder Primit. Datentypen den du zurückgeben willst ersetzen.


----------



## Migelito (15. Juni 2010)

ok, ok.. srich void durch BufferedReader ersetzen und um Rumpf unten z.B. return zeile. das hatte ich auch schon bereits herraus gefunden.

......
public class holeMessDat 
{
	public void test(BufferedReader messData) throws IOException
	{

		String zeile ="";		

		// Liest Werte aus Text-Datei Zeilenweise in String ein

		  while(zeile != null)
		  {
			  System.out.println(zeile);	
			  zeile = messData.readLine();
			  //return zeile;
		  }
     }	 
}

Mein Problem bezieht sich jetzt auf "return zeile". wenn ich also oben statt void -> BufferedReader verwende, kommt er mit den unterschiedlichen Datentypen nicht zurecht, da zeile ein String darstellt. geht das überhaupt, das ich der Unterklasse einen unterschiedlichen Datentyp übergebe, aber einen anderen an die main-Klasse zurück lieferen ?


----------



## Kai008 (15. Juni 2010)

Dann schreine String statt BufferedReader hin. -.-


----------



## Migelito (15. Juni 2010)

Sorry Kai008 das geht leider nich, da ich aus meiner Hauptklasse einen BufferedReader-Typ übergebe. 

public static void main(Strings[], args){
....
BufferedReader messData = new BufferedReader(cach);
mess.test(messData);       // Übergabe an Klasse holdMessData
....
}

Daher muss doch der Datentyp meiner unterklasse "holdMessData" folgender sein:

public BufferedReader test(BufferedReader messData) throws IOException {

String zeile ="";		

		// Liest Werte aus Text-Datei Zeilenweise in String ein

		  while(zeile != null)
		  {
			  System.out.println(zeile);	
			  zeile = messData.readLine();
			  //return zeile;
		  }
     }	
Aber dann kann ich kein String zurück geben, oder? Gibt es da keine weitere lösung, vielleicht durch chasting oder soetwas


----------



## Kai008 (15. Juni 2010)

Du kannst nichts außer Object (Exception-Frei) zu einen String casten, da dieser Final ist.
Ich meinte, du sollst den Rückgabewert, und nicht den Parameter-Typ ändern.
Setze den Cursor mal in das return, welches dir Eclipse sicher als falsch markiert und drücke Controll + 1.


----------



## Migelito (15. Juni 2010)

ok wenn ich das mache gibt mir Eclipse zwei optionen an. 1. Option ich kann den Parameter-Typen in String umändern oder
2. option den return Wert in BufferedReader abänder. Wenn ich ein von beiden mache, beist sich immer der Hund in den Schwanz, weil die Methode readLine();
nicht mitspielen möchte (String-Methode).

Unterklasse "holeMessDat"
......
while(zeile != null)
		  {
			  System.out.println(zeile);	
			  zeile = messData.readLine();
			  return zeile;
		  }
....... 

Das ist aber auch verflixt und zugenäht!!


----------



## Kai008 (15. Juni 2010)

Ich bin mir sicher, das dir Eclipse NICHT anbietet, den Parameter-Typ zu ändern.
Mir ist gerade aufgefallen, das dein Code sowieso quatsch ist, da du mitten in der while das return benutzt. Und wenn dus so ließt (Lesevorgang in der Schleife) solltest du sowieso eine do verwenden.

Hier eine Methode an der ich gerade schreibe/geschrieben habe, damit du endlich kapierst wies geht. Nur anschauen.


```
boolean load(File databaseFile)
{
	boolean b = false;
	synchronized (LOCK_OBJECT)
	{
		ExecutorService service = Executors.newFixedThreadPool(1);
		Future<Byte> future = service.submit(new Load(databaseFile));
			
		boolean interrupted = false;
		do
		{
			try
			{
				future.get();
				b = true;
			}
			catch (InterruptedException e)
			{
				interrupted = true;
			}
			catch (Exception e)
			{
				b = false;
			}
			finally
			{
				service.shutdown();
			}
		}
		while(interrupted);
	}
	return(b);
}
```


----------



## Migelito (15. Juni 2010)

..geil! hat funktioniert und dein Beispile war auch sehr aufschlussreicht.

hab nur das "return zeile" aus der Schleife genommen und danach platziert und oben im Methoden-Kopft, BufferedReader durch String ersetzt und allas war geritzt.

Danke vielmals für deine Hilfe noch zu später Stunde ^^

Gruß.


----------



## zerix (15. Juni 2010)

Hallo,

irgendwie stehst du dir beim Programmieren selbst im Weg. 
Dir wird gesagt, dass du bei deiner Methode test einen Übergabe-Parameter definieren sollst, vom Typ String. Diesen String willst du dann nachher zurückgeben. Aus irgendeinem Grund änderst du deshalb String in BufferedReader und stehst vor einem Problem, weil du BufferedReader nicht in einen String casten kannst. Dabei hattest du vorher einen String.



> wie geht das mit einer coll by value Class?



Es gibt keine call-by-value class. Call-by-Value heißt einfach, dass der Wert bei der Übergabe zu einer Methode kopiert wird. 

Gruß

Sascha


----------



## Kai008 (15. Juni 2010)

Wenn du nur die beiden Änderungen vorgenommen hast wirst du aber bloß die letzte Zeile der Datei bekommen, da du innerhalb der Schleife die Variable zeile immer nur auf eine andere String-Instanz verweisen lässt.

Ach ja, package schreibt man klein, Klassen groß.


----------

