Objektvariablen haben den gleichen Wert - warum?

Nemesys88

Bekanntes Mitglied
Hallo zusammen!

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

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ß
 

Joose

Top Contributor
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.
 

Nemesys88

Bekanntes Mitglied
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
 

Admiral Helmut

Aktives Mitglied
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:
Ähnliche Java Themen
  Titel Forum Antworten Datum
KogoroMori21 Objektvariablen, Klassenvariablen, Instanzvariablen Java Basics - Anfänger-Themen 1
T Datentypen Warum mit Konstruktor Objektvariablen initalisieren? Java Basics - Anfänger-Themen 19
W Was passiert mit Objekten die nicht in Objektvariablen initialisiert werden ? Java Basics - Anfänger-Themen 3
B Variablen Objektvariablen ständig überprüfen Java Basics - Anfänger-Themen 3
D Objektvariablen in Testklasse ausgeben Java Basics - Anfänger-Themen 6
J Objektvariablen in eine Datei schreiben Java Basics - Anfänger-Themen 2
C Dynamisch durch alle Objektvariablen eines Objektes iteriere Java Basics - Anfänger-Themen 15
C Gültigkeitsbereiche von Objektvariablen Java Basics - Anfänger-Themen 4
J 2 listen vergleichen, die auch null Elemente haben können ! Java Basics - Anfänger-Themen 9
TheSepp Nur Arrays ausgeben, die Werte zugewiesen haben. Java Basics - Anfänger-Themen 4
berserkerdq2 Zwei Klassen Erben von der Klasse A, die eine Klasse kann ich an Methoden übergeben, die als Parameter A haben, die andere nicht? Java Basics - Anfänger-Themen 3
K Für was braucht man die left und right shift operatoren? Was bringen die, also welchen Zweck haben die? Java Basics - Anfänger-Themen 15
M Wie können Klassen nicht-materialisierte Attribute haben, die nur über get/ set-Mehoden simuliert sind? Java Basics - Anfänger-Themen 6
E Meine JCombobox werte an ohne selectiert zu haben Java Basics - Anfänger-Themen 6
J Kreis soll die gleiche Fläche wie das Rechteck haben wie mache ich das? Java Basics - Anfänger-Themen 3
B Methoden Methoden haben kein Zugriff auf variablen Java Basics - Anfänger-Themen 4
A Haben KNNs ein Gedächtnis, lernen etwas oder verändern sich, während sie nicht trainieren, aber aktiv sind? Java Basics - Anfänger-Themen 3
C HashMap - alle keys haben values der letzten put-Anweisung Java Basics - Anfänger-Themen 3
M Erste Schritte Neuen Frame nur einmal offen haben Java Basics - Anfänger-Themen 6
K Methoden mit den Namen accept. Welche Funktion haben diese? Java Basics - Anfänger-Themen 2
K Welchen Typ haben Variablen in Default-Methoden und in statischen Methoden in Schnittstellen? Java Basics - Anfänger-Themen 4
Z Was habe ich davon mit einem Datentyp verschiedene Instanzen zu haben? Java Basics - Anfänger-Themen 6
T Wenn Schaltjahr ist, soll Februar, einen Tag mehr haben, GUI mit combobox Java Basics - Anfänger-Themen 4
B Warum haben Java Programme ein anderes Design? Java Basics - Anfänger-Themen 5
J Haben Chars wirklich keine KeyCodes? Java Basics - Anfänger-Themen 12
J Wie behalten Variablen den Wert, den sie in einer anderen Methode erhalten haben? Java Basics - Anfänger-Themen 14
M Class will alle Variablen als static haben Java Basics - Anfänger-Themen 11
T Doublezahlen haben ein E Java Basics - Anfänger-Themen 12
J Welchen Sinn haben abstrakte Methoden? Java Basics - Anfänger-Themen 4
B Was für Aufgaben haben die einzelne Entwurfsmuster? Java Basics - Anfänger-Themen 9
E BlockChallenge: Klötze haben keinen anschlag Java Basics - Anfänger-Themen 10
E Object als Parameter das Unbekannt ist, aber ein bestimmtes Interface haben muss Java Basics - Anfänger-Themen 3
M möchte in konstrukturaufruf eine bedingte anweisung haben. Java Basics - Anfänger-Themen 6
T Variablen haben null Wert in try-Anweisung Java Basics - Anfänger-Themen 4
L Array von Buttons, jeder soll MouseListener haben Java Basics - Anfänger-Themen 5
D Welchen Namen darf ein Konstruktor haben? Java Basics - Anfänger-Themen 6
M Warum können innere Klassen keine static-members haben? Java Basics - Anfänger-Themen 2
P Program funktioniert nur bei Rechner die jdk haben Java Basics - Anfänger-Themen 4
S Welche Bedeutung haben diese Wörter? Java Basics - Anfänger-Themen 2
Glühlampe Usereingabe in der gleichen Zeile ausgeben Java Basics - Anfänger-Themen 6
I 2 verschiedene Klassen mit gleichen Property vergleichen Java Basics - Anfänger-Themen 13
I Entity Objekt nicht gefunden -> Webhook empfangen in der gleichen Methode (Transaktion) Java Basics - Anfänger-Themen 37
N Verschiedene Konstruktoren mit gleichen Datentypen Java Basics - Anfänger-Themen 8
I JPA / Hibernate "Predicate" kombinieren in der gleichen Query Java Basics - Anfänger-Themen 1
sondr Anzahl der gleichen Positionen im Array Java Basics - Anfänger-Themen 3
E Best Practice Konstruktor mit bestehender Intanz der gleichen Klasse aufrufen Java Basics - Anfänger-Themen 4
J Erhöhen eines Values als Integer bei gleichen Keys in HashMap Java Basics - Anfänger-Themen 12
O Array nach gleichen Zahlen prüfen und ausgeben Java Basics - Anfänger-Themen 6
D Liste nach 2 gleichen Einträgen suchen Java Basics - Anfänger-Themen 4
L Eine Klasse aus dem gleichen Package starten Java Basics - Anfänger-Themen 3
B Datentypen Datentyp welcher den gleichen Namen wie die Klasse trägt? Java Basics - Anfänger-Themen 1
N Mit der gleichen BlockingQueue in zwei Klassen arbeiten Java Basics - Anfänger-Themen 12
AssELAss Datums-Objekt prüfen ob im gleichen Monat? Java Basics - Anfänger-Themen 5
V Anzahl von gleichen Werten in einem Int-Array ermitteln Java Basics - Anfänger-Themen 4
T Classpath Datei an dem gleichen Ort speichern Java Basics - Anfänger-Themen 9
L Array - Nach 2 gleichen Werten stoppen Java Basics - Anfänger-Themen 5
J Zweimal im gleichen Paint-Fenster malen Java Basics - Anfänger-Themen 8
T List mit mehreren gleichen Strings bereinigen Java Basics - Anfänger-Themen 4
S Strings und Binärdaten aus der gleichen Datei auslesen Java Basics - Anfänger-Themen 24
A Datei Lesen und Schreiben in gleichen Klasse Java Basics - Anfänger-Themen 3
C Objekt von Klasse im gleichen Paket erzeugen Java Basics - Anfänger-Themen 8
2 Hashmap mit gleichen Schlüsseln? Java Basics - Anfänger-Themen 3
A Stilfrage: statische Variable mit Instanz der gleichen Klasse Java Basics - Anfänger-Themen 8
B Class wird nicht gefunde obwohl sie im gleichen Ordner liegt Java Basics - Anfänger-Themen 8
G Interfaces mit gleichen Methoden Java Basics - Anfänger-Themen 4
J Verschiedene Ausgaben bei gleichen Ausdrücken (Typecasting?) Java Basics - Anfänger-Themen 5
M mehreren klassen die gleichen funktionen bereitstellen? Java Basics - Anfänger-Themen 3
T 2D Array nach gleichen Werten durchsuchen Java Basics - Anfänger-Themen 6
S DAY_OF_WEEK liefert immer gleichen Wert Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben