Objektvariablen haben den gleichen Wert - warum?

Nemesys88

Bekanntes Mitglied
Hallo zusammen!

Ich sehe mal wieder den Wald vor lauter Bäumen nicht... 😀

Habe ein ganz einfaches, kleines, kurzes Programm indem es um Bankkunden und ihre Konten geht.
Das Programm soll nichts anderes machen als die Beziehung Kunde -> Konto zu symbolisieren.

So soll ich "Alle Konten eines Kunden" anzeigen können, sowie "alle Besitzer eines Kontos" (1-3).

Ich habe jetzt folgendes Programm geschrieben:

Java:
package Bank;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	
	private static Konto[] konten = new Konto[20];
	private static Kunde[] besitzer = new Kunde[20];

	public static void main(String[] args) {
		
		Kunde p1 = new Kunde();
		p1.setName("Toni");
		p1.setAdresse("Milchstraße 14");
		
		Kunde p2 = new Kunde();
		p2.setName("Lola");
		p2.setAdresse("Blingstraße 3");
		
		Kunde p3 = new Kunde();
		p3.setName("Hugo");
		p3.setAdresse("Straße 1");
		
		Konto k1 = new Konto();
		k1.setKontonummer(14235325);
		
		Konto k2 = new Konto();
		k2.setKontonummer(12543234);
		
		Konto k11 = new Konto();
		k11.setKontonummer(17634345);
		
		Konto k22 = new Konto();
		k22.setKontonummer(163423413);
		
		konten[0] = k1;
		konten[1] = k22; 
		p1.setKonten(konten);
		
		konten[0] = k2;
		konten[1] = k11;
		p2.setKonten(konten);
		
		konten[0] = k1;
		konten[1] = k11;
		p3.setKonten(konten);
		
		/*---------------------*/
		
		besitzer[0] = p1;
		besitzer[1] = p3;
		k1.setBesitzer(besitzer);
		
		besitzer[0] = p2;
		k2.setBesitzer(besitzer);
		
		besitzer[0] = p2;
		besitzer[1] = p3;
		k11.setBesitzer(besitzer);
		
		besitzer[0] = p1;
		k22.setBesitzer(besitzer);
		
		showmenue();

		BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
		String zeile = null;

		while (true)	
		{
			try {
				zeile = console.readLine();
			} catch (IOException e) {
				e.printStackTrace();
			}
	
			switch (zeile)
			{
				case "1": System.out.println("Kunde wählen (p1,p2,p3):");
					break;
			
				case "2": System.out.println("Konto wählen (k1,k2,k11,k22):");
	           	    break;
	           	    
				case "p1": System.out.println("Konten von Kunde p1: \n");
						   for (Konto i : p1.getKonten())
						   {
							   if (i != null)
							   {
							   System.out.println(i.getKontonummer());
							   }
							   else 
							   {
								   try {
									System.out.println("\n<Bitte Taste drücken>");
									System.in.read();
								} catch (IOException e) {
									// TODO Auto-generated catch block
									e.printStackTrace();
								}
									break;  
							   }
						   }
						   showmenue();
					break;
					
				case "p2": System.out.println("Konten von Kunde p2: \n");
				for (Konto i : p2.getKonten())
				   {
					   if (i != null)
					   {
					   System.out.println(i.getKontonummer());
					   }
					   else 
					   {
						   try {
							System.out.println("\n<Bitte Taste drücken>");
							System.in.read();
						} catch (IOException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
							break;  
					   }
				   }
				   showmenue();
			break;
		          	
			case "p3":
				System.out.println("Konten von Kunde p3: \n");
				for (Konto i : p3.getKonten()) {
					if (i != null) {
						System.out.println(i.getKontonummer());
					} else {
						try {
							System.out.println("\n<Bitte Taste drücken>");
							System.in.read();
						} catch (IOException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						break;
					}
				}
				showmenue();
			break;
		  		   	
				case "k1": System.out.println("Besitzer von Konto k1: \n");
						   for (Kunde i : k1.getBesitzer())
						   {
								if (i != null) {
									System.out.println(i.getName());
								} else {
									try {
										System.out.println("\n<Bitte Taste drücken>");
										System.in.read();
									} catch (IOException e) {
										// TODO Auto-generated catch block
										e.printStackTrace();
									}
									break;
								}
							}
							showmenue();
						break;
		   	
				case "k2": System.out.println("Konten von Konto k2: \n");
					 	    for (Kunde i : k2.getBesitzer())
					 	   {
								if (i != null) {
									System.out.println(i.getName());
								} else {
									try {
										System.out.println("\n<Bitte Taste drücken>");
										System.in.read();
									} catch (IOException e) {
										// TODO Auto-generated catch block
										e.printStackTrace();
									}
									break;
								}
							}
							showmenue();
						break;
		   	
				case "k11": System.out.println("Konten von Konto k11: \n");
		   		            for (Kunde i : k11.getBesitzer())
		   		         {
		   						if (i != null) {
		   							System.out.println(i.getName());
		   						} else {
		   							try {
		   								System.out.println("\n<Bitte Taste drücken>");
		   								System.in.read();
		   							} catch (IOException e) {
		   								// TODO Auto-generated catch block
		   								e.printStackTrace();
		   							}
		   							break;
		   						}
		   					}
		   					showmenue();
		   				break;
		   	
				case "k22": System.out.println("Konten von Konto k22: \n");
		   		   			for (Kunde i : k22.getBesitzer())
		   		   		{
		   						if (i != null) {
		   							System.out.println(i.getName());
		   						} else {
		   							try {
		   								System.out.println("\n<Bitte Taste drücken>");
		   								System.in.read();
		   							} catch (IOException e) {
		   								// TODO Auto-generated catch block
		   								e.printStackTrace();
		   							}
		   							break;
		   						}
		   					}
		   					showmenue();
		   				break;
			
				default:  showmenue();
		            break;
			}	
		}
		
	}
	
	public static void showmenue()
	{
		System.out.println("Kontenverwaltung");
		System.out.println("----------------\n");
		System.out.println("Was möchten Sie tun?\n");
		System.out.println("Alle Konten eines Kunden anzeigen (1)");
		System.out.println("Alle Besitzer eines Kontos anzeigen (2)\n");
		
		
	}

}

Dazu gehört noch die Klasse Kunde:

Java:
package Bank;

import java.util.ArrayList;
import java.util.Date;

import Bank.Kontobewegung;

/**
 * Die Klasse Kunde. Eine Person wird durch eine Kontoeröffnung zu einem Kunden.
 */
public class Kunde extends Person {
	/**
	 * Die Konten eines Kunden.
	 */
	private Konto[] konten = new Konto[20];
	/**
	 * Der Name eines Kunden.
	 */
	private String name;
	/**
	 * Die Adresse des Kunden.
	 */
	private String adresse;
	/**
	 * Datum der ersten Kontoeröffnung.
	 */
	private Date kontoeröffnung;
	public ArrayList<Kontobewegung> zwischen_dem_Kunden_und_seinem_Konto_gibt_es_Konto_Geld__bewegungen = new ArrayList<Kontobewegung>();

	public Konto[] getKonten() {
		return this.konten;
	}

	public void setKonten(Konto[] _konten) {
		this.konten = _konten;
	}

	public String getName() {
		return this.name;
	}

	public void setName(String _name) {
		this.name = _name;
	}

	public String getAdresse() {
		return this.adresse;
	}

	public void setAdresse(String _adresse) {
		this.adresse = _adresse;
	}

	public Date getKontoeröffnung() {
		return this.kontoeröffnung;
	}

	public void setKontoeröffnung(Date _kontoeröffnung) {
		this.kontoeröffnung = _kontoeröffnung;
	}
}

und die Klasse Konto:

Java:
package Bank;

import java.util.ArrayList;
import java.util.Date;

/**
 * Klasse Konto. Symbolisiert das Konto eines Kunden.
 */
public class Konto {
	/**
	 * Beinhaltet die Besitzer eines Kontos.
	 */
	private Kunde[] besitzer = new Kunde[20];
	/**
	 * Der Kontostand eines Kontos.
	 */
	private double kontostand;
	/**
	 * Der Habenzins eines Kontos.
	 */
	private double habenzins;
	/**
	 * Die eindeutige Kontonummer eines Kontos.
	 */
	private int kontonummer;
	/**
	 * Das Datum der letzten Zins-Gutschrift/Abbuchung.
	 */
	private Date letzte_Gutschrift_Abbuchung;
	public ArrayList<Kontobewegung> zwischen_dem_Kunden_und_seinem_Konto_gibt_es_Konto_Geld__bewegungen = new ArrayList<Kontobewegung>();

	public Kunde[] getBesitzer() {
		return this.besitzer;
	}

	public void setBesitzer(Kunde[] _besitzer) {
		this.besitzer = _besitzer;
	}

	public double getKontostand() {
		return this.kontostand;
	}

	public void setKontostand(double _kontostand) {
		this.kontostand = _kontostand;
	}

	public double getHabenzins() {
		return this.habenzins;
	}

	public void setHabenzins(double _habenzins) {
		this.habenzins = _habenzins;
	}

	public int getKontonummer() {
		return this.kontonummer;
	}

	public void setKontonummer(int _kontonummer) {
		this.kontonummer = _kontonummer;
	}

	public Date getLetzte_Gutschrift_Abbuchung() {
		return this.letzte_Gutschrift_Abbuchung;
	}

	public void setLetzte_Gutschrift_Abbuchung(Date _letzte_Gutschrift_Abbuchung) {
		this.letzte_Gutschrift_Abbuchung = _letzte_Gutschrift_Abbuchung;
	}

	public void addZinsen() {
		throw new UnsupportedOperationException();
	}

	public void delete() {
		throw new UnsupportedOperationException();
	}
}

Wenn ich das Programm jetzt ausführe und wähle im Menü 1 und dann P1 so werden mir dieselben Konten angezeigt als wenn ich 1 > P2 drücke.

Ich dachte eigentlich ich hätte die entsprechenden Konten an p1 übergeben, sodass ich keine Gefahr darin sah die Variable 'konten' (main.java ~ zeile 40) erneut wieder zu verwenden um andere konten an p2 zu übergeben.

Wo liegt der Fehler ?

(Ist bestimmt irgendwas total blödes aber ich sehe es grade einfach nicht...)

Danke schonmal! 🙂

Gruß
 
Java:
	private static Konto[] konten = new Konto[20];
	private static Kunde[] besitzer = new Kunde[20];
......
		
		konten[0] = k1;
		konten[1] = k22; 
		p1.setKonten(konten);
		
		konten[0] = k2;
		konten[1] = k11;
		p2.setKonten(konten);
		
		konten[0] = k1;
		konten[1] = k11;
		p3.setKonten(konten);

Hier liegt dein Fehler.
Du hast ein Objekt (das Konto[] konten), diesem weist du für den Index 0 und 1 jeweils ein Konto zu.
An "p1" übergibst du diese Objekt. Danach veränderst du dasgleiche(!!!) Objekt indem du wieder für Index 0 bzw. 1 jeweils ein Konto setzt.

Du musst natürlich jeder Person/jedem Kunden ein eigenes Objekt (=> Konto[]) geben.
 
Ok danke, jetzt funktioniert es.

Aber ganz verstanden habe ich es noch nicht...

Kann ich konten denn nicht als temporäre Variable benutzen ?
Nach dem Motto: Speicher in variable a eine 2, übergib die 2 an Kunde1
Speicher in variable a eine 5, übergib die 5 an Kunde 2
 
In java gibt es den Unterschied zwischen primitiven Typen und Objekten. Primitive sind so etwas wie int, boolean etc...
Bei diesen würde es so wie du sagst funktionieren.

Bei Objekten wird mit REFERENZEN gearbeitet, dass bedeutet eine Variable eines Objekts speichert nur den Speicherort des Objektes. Wenn du jetzt wie in deinem Fall DEN SPEICHERORT an ein anderes Objekt mitgibst und dein erstes Objekt ändert an diesem Speicherort die Daten hat auch das 2te Objekt die geänderten Daten.

Hab ich mich irgendwie verständlich ausgrdrückt oder verplappert?

Das heisst in Zeile 10 und 11 überschreibst du die Daten somit auch für p1.

Gruß Helmut
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben