Objekterzeugung im Konstruktor - Mehrfach gleiche Referenzvariable?

Jack159

Bekanntes Mitglied
Hallo,

Ich habe hier eine Übungsaufgabe, die ich bearbeitet habe. Teils musste ich dazu in die Musterlösung schauen, die mich etwas verwundert hat. In der Übung geht es eigentlich darum, Objekte zu klonen, aber meine Frage bezieht sich auf den Konstruktor der Klasse Auto.

Im Konstruktor der Klasse Auto steht folgendes:
Java:
reifen = new AutoReifenSatz(typ2, anzahl);
Bedeutet also: Jedes mal, wenn ich ein Auto-Objekt erstelle, wird mir auch ein AutoReifenSatz-Objekt erstellt. Das Autoobjekt hat dann die Referenz zu diesem AutoReifenSatz.
Was ich aber irgendwie unlogisch finde ist, wenn ich mehr als 1 Autoobjekt erzeuge (Z.b. 3 Autos). Dann gäbe es doch auch 3 AutoReifenSatzObjekte, allerdings alle mit der selben Referenzvariable "reifen". Wieso funktioniert das?
Ich kann ja auch nicht z.b. 3 Integer-Variablen erstellen, die alle den selben Namen haben:
Java:
int x = 5;
int x = 5421;
int x = 7;



Hier der Code:

Java:
public class AutoReifenSatz {

	private String typ;
	private int anzahl;
	
	public AutoReifenSatz(String typ, int anzahl) {
	
		this.typ = typ;
		this.anzahl = anzahl;
	
	}
	
	
	public String getTyp(){
	
		return typ;
	}
	
	
	public int getAnzahl(){
	
		return anzahl;
	}
	
	
	void setTyp(String typ){
	
		this.typ = typ;
	}
	
	
	void setAnzahl(int anzahl){
	
		this.anzahl = anzahl;
	}
	
}

Java:
public class Auto implements Cloneable {

	private String typ;
	private AutoReifenSatz reifen;
	
	public Auto(String typ, String typ2, int anzahl) {
		this.typ = typ;
		reifen = new AutoReifenSatz(typ2, anzahl);
	}
	
	void setTyp(String typ) {
		this.typ = typ;
	}
	
	void setAutoReifenSatz(AutoReifenSatz reifen) {
		this.reifen = reifen;
	}
	
	public String getTyp() {
		return typ;
	}
	
	public AutoReifenSatz getReifen() {
		return reifen;
	}
	
	public String toString() {
		return "Autotyp: "+this.typ+"\n Reifenanzahl: "+reifen.getAnzahl()+"\n Reifentyp: "+reifen.getTyp()+"\n";
	}
	
	public Auto clone() throws CloneNotSupportedException {
		return (Auto)super.clone();
	}

}

Java:
public class App {
	
	public static void main(String[] args) throws CloneNotSupportedException {
		
		Auto Audi = new Auto("Audi", "SommerReifen", 4);
		Auto Mercedes = Audi.clone();
		Mercedes.setTyp("Mercedes");
		Mercedes.getReifen().setTyp("Winterreifen");
		
		System.out.println(Audi.toString());
		System.out.println(Mercedes.toString());
	}

}
 
Die Objekte sind lokal d.h. jedes Auto heißt anders und legt seine eigenen Reifen/Reifensatzobjekte an, ob mich gleichem Namen oder nicht. Das ist ähnlich wie dies:

Java:
String name = "Peter";

String Name(String name) {
return name;
}
System.out.println(name) // Peter
System.out.println(Name(Klaus)) // Klaus

Hierbei gibt es auch 2 Variablen mit dem gleichem Namen und Typ doch trotzdem werden beide nicht überschrieben sondern existieren nebeneinander weiter.
 
Wo liegt denn das Problem?

Du kannst innerhalb einer Klasse (z.B. Auto) nicht mehrere Referenzen mit dem gleichen Namen haben, das ist richtig. Aber jedes Objekt, dass du mit dieser Klasse erstellst, darf seine eigene Referenz "reifen" haben. Davon, dass es noch andere Objekte geben könnte, die auch eine Referenz "reifen" haben, weiß das Objekt ja nichts. 😉



Meistens wird es so erklärt: Die Klasse "Auto" ist gewissermaßen nur die Vorlage, die Konstruktionszeichnung, mit deren Hilfe du ein Auto herstellen kannst. Ein bestimmtes Auto-Objekt, das mit dieser Vorlage erstellt wird(also z.B. mit
Java:
Auto audi = new Auto("Audi", "SommerReifen", 4)
), ist dann tatsächlich das Auto.

Es wäre natürlich Unsinn, wenn die Klasse Auto mehrere "reifen"-Referenzen hätte, denn ein Auto braucht ja nur einen Satz Reifen. Jedes Auto-Objekt hat aber natürlich seinen eigenen Satz Reifen und damit seine eigene "reifen"-Referenz.
 
Ahh ok, also praktisch so ähnlich wie bei Objektvariablen. In der Autoklasse steht ja z.b.
Java:
private String typ;
Jedes Autoobjekt hat eine eigene Variable "typ".

Habe es verstanden, danke euch 😉
 
Kurz will ich noch was gesagt haben:

Meiner Meinung nach müsste die Klasse hier "Autosammlung" heißen, denn wenn man eine Anzahl festlegen kann, ist das Objekt eben kein Auto, sondern eine Autosammlung.
 

Neue Themen


Zurück
Oben