# Objekt einem anderen Objekt zuweisen



## cboy (27. Mai 2011)

Achtung, Code hat sich doch um einiges geändert, bitte den Post unten anschauen, habe auch dort nochmal ausführlicher erklärt um was es geht. Danke vielmals für die Antworten 

Hallo,
wir nehmen gerade Objektorientierung in Java durch. Also folgendes: Ich habe eine

Klasse Mensch mit den Attributen
-name: String, vorname: String
und der Methode
- geldEinzahlen()

Ebenso habe ich die Klasse Sparbuch mit den Attributen
-kontoname: String, sparbetrag: double
und der Methode
-getKontostand()
und dem Interface Einzahlbar

Den Quelltext hab ich zur besseren Übersicht übrigens alles unten. Also, ich habe zuerst eine Assoziation mit dem Attribut kontozugehoerigkeit zwischen Sparbuch und Mensch hergestellt. Die Methode vom Interface Einzahlbar soll prüfen, ob der eingezahlte Betrag positiv ist und soll einen boolean-Wert zurückgeben, ob es verbucht werden kann. 

Meine Frage: Wie muss der Konstruktor von Sparbuch/Mensch aussehen, wenn ich direkt mit dem Menschen auch ein Konto eröffne mit einer bestimmten Einzahlung, die dann auch gleich geprüft wird? Ich mein, ich weis nicht, wie ich allgemein wenn ich den Mensch anlege, ihm gleich ein Sparbuc zufüge mit dieser Einzahlung.

Habe schon überall im Internet geschaut, und auch Bücher durchgewälzt, aber dazu leider nichts gefunden. Bin für jede Hilfe dankbar.

Quellcode:



```
public class Sparbuch implements Einzahlbar{
	
	private double kontostand;
	private String kontoname;
	
	
	
	//Assoziation
	private Mensch kontozugehoerigkeit;
	
	//Setter- und Getter-Methoden von Assoziation
	public Mensch getKontozugehoerigkeit(){
		return kontozugehoerigkeit;
	}
	
	public void setAbteilungszugehoerigkeit(Sparbuch abteilungszugehoerigkeit){
		abteilungszugehoerigkeit = abteilungszugehoerigkeit;
	}
	
	
	//Getter-Methode für Kontostand
	public double getKontostand (){
		return kontostand;
	}


	//Prüfen, ob Betrag>0 ist
	public boolean betragEinzahlen (double einzahlBetrag){
		if(einzahlBetrag>0){
			return true;
		}
		else{
			return false;
		}
	}
		
	
}
```




```
public class Mensch {
	
	private String name;;
	private String vorname;
	
	//Assoziation
	private Sparbuch kontozugehoerigkeit;
	
	//Setter- und Getter-Methoden von Assoziation
	public Sparbuch getKontozugehoerigkeit(){
		return kontozugehoerigkeit;
	}
	
	public void setAbteilungszugehoerigkeit(Sparbuch abteilungszugehoerigkeit){
		abteilungszugehoerigkeit = abteilungszugehoerigkeit;
	}
	

}
```




```
interface Einzahlbar {
	
	public boolean betragEinzahlen (double betrag);

}
```



```
public class Startklasse {

	public static void main(String[] args) {
		
		
	}

}
```


----------



## Michael... (27. Mai 2011)

cboy hat gesagt.:


> Meine Frage: Wie muss der Konstruktor von Sparbuch/Mensch aussehen, wenn ich direkt mit dem Menschen auch ein Konto eröffne mit einer bestimmten Einzahlung, die dann auch gleich geprüft wird? Ich mein, ich weis nicht, wie ich allgemein wenn ich den Mensch anlege, ihm gleich ein Sparbuc zufüge mit dieser Einzahlung.


Deine Frage oder die Frage der Aufgabenstellung? ;-)
Der gepostete Quellcode von Mensch und Sparbuch ist so vorgegeben? Sollte die Methode betragEinzahlen() im Falle eines positiven Wertes nicht den Kontostand erhöhen?

Ich würde mal sagen ein Sparbuch ohne Mensch kann (zumindest über längere Zeit) nicht bestehen.
Daher würde ich im Konstruktor von Mensch ein Sparbuch erzeugen. Falls ein Startguthaben gewünscht ist muss eben die Methode betragEinzahlen() mit dem Startbetrag ausgeführt werden. Falls die beidseitige Assoziation gewünscht ist muss der Sparbuch per Konstruktor oder set Methode einer Referenz auf ein Mensch Objekt übernehmen können.

So nebenbei: Den Sinn des Interfaces bzw. warum diese Methode in ein Interface ausgelager wurde muss man in diesem Kontext nicht verstehen?
Klasse Mensch und Sparbuch besitzen beide eine Methode setAbteilungszugehoerigkeit(Sparbuch abteilungszugehoerigkeit) ?


----------



## traps12 (27. Mai 2011)

```
public class Mensch{
   Sparbuch sparbuch;
   ...
   public Mensch(String vorname, String nachname, double betrag){
     
    this.vorname = vorname;
    this.nachname = nachname;
    sparbuch = new Sparbuch(betrag);
    }
```

...falls du ein Startguthaben haben sollst. du kannst es natürlich auch so machen wie michael es erklärt hat mit setEinzahlen...


----------



## cboy (28. Mai 2011)

Hallo,
danke für die Antworten.
Vielleicht erkläre ich nochmal kurz, wie alles funktionieren soll: Wir sollen eine Klasse Mensch anlegen, die einen Namen und einen Vornamen als Attribut haben. Mit dem Attribut kontozugehoerigkeit habe ich eine Assoziation zwischen Mensch und der Klasse Sparbuch hergestellt, damit ich ein Sparbuch dem passenden Menschen zuordnen kann. Danach habe ich bei der Klasse Sparbuch 2 Konstruktoren erstellt. Einen, der ein kontoname (also eine kontonummer) und eine ersteinzahlung bekommt, der andere Konstruktor bekommt nur den Namen übergeben und setzt den Kontostand auf 0. In der Klasse Mensch habe ich ein Konstruktor erstellt, der einen namen, vornamen, kontonamen und eine ersteinzahlung übertragen bekommt. Dieser Konstruktor soll dann auch gleich ein neues Sparbuch erstellen, dass dem Menschen zugeordnet wird mit dem kontoname und der ersteinzahlung. Ebenfalls habe ich noch in der Klasse einen weiteren Konstruktor eingestellt, der aber keine ersteinzahlung mit bekommt, also ersteinzahlung=0, d.h. kontostand=0. 

So, dann habe ich versucht in der Klasse Startklasse 2 Objekte zu erzeugen. Leider bekomme ich immer, wenn ich den namen und vornamen ausgeben will "null" in der Konsole und wenn ich kontoname und kontostand bekommen will folgende Fehlermeldung:
Exception in thread "main" java.lang.NullPointerException
	at Startklasse.main(Startklasse.java:14)

Und ich weis leider nicht, warum das Programm nicht die Objekte mit den Attributswerten ausstattet und mir so zurückgibt 



```
public class Sparbuch implements Einzahlbar{
	
	private double kontostand;
	private String kontoname;
	
	//Neuer Konstruktor mit Ersteinzahlung
	Sparbuch (String kontoname, double ersteinzahlung){
		kontoname = kontoname;
		if(betragEinzahlen(ersteinzahlung)){
			kontostand = ersteinzahlung;
		}
		else{
			kontostand=0;
		}
	}
	
	//Neuer Konstruktor ohne Ersteinzahlung, d. h. einzahlung=0
	Sparbuch (String kontoname){
		this(kontoname,0);
	}
	

	//Assoziation
	private Mensch kontozugehoerigkeit;
	
	//Setter- und Getter-Methoden von Assoziation
	public Mensch getKontozugehoerigkeit(){
		return kontozugehoerigkeit;
	}
	
	public void setKontozugehoerigkeit(Sparbuch kontozugehoerigkeit){
		kontozugehoerigkeit = kontozugehoerigkeit;
	}
	
	
	//Getter-Methode für Kontostand/Kontoname
	public double getKontostand (){
		return kontostand;
	}
	
	public void setKontostand(double kontostand){
		this.kontostand=kontostand;
	}
	

	public String getKontoname (){
		return kontoname;
	}
	
	public void setKontoname(String kontoname){
		this.kontoname=kontoname;
	}
	
	

	public boolean betragEinzahlen (double einzahlBetrag){
		if(einzahlBetrag>0){
			return true;
		}
		else{
			return false;
		}
	}
		
	
}
```




```
public class Mensch{
	private String name;
	private String vorname;
	
	//Setter- und Getter-Mathoden
	public void setName(String name){
		this.name=name;
	}
	
	public void setVorname (String vorname){
		this.vorname=vorname;
	}
	
	public String getName (){
		return name;
	}
	
	public String getVorname(){
		return vorname;
	}

	Sparbuch sparbuch;
	
	//Möglicher anderer Konstruktor
	public Mensch(String name, String vorname, String kontoname, double betrag){
		vorname = vorname;
		name = name;
		sparbuch= new Sparbuch(kontoname, betrag);
	}
	
	//Möglicher anderer Konstruktor ohne Ersteinzahlung
	public Mensch (String name, String vorname, String kontoname){
		vorname = vorname;
		name = name;
		sparbuch = new sparbuch(kontoname);
	}
	
	
	//Assoziation
	private Sparbuch kontozugehoerigkeit;
	
	//Setter- und Getter-Methoden von Assoziation
	public Sparbuch getKontozugehoerigkeit(){
		return kontozugehoerigkeit;
	}
	
	public void setKontozugehoerigkeit(Sparbuch kontozugehoerigkeit){
		kontozugehoerigkeit = kontozugehoerigkeit;
	}
	

}
```





```
interface Einzahlbar {
	
	public boolean betragEinzahlen (double betrag);

}
```



```
public class Startklasse {

	public static void main(String[] args) {
	
		//Kunde mit Konto anlegen mit Ersteinzahlung
		Mensch mensch1 = new Mensch ("Peter","Baa","001",200);
		
		//Kunde mit Konto anlegen ohne Ersteinzahlung
		Mensch mensch2 = new Mensch ("Luis","Taa","002");
		
		System.out.println ("Erster Kunde:\n"
							+"Name: "+mensch1.getName()+", Vorname: "+mensch1.getVorname()
							+"Kontonummer: "+mensch1.getKontozugehoerigkeit().getKontoname()
							+"Kontostand: "+mensch1.getKontozugehoerigkeit().getKontostand());
		
		System.out.println ("Zweiter Kunde:\n"
				+"Name: "+mensch2.getName()+", Vorname: "+mensch2.getVorname()
				+"Kontonummer: "+mensch2.getKontozugehoerigkeit().getKontoname());
		
		
		
	}

}
```


----------



## Gast2 (28. Mai 2011)

```
private Sparbuch kontozugehoerigkeit;
```
Du legst hier nur eine Variable an, der inhalt ist null.


----------



## cboy (28. Mai 2011)

Entschuldigung, das habe ich jetzt nicht verstanden. Gibt es denn noch eine andere Möglichkeit, wie ich das machen hätte können?


----------



## Gast2 (28. Mai 2011)

z.b.

```
private Sparbuch kontozugehoerigkeit = new Sparbuch();
```
Du musst halt irgendwo nen Objekt anlegen


----------



## cboy (28. Mai 2011)

Ja, aber wenn ich


```
private Sparbuch kontozugehoerigkeit = new Sparbuch();
```

in der Klasse Mensch mache steht da folgender Fehler:
"The Constructor Sparbuch is undefined"

Oder muss das in die Klasse Sparbuch?


----------



## Gast2 (28. Mai 2011)

Nein, es gibt einfach den leeren Konstruktor nicht. Da musst du dann schaun welchen von deinen beiden Konstruktoren du aufrufen willst.


----------



## cboy (28. Mai 2011)

Also wenn ich den Konstruktor mit den Parameter kontoname und betrag aufrufen möchte müsste ich das so machen? 


```
private Sparbuch kontozugehoerigkeit = new Sparbuch(kontoname, betrag);
```

Oder schreibe ich das direkt in meinen Konstruktor rein also so:


```
public Mensch (String name, String vorname, String kontoname, double betrag){
		vorname = vorname;
		name = name;
		
		konto = new Sparbuch(kontoname, betrag);
		konto.setKontozugehoerigkeit(konto);
	}
```


----------

