OOP Instanzierung in verschiedenen Klassen

rhilge

Mitglied
Hallo,

ich habe ein grundsätzliches Verständnisproblem bezüglich folgender Klassen:

Java:
public class Main {

    public static void main(String[] args) {
        Flugzeug A = new Flugzeug();
        auto B = new auto();

        B.preis = 5;
        A.setAuto(B);
        System.out.println(B.preis);
    }
}

public class Flugzeug {
    public auto a;

    public void setAuto(auto a){
        this.a = a;
        this.a.preis = a.preis + 10;
    }

}

public class auto {
    public int preis;
}

Und zwar verstehe ich nicht warum 15 ausgegeben wird und nicht 5. Ich habe ja innerhalb der Klasse Flugzeug eine Instanz von auto. Das innerhalb dieser die Instanz a von auto den Preis von 15 hat leuchtet mir ein. Aber ich verstehe nicht, warum Die Instanz B von auto in der Main-Klasse ebenfalls den Preis 15 hat. Die Funktion setAuto innerhalb der Flugzeugklasse macht ja kein return oder sonstiges, dass der neue Wert in die "höhere Ebene zurück gegeben wird".
Sorry wegen der dämlichen Namen :)

Ich vermute mal ich denke da noch zu wenig Objektorientiert.

Kann mir jemand helfen?

Grüße
 

httpdigest

Top Contributor
Schau dir Flugzeug.setAuto() nochmal gaaaaanz genau an.
Im Aufruf von `A.setAuto(B);` übergibst du ja B. Und die Methode setAuto(), aufgerufen auf A, setzt ja sein `this.a` auf das Argument `a`, welches in diesem Fall zum Zeitpunkt des Aufrufes eben 'B' ist. Danach verändert die Zeile `this.a.preis = a.preis + 10;` den Preis von 'B' (was ja über den Parameter 'a' herein kam und jetzt auch `this.a` ist).
 

rhilge

Mitglied
Danke für die Antwort. Dein letzter Satz bereitet mir Kopfzerbrechen. Ist es also so, wenn ich innerhalb einer Methode einer Klasse ein Objekt manipuliere, dann wird das Objekt quasi "global" manipuliert, also auch da wo ich die Methode aufgerufen habe (hier die Main) und nicht nur innerhalb der Klasse (hier Flugzeug). Für mich sind die Instanzen von auto in Main und in Flugzeug zwei verschiedene Dinge, die nicht "synchronisiert" werden.
Kann nicht besser beschreiben wo bei mir das Problem liegt^^
 

httpdigest

Top Contributor
Objekte werden generell IMMER nur als Referenzen übergeben und niemals als Kopien.
Das Objekt "B" existiert also nur ein einziges Mal, und mit den Parametern und Zuweisungen erzeugst du also immer nur weitere "Zugriffspunkte" auf dasselbe Objekt (via dem `a` Parameter von setAuto()) und durch die Zuweisung von `this.a = a`.
Somit "zeigt" dann also sowohl `this.a` (vom Flugzeug) als auch der Parameter `a` von dem setAuto() Aufruf als auch die lokale Variable 'B' in main() auf dasslbe Objekt und jegliche Modifikation dieses Objektes (egal, durch welchen dieser Zugriffspunkte) verändert dasselbe eine Objekt.
 

rhilge

Mitglied
ok jetzt hab ich es verstanden :) Bin bei der Suche jetzt auch auf das Themengebiet flache und tiefe Kopie gestoßen. Das Scheint wohl das zu sein worüber ich gedanklich gestolpert bin.
Merci!
 

httpdigest

Top Contributor
Flache und tiefe Kopien sind nochmal wieder etwas anderes. Mit "flacher" Kopie bezeichnet man üblicherweise ein tatsächlich neu alloziiertes Objekt, bei dem aber nur die direkten Felder/Attribute (oder Array-Elemente im Falle eines Arrays) auf die Werte der jeweiligen Felder/Attribute (bzw. Array-Elemente) des kopierten Objektes gesetzt werden, ohne Objekte ihrerseits wieder zu kopieren.
Bei "tiefen" Kopien werden auch Felder/Attribute, die ihrerseits wieder Objekte/Arrays (und keine primitiven Typen) sind, rekursiv kopiert.
Was wir hier haben (einfache Zuweisung einer Referenz bzw. Übergabe als Argument beim Methodenaufruf), ist weder noch.
 

mihe7

Top Contributor
Im OO-Kontext redet man von Objekten und in dem Beispiel wird - genau wie bei Dir - kein Objekt kopiert. Daher ist es auch völlig unsinnig, hier von "flacher Kopie" zu sprechen.

Worum es sich sowohl in dem Beispiel als auch bei Dir handelt, ist eine einfache Zuweisung einer Referenz.

Ein Beispiel für eine flache Kopie wäre etwas wie
Java:
class Flugzeug {
    private Auto auto;

    public Flugzeug(Auto auto) {
        this.auto = auto;
    }
    public Flugzeug flacheKopie() {
        return new Flugzeug(this.auto);
    }
}

Mit der Methode flacheKopie liefert ein Objekt nun tatsächlich eine Kopie von sich selbst zurück. Die Kopie referenziert aber das selbe Auto-Objekt wie das Original. Das Auto-Objekt wird dabei also nicht kopiert. Das bezeichnet man als "flache" Kopie.

Nach dem Ausführen von flacheKopie() hat man drei Objekte: das originale Flugzeug, das kopierte Flugzeug und das Auto.

Für eine "tiefe" Kopie müsste man auch das Auto-Objekt kopieren. Dann hätte man vier Objekte: das originale Flugzeug, das kopierte Flugzeug, das originale Auto und das kopierte Auto.

Grafisch könnte man das so darstellen:
Code:
Ausgangssituation:

:Flugzeug
    |
    |
    v
  :Auto


Flache Kopie:

:Flugzeug     :Flugzeug
    |             |
    |             |
    +------+------+
           |
           |
           v
         :Auto

Tiefe Kopie:

:Flugzeug     :Flugzeug
    |             |
    |             |
    v             v
  :Auto         :Auto
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Erste Schritte Frage zu Instanzierung und Referenzen Java Basics - Anfänger-Themen 8
G unklares Verhalten nach Instanzierung neuer Klasse Java Basics - Anfänger-Themen 3
J Referenz und Instanzierung Java Basics - Anfänger-Themen 25
C String Objekte Vergleich je nach Instanzierung unterschiedlich!!?!! Java Basics - Anfänger-Themen 4
B Zwei Unterschiedliche Klassen bei Instanzierung Java Basics - Anfänger-Themen 5
neurox Datentypen Instanzierung eines Gernerischen Objektes? Java Basics - Anfänger-Themen 10
Luk10 Sinn von Instanzierung ohne Referenz Java Basics - Anfänger-Themen 7
F HashSet und LinkedHashSet Instanzierung warum so? Java Basics - Anfänger-Themen 7
F Verständnisfrage Objekt instanzierung / Polymorphie Java Basics - Anfänger-Themen 10
G import vs. direkte Instanzierung Java Basics - Anfänger-Themen 2
H Probleme mit der Instanzierung eines Objektes Java Basics - Anfänger-Themen 3
MoxMorris Einige Methoden aus verschiedenen Klassen nacheinander auszuführen läuft seltsam Java Basics - Anfänger-Themen 2
C Parameter in verschiedenen Anzahl und Typen Java Basics - Anfänger-Themen 6
I Verschiedenen WebApp kommunizieren lassen Java Basics - Anfänger-Themen 1
Bademeister007 Elemente aus zwei verschiedenen Arrays miteinander vergleichen und gegeben falls entfernen Java Basics - Anfänger-Themen 14
S Arraylist<Object> mit verschiedenen Objects ausgeben Java Basics - Anfänger-Themen 3
P Arrays mit verschiedenen Längen miteinander dividieren. Java Basics - Anfänger-Themen 1
W Mehrfach das gleiche Attribut für ein Objekt erzeugen (mit verschiedenen Werten) Java Basics - Anfänger-Themen 2
T Java Swing - Dreieck zeichnen mit verschiedenen Variablen Java Basics - Anfänger-Themen 8
A Methoden Array aus verschiedenen Methoden bearbeiten bzw. öffnen Java Basics - Anfänger-Themen 18
B Automatisch Objekte erzeugen mit verschiedenen Namen Java Basics - Anfänger-Themen 4
L Dynamische Anzahl an Arrays mit verschiedenen Namen erzeugen Java Basics - Anfänger-Themen 6
J Gleiche Methode in 2 verschiedenen Klassen - Lösung ? Java Basics - Anfänger-Themen 8
scratchy1 Argumente mit verschiedenen Schleifen ausgeben Java Basics - Anfänger-Themen 3
S Daten aus zwei Verschiedenen Tabellen in eine ArrayListe Java Basics - Anfänger-Themen 4
K die Source eines Events bei verschiedenen Quellen herausfinden Java Basics - Anfänger-Themen 1
T Classpath Zwei gleiche Dateinamen in verschiedenen Projekten möglich? Java Basics - Anfänger-Themen 13
S generische methode mit verschiedenen datentypen Java Basics - Anfänger-Themen 3
I Brauche Denkanstoß: Weitergabe von Kontaktinfos aus verschiedenen Kontaktformularen von Webseiten Java Basics - Anfänger-Themen 2
D Objekte mit verschiedenen Attributen erstellen Java Basics - Anfänger-Themen 3
B OOP Summe aus verschiedenen Instanzen einer Klasse berechnen Java Basics - Anfänger-Themen 2
A Eine Variable in verschiedenen Ereignisprozeduren benutzen Java Basics - Anfänger-Themen 7
N Verweise auf Variablen in verschiedenen Threads Java Basics - Anfänger-Themen 4
J JLabels in schleife erzeugen mit verschiedenen namen? Java Basics - Anfänger-Themen 5
H Java auf verschiedenen Plattformen Java Basics - Anfänger-Themen 3
I Ausgabe in verschiedenen Entwicklungsumgebungen anders Java Basics - Anfänger-Themen 6
L Threads Thread aus verschiedenen Klassen ansprechen Java Basics - Anfänger-Themen 11
J Probleme mit verschiedenen Private Klassen Java Basics - Anfänger-Themen 3
A Methode aus verschiedenen Klassen aufrufen Java Basics - Anfänger-Themen 8
T Dynamisches abarbeiten von statischen Methode aus verschiedenen Klassen. Java Basics - Anfänger-Themen 5
B Threads Geschwindigkeit der Befehle auf verschiedenen PCs gleich machen Java Basics - Anfänger-Themen 3
U Objekte in Array erstellen und Methode in verschiedenen klassen aufrufen Java Basics - Anfänger-Themen 5
M Anwendung in verschiedenen JREs Java Basics - Anfänger-Themen 42
C jar Datei auf verschiedenen Systemen ausführen Java Basics - Anfänger-Themen 7
SheldoN Töne abspielen auf verschiedenen Buttons Java Basics - Anfänger-Themen 17
J verschiedene Anweisungen bei verschiedenen Zuständen Java Basics - Anfänger-Themen 9
G String mit verschiedenen Zeichen analysieren Java Basics - Anfänger-Themen 5
K Datentypen Gleiche Zufallszahlen in verschiedenen Datenstrukturen Java Basics - Anfänger-Themen 6
T ArrayList mit verschiedenen Datentypen verhindern Java Basics - Anfänger-Themen 8
R Array aus verschiedenen Datentypen Java Basics - Anfänger-Themen 29
A JButtons dynamisch generieren mit verschiedenen actionhandlern Java Basics - Anfänger-Themen 6
K Collections Wie kann Ich eine Hashmap mit verschiedenen Hashsets füllen. Java Basics - Anfänger-Themen 4
K OOP Variablen aus verschiedenen Klassen Java Basics - Anfänger-Themen 4
E Auf Variablen in verschiedenen Klassen zugreifen? Java Basics - Anfänger-Themen 4
J OOP Ausgabe verschiedener Variabeln aus verschiedenen Subclasses Java Basics - Anfänger-Themen 2
Z Geschwindigkeitsunterschied bei verschiedenen Schreibweisen Java Basics - Anfänger-Themen 4
F Gleiche JUnit-Tests automatisert mit verschiedenen Methoden ausführen Java Basics - Anfänger-Themen 6
4 OOP Problem beim Speichern verschiedener Klassen in verschiedenen Dateien Java Basics - Anfänger-Themen 25
Hamstinator Design und Listener in verschiedenen Klassen Java Basics - Anfänger-Themen 6
B Teil eines Bild kopieren bei verschiedenen Zoomstufen Java Basics - Anfänger-Themen 3
M Sets:Ein Set aus zwei verschiedenen bilden Java Basics - Anfänger-Themen 13
babel ein Vector mit verschiedenen Werten auslesen und berechnen Java Basics - Anfänger-Themen 34
S Umsetzung von verschiedenen Anweisungen Java Basics - Anfänger-Themen 8
braindump Packages in verschiedenen Unterverzeichnissen Java Basics - Anfänger-Themen 3
A Frage zu verschiedenen Klassen Java Basics - Anfänger-Themen 11
C Auf ProgressBar von zwei verschiedenen .class Dateien zugrei Java Basics - Anfänger-Themen 2
A MainClass not Found auf verschiedenen Rechnern Java Basics - Anfänger-Themen 2
JohnMurdoch Methoden von verschiedenen Objekten in Liste aufrufen Java Basics - Anfänger-Themen 3
R Dateizugriff auf verschiedenen OS Java Basics - Anfänger-Themen 3
B LayoutManager Anorden von verschiedenen JPanels Java Basics - Anfänger-Themen 5
Q Labels auf verschiedenen Ebenen? Java Basics - Anfänger-Themen 5
G Jar-File erzuegen, das Code a verschiedenen Java Versionen? Java Basics - Anfänger-Themen 4
B JTextArea mit verschiedenen Fonts Java Basics - Anfänger-Themen 4
Bierhumpen Array gefüllt mit verschiedenen Werten Java Basics - Anfänger-Themen 7
C Programm mit verschiedenen wechselbaren Sprachen Java Basics - Anfänger-Themen 6
T arrays: Anzahl der verschiedenen Werte bestimmen Java Basics - Anfänger-Themen 7
C Globale Variablen und Array mit verschiedenen Typen Java Basics - Anfänger-Themen 3
G Aus verschiedenen Formaten ein Date-Objekt machen Java Basics - Anfänger-Themen 3
G Text aus verschiedenen Dateien in JTextArea laden Java Basics - Anfänger-Themen 3
J Methodenaufrufe abstrakte Klassen, Interfaces Java Basics - Anfänger-Themen 17
M Abstrakte Klassen - Notation Java Basics - Anfänger-Themen 9
Detlef Bosau Nachladen von Klassen zur Laufzeit Java Basics - Anfänger-Themen 24
M Anonyme Klassen - Warum wird in der Konsole nichts ausgegeben? Java Basics - Anfänger-Themen 1
I Klassen von einem package laden, Statisches Feld auslesen und Objekt erstellen Java Basics - Anfänger-Themen 8
I 2 verschiedene Klassen mit gleichen Property vergleichen Java Basics - Anfänger-Themen 13
C Array von Klassen Java Basics - Anfänger-Themen 2
monsterherz 2 Klassen daher Probs mit dem Dateinamen Java Basics - Anfänger-Themen 9
C Kommunikation zwischen 2 Klassen Java Basics - Anfänger-Themen 9
I JPA Query für mehrere Klassen Java Basics - Anfänger-Themen 3
I @Entity Klassen, Service Beans etc. aus einem Share Projekt beziehen? Java Basics - Anfänger-Themen 26
S IntelliJ geht alle Klassen durch Java Basics - Anfänger-Themen 9
I Gleiche Klassen und Methoden in unterschiedlichen Projekten nutzen Java Basics - Anfänger-Themen 2
T variablen klassen übergreifend Java Basics - Anfänger-Themen 12
N Klassen Methoden anderer Klassen aufrufen Java Basics - Anfänger-Themen 4
D Klassen Klassen Kommunikation Java Basics - Anfänger-Themen 12
Encera Auf Objekte aus anderer Klassen zugreifen Java Basics - Anfänger-Themen 20
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
M Andere Methoden in anderen Klassen aufrufen Java Basics - Anfänger-Themen 11
L Methoden in anderen Klassen nutzen Java Basics - Anfänger-Themen 6
D Klassen und Vererbung Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben