Objekt von welchem Typ?

JavaIsTheBest

Bekanntes Mitglied
Hallo,
nehmen wir an es gibt die Klassen Account und ChargedAccount. ChargedAccount erbt von Account. Jetzt wird diese Zeile geschrieben.

Account c1 = new ChargedAccount("...");

1. Von welchemTyp ist das Objekt c1 und warum (Account oder ChargedAccount)?
2. Warum schreibt man nicht einfach ChargedAccount c1 = new ChargedAccount("..."); ?
3. Warum ist es beim definieren eines Objekts erlaubt zwei unterschiedliche Datentypen zu wählen (hier z.B. Account und ChargedAccount)?
4. Warum ist es nicht umgekehrt möglich? Also so: ChargedAccount c1 = new Account("...");
 

InfectedBytes

Top Contributor
1. Die Variable c1 ist vom Typ Account, referenziert jedoch ein Objekt vom Typ ChargedAccount
2. Weil man es eben manchmal lieber allgemein halten möchte. Für die weitere Logik ist es nur wichtig, dass du einen Account hast, ob das jetzt im Detail ein ChargedAccount ist, ist für den Rest Logik erstmal egal.
3. Grundlagen der Vererbung. Auf der rechten Seite der Zuweisung muss nur etwas stehen, was von dem links stehenden Typ erbt. Die Vererbung ist eine "A ist ein B" Beziehung. Da ChargedAccount von Account erbt, ist somit jeder ChargedAccount auch ein Account. So wie eben jeder Mensch auch ein Säugetier ist.
4. Einfaches Beispiel: Jeder Mensch ist ein Säugetier, aber nicht jedes Säugetier ist ein Mensch. Daher wäre Mensch m = new Säugetier() falsch
 

JavaIsTheBest

Bekanntes Mitglied
Und was ist, wenn ich die Methode c1.transfer(...) aufrufe. Diese Methode ist in beiden Klassen enthalten.
Wo, wird die Methode aufgerufen. In der Klasse Account oder ChargedAccount und warum?
 

JStein52

Top Contributor
Die in ChargedAccount, es ist ja bekannt dass dieses Objekt vom Typ ChargedAccount ist, also wird auch diese Methode aufgerufen. Polymorphismus .....

Edit:

Gibt es in einem Vererbungszweig einer Klassenhierarchie mehrere Methoden auf unterschiedlicher Hierarchieebene, jedoch mit gleicher Signatur, wird erst zur Laufzeit bestimmt, welche der Methoden für ein gegebenes Objekt verwendet wird (Dynamisches Binden). Bei einer mehrstufigen Vererbung wird jene Methode verwendet, die direkt in der Objektklasse (d. h. jene Klasse, von der das Objekt ein Exemplar ist) definiert ist, oder jene, die im Vererbungszweig am weitesten „unten“ liegt (d. h. die Methode, die von der Vererbung her am nächsten ist)
 
Zuletzt bearbeitet:

JStein52

Top Contributor
Die Variable ist vom Typ Account. Das Objekt auf das sie zeigt ist vom Typ ChargedAccount. Also wird die Methode in der Klasse ChargedAccount aufgerufen wenn du c1.transfer(...) aufrufst. Das ist ja gerade der Sachverhalt den ich dir noch dazu geschrieben hatte.
 

JavaIsTheBest

Bekanntes Mitglied
Und kennst du einen logischen Grund oder ein Bsp., warum man zwei unterschiedliche Datentypen wählt?
Weil, ich sehe da kein Grund warum man das so Account c1 = new ChargedAccount("..."); macht und nicht so ChargedAccount c1 = new ChargedAccount("...");
 

JStein52

Top Contributor
ich sehe da kein Grund warum man das so Account c1 = new ChargedAccount("..."); macht
Es könnte ja sein dass es noch eine Klasse UnchargedAccount gibt die ebenfalls von Account abgeleitet ist und deine Variable c1 im verlaufe des Programmes auch mal auf eine Instanz von UnchargedAccount zeigen soll.
Häufiger kommt es wohl vor dass du eine Liste von Accounts hast in der dann Instanzen verschiedener Accounttypen gespeichert werden können.
 

JStein52

Top Contributor
Nein. Die Variable ist eine Referenz auf das Objekt. Sonst würde ja schon ein Objekt angelegt wenn du nur das hier schreibst:

Code:
Account c1;

// oder

Account c1 = null;

Das Objekt wird aber erst angelegt wenn du danach dann schreibst:

Code:
c1 = new ChargedAccount();

... und c1 zeigt dann auf dieses Objekt.
 

InfectedBytes

Top Contributor
Nein ist es nicht. Deine Variable referenziert ein Objekt.
So als pseudo-reales Beispiels:
Betrachte einfach Häuser als Objekte vom Typ Haus. Um aber ein Haus "benutzen" zu können, musst du es irgendwie referenzieren können. Dabei ist dann die Adresse (z.B. "Hauptstraße 1") die Referenz auf das Objekt Haus. Deine Variable kennt also nur die Adresse, aber wenn man dieser Adresse folgt, erhält man das tatsächliche Haus Objekt.

edit: schon wieder zu langsam^^
 

Schesam

Bekanntes Mitglied
Man kann z.B. EIne Klasse "Bank" erstellen, die alle Accounts verwalten soll. Sie bekommt eine Klassenvariable zugewiesen, die eine Liste der Accounts darstellt:
Java:
List<Account> accounts = new ArrayList<>();

Dazu besitzt sie Eine Methode zum hinzufügen neuer Konten:
Java:
public void addAccount(Account acc) {
accounts.add(acc);
}

Nun kannst du an diese Methode alle Konten übergeben. Darunter auch Sparbücher etc, die ja auch Konten sind, nur eine spezielle Form. Für so etwas is das sehr nützlich. Wenn du diese Konten dann in den anderen Methoden bearbeiten willst (z.B. Kontostand abrufen) Wirst du nur Methoden aufrufen können, die in Account definiert sind, da du ja in der Klasse Bank nicht weißt, um was für ein konto es sich handelt, es behandelt alle gleich, ob nun ein wirkliches Konto oder ein Sparbuch, beide werden gleich behandelt. Wird aber nun eine Methode aus Account aufgerufen mit der gleichen Signatur wie in Sparbuch, wird, obwohl von einer Account-Referenzvariablen aufgerufen, der COde in Sparbuch aufgerufen, da das Objekt ja immernoch ein Sparbuch ist und es selber das genau weiß.
 

Schesam

Bekanntes Mitglied
Ganz genau. Die Referenzvariable zeigt auf das Objekt, das du ihm zugewiesen hast. Der Typ der Referenzvariable sagt, was für Methoden du von diesem objekt ausführen kannst.. Das zugewiesene Objekt und der Typ der Variable müssen allerdings kompatibel sein, ansonsten würde das ganze nichtmal kompilieren.
 

CSHW89

Bekanntes Mitglied
Genauer würde man sagen: "c1 ist ein Zeiger auf ein Objekt der Klasse ChargedAccount." Die Klasse ChargedAccount ist erstmal eine Schablone dafür, wie die Objekte dieser Klasse aussehen, was für Eigenschaften diese Objekte haben. Mit "new ChargedAccount(..)" erstellst du Objekte dieser Klasse. c1 ist dann ein Zeiger auf eines dieser Objekte.
 

Meniskusschaden

Top Contributor
Für das Verständnis ist es sinnvoll, zwischen Compilierungszeitpunkt und Ausführungszeitpunkt zu unterscheiden. Der Compiler trifft seine Entscheidungen ausschließlich auf Basis der Deklaration, also Account c1;. Für ihn ist c1 ein Account-Objekt und er akzeptiert deshalb nur Methodenaufrufe, die ein Account-Objekt "kann". Selbst dann, wenn er wie im BeispielAccount c1 = new ChargedAccount();theoretisch wissen könnte, dass gerade ein ChargedAccount gespeichert wurde.

Die VM hingegen weiß zum Ausführungszeitpunkt, ob gerade ein Account, ChargedAccount oder SonstwasAccount referenziert wird und kann deshalb die Methode aus der passenden Klasse aufrufen.
 

JavaIsTheBest

Bekanntes Mitglied
Für das Verständnis ist es sinnvoll, zwischen Compilierungszeitpunkt und Ausführungszeitpunkt zu unterscheiden. Der Compiler trifft seine Entscheidungen ausschließlich auf Basis der Deklaration, also Account c1;. Für ihn ist c1 ein Account-Objekt und er akzeptiert deshalb nur Methodenaufrufe, die ein Account-Objekt "kann". Selbst dann, wenn er wie im BeispielAccount c1 = new ChargedAccount();theoretisch wissen könnte, dass gerade ein ChargedAccount gespeichert wurde.

Die VM hingegen weiß zum Ausführungszeitpunkt, ob gerade ein Account, ChargedAccount oder SonstwasAccount referenziert wird und kann deshalb die Methode aus der passenden Klasse aufrufen.

Hm, kann ich also auch mit c1 Methoden aus ChargedAccount aufrufen?
 

JavaIsTheBest

Bekanntes Mitglied
Wenn ich folgendes mache:
1. Account c1;
Hier deklariere ich die Variable c1 vom Typ Account?

2. Account c1 = new ChargedAccount();
Hier erstelle ich ein neues Objekt vom Typ ChargedAccount?

3. Wenn ich diese Zeile programmiere? Account c1 = new ChargedAccount();
Kann ich mir den Speicherbereich, so wie im Anhang vorstellen?
Wieviel Speicher wird für ein Objekt reserviert?
 

Anhänge

  • Unbenannt.png
    Unbenannt.png
    11,8 KB · Aufrufe: 26

stg

Top Contributor
Hm, kann ich also auch mit c1 Methoden aus ChargedAccount aufrufen?

Sofern es sich dabei um eine Methode handelt die bereits in Account bekannt ist, dann ja. Andernfalls musst du zuerst auf einen passenden Typ/Interface, welches diese Methode bereitstellt (also naheliegenderweise auf ChargedAccount) casten. Sonst kommt es bereits (vor der Ausführung) beim Kompilieren zu einem Fehler.
 

stg

Top Contributor
1: Ja
2: Ja, außerdem deklarierst du eine Variable c1 vom Typ Account und weist das Objekt dieser Variablen zu.

Wenn ich folgendes mache:
3. Wenn ich diese Zeile programmiere? Account c1 = new ChargedAccount();
Kann ich mir den Speicherbereich, so wie im Anhang vorstellen?
Wieviel Speicher wird für ein Objekt reserviert?
Ganz so einfach ist es nicht.

Ersteinmal: So viel Speicher, wie es eben braucht :)
Zu beachten ist, dass aufgrund von padding immer 8byte-Blöcke benutzt werden. Hinzu kommen 8byte für die Klassen-Definition des Objekts. Bei drei int's und einem byte macht das z.B. 3*4 + 1*1 + 8 = 21 byte. Hinzu 3 byte fürs padding um auf ein vielfaches von 8 zu kommen, also werden 24 byte genutzt.
Zusätzlich 4 bytes für die Referenz auf diese Objekt, quasi deiner Variablen c1. In deinem Bildchen hättest du also bei 1004 nur die Referenz auf das tatsächliche Objekt stehen und ab 1016 dann (nach vorherigen Überlegen) mindestens 16 byte für das Objekt.

Das heißt, wäre die Methode in Account nicht bekannt, dann könnte c1 nicht Methoden von der Klasse ChargedAccount aufrufen?
Genau. Das Problem ist, dass in diesem Fall bereits das Kompilieren fehlschlagen würde. Du kommst also gar nicht erst dazu das Programm auszuführen.
 

Neumi5694

Top Contributor
Es IST möglich, von c1 aus auf Methoden von ChargedAccount zuzugreifen, hier musst du aber manuell eingreifen.
Um das zu erreichen, musst du dem Compiler sagen, er soll c1 als ChargedAccount behandeln.
Code:
((ChargedAccount)c1).chargedAccountMethode();
//oder
ChargedAccount tempC1 = (ChargedAccount) c1;
tempC1.chargedAccountMethode();
In diesem Fall musst du aber sicherstellen, dass es sich bei dem von c1 aus referenzierten Objekt tatsächlich um einen ChargedAccount handelt, sonst kriegst du eine ClassCastException.
 

JStein52

Top Contributor
Sofern es sich dabei um eine Methode handelt die bereits in Account bekannt ist, dann ja. Andernfalls musst du zuerst auf einen passenden Typ/Interface, welches diese Methode bereitstellt (also naheliegenderweise auf ChargedAccount) casten
Es IST möglich, von c1 aus auf Methoden von ChargedAccount zuzugreifen, hier musst du aber manuell eingreifen.
Ja, das hatten wir schon festgestellt. Siehe @stg
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M bestimmen zu welchem Array ein Objekt "zugehört" Java Basics - Anfänger-Themen 5
M Ausgabe einer ArrayList ensteht nur als Hashcode, nicht als Objekt Java Basics - Anfänger-Themen 16
Rxiiz Objekt aus ComboBox entfernen Java Basics - Anfänger-Themen 4
I JSON in Objekt umwandeln Java Basics - Anfänger-Themen 3
P Objekt einer Methode eines anderen Objektes übergeben Java Basics - Anfänger-Themen 5
I Klassen von einem package laden, Statisches Feld auslesen und Objekt erstellen Java Basics - Anfänger-Themen 8
B Objekt aus generalisierter Liste entfernen Java Basics - Anfänger-Themen 11
Soranix Erste Schritte Struktur als Anfänger // Von einer Klasse auf ein Objekt einer anderen Klasse zugreifen. Java Basics - Anfänger-Themen 6
Say Objekt Java Basics - Anfänger-Themen 4
Say abstract class und Objekt erzeugen - Dringend Hilfe Java Basics - Anfänger-Themen 10
T Wie kann man es machen das ein Objekt nicht übermalt wird Java Basics - Anfänger-Themen 2
D OOP Array einem Objekt zuweisen Java Basics - Anfänger-Themen 2
I Entity Objekt nicht gefunden -> Webhook empfangen in der gleichen Methode (Transaktion) Java Basics - Anfänger-Themen 37
K warum kann ich das Objekt nicht erstellen ? Java Basics - Anfänger-Themen 2
K wie kann ich alle Attribute von dem Objekt(pagode) ausgeben lassen ? Java Basics - Anfänger-Themen 3
H Ein übergegebenes Objekt auf null setzen Java Basics - Anfänger-Themen 9
M BlueJ Objekt in Objektliste Java Basics - Anfänger-Themen 2
B Objekt in Klassendiagramm an fremdes Objekt weiterreichen? Java Basics - Anfänger-Themen 6
Fodoboo131 RegEx- Umwandlung von String in ausführbares Objekt/ Befehl Java Basics - Anfänger-Themen 9
frager2345 Aufgabe Hash Objekt Elemente ausgeben Java Basics - Anfänger-Themen 2
amelie123456 Objekt Farbe Quellcode Java Basics - Anfänger-Themen 4
M Objekt in einem Objekt speichern Java Basics - Anfänger-Themen 9
U Warum kann ich, auf private Variablen zugreifen, wenn ich ein Objekt in der Klasse, die private Variablen hat erstelle und dort drauf zugreifen will? Java Basics - Anfänger-Themen 7
missy72 Klassen Objekt Array NullPointerException Java Basics - Anfänger-Themen 3
J Hinzufügen eines Objektes in ein Objekt-Array Java Basics - Anfänger-Themen 62
O Warum bekommen wir nicht die Referenz vom zurückgegebenen Objekt? Java Basics - Anfänger-Themen 4
K Ein Objekt Auto kennt den Inhalt seines links und rechtsstehenden Autos, wie soll man das ermöglichen Java Basics - Anfänger-Themen 2
W Unterschiede bei Zugriff auf Objekt und Klassenvariablen über einen Getter? Java Basics - Anfänger-Themen 2
melaniemueller Fernseher als Objekt Java Basics - Anfänger-Themen 9
B Datentyp für Einzelnes Objekt oder Liste Java Basics - Anfänger-Themen 9
Nina Pohl Ein Vorgang bezog sich auf ein Objekt, das kein Socket ist Java Basics - Anfänger-Themen 6
B Objekt kopieren und sämtliche Referenzen von diesem Objekt? Java Basics - Anfänger-Themen 3
S JavaFX - Objekt an neue Stage übergeben Java Basics - Anfänger-Themen 12
T Verständnisfrage Objekt Getter Setter Java Basics - Anfänger-Themen 102
P Objekt in mehreren Methoden verwenden. Java Basics - Anfänger-Themen 3
S Aufzurufendes Objekt Java Basics - Anfänger-Themen 3
CptK Überprüfen ob übergebenes Objekt zu Generics passt Java Basics - Anfänger-Themen 2
C Konstruktor ab serialisiertem Objekt Java Basics - Anfänger-Themen 4
Kalibru Problem bei Ausgabe von Objekt Java Basics - Anfänger-Themen 1
P Wie rufe ich Methoden mit einer Referenz auf eine Klasse||Objekt auf Java Basics - Anfänger-Themen 4
J Input/Output Konstruktor ergänzen, der zur Datei mit einem Objekt passt Java Basics - Anfänger-Themen 0
P Ein Objekt nach einem String durchsuchen? Java Basics - Anfänger-Themen 7
S Objekt aus Arraylist in andere Arraylist kopieren? Java Basics - Anfänger-Themen 2
J Objekt-Array dynamischer Länge aus Benutzereingaben erstellen Java Basics - Anfänger-Themen 6
W Mehrfach das gleiche Attribut für ein Objekt erzeugen (mit verschiedenen Werten) Java Basics - Anfänger-Themen 2
C Arrays - deklarieren, initialisieren? Ist das ein Objekt? Java Basics - Anfänger-Themen 3
B Interface List - Objekt übergeben? Einzelnes Objekt geht, aber Liste nicht? Java Basics - Anfänger-Themen 4
B Objekt von EJB in Controller (CDI) - Klasse füllen? Java Basics - Anfänger-Themen 3
L Zufälliges Objekt aus der ArraylList ohne java.util.Random Java Basics - Anfänger-Themen 56
N LocalTime einem Objekt zuweisen Java Basics - Anfänger-Themen 2
N Länge eines Arrays in einem Objekt testen Java Basics - Anfänger-Themen 51
M Wie kann ich ein Objekt erstellen, wenn sich der Klassenname in einer Variablen befindet? Java Basics - Anfänger-Themen 10
R Zugriff auf den Index eines Arrays, welches ein Objekt ist. Java Basics - Anfänger-Themen 4
tom.j85 Doppelte Foreach Schleife: Am Ende wird immer das Gleiche Objekt eingefügt Java Basics - Anfänger-Themen 4
J RSA Verschlüsselung Testen / byte[] in Objekt umwandeln Java Basics - Anfänger-Themen 1
M ArrayList - Objekt kopieren und ändern Java Basics - Anfänger-Themen 11
L Objekt an Methode übergeben Java Basics - Anfänger-Themen 4
S Spiel-Programmieren. Wenn ein Objekt den anderen berührt. Java Basics - Anfänger-Themen 6
J Y-Koordinate von GUI-Objekt bestimmen Java Basics - Anfänger-Themen 2
M Auf erstelltes Objekt einer anderen Klasse zugreifen. Java Basics - Anfänger-Themen 5
H Referenz Objekt aufrufen Java Basics - Anfänger-Themen 12
M Objekt mit eindeutiger ID löschen, das nächste Objekt hat dann diese ID Java Basics - Anfänger-Themen 5
N Mit Objekt der Superklasse auf Methode der Subklasse zugreifen Java Basics - Anfänger-Themen 6
E Objekt durch Benutzer über Konsole erzeugen - Java Java Basics - Anfänger-Themen 3
J Objekt bei Auswahl in jList ändern Java Basics - Anfänger-Themen 6
Kirby.exe Generische Objekt Instanz erstellen Java Basics - Anfänger-Themen 14
H Objekt aus einem Array löschen Java Basics - Anfänger-Themen 1
H Objekt im Array speichern Java Basics - Anfänger-Themen 2
H Objekt mit Methode erstellen Java Basics - Anfänger-Themen 6
H Objekt als Attribut speichern Java Basics - Anfänger-Themen 11
E Was kommt in ein Objekt und was in die Main Methode? Java Basics - Anfänger-Themen 8
R Objekt in Konstruktor ist nicht zulässig Java Basics - Anfänger-Themen 5
W OOP Objekt Methode Java Basics - Anfänger-Themen 9
A Objekt in Arrayliste Java Basics - Anfänger-Themen 2
B Mit methode Objekt aus anderer Klasse erstellen Java Basics - Anfänger-Themen 6
I Object-Oriented Programming, Objekt erzeugen Java Basics - Anfänger-Themen 1
M Objekt einer Klasse speichert die Veränderung nicht Java Basics - Anfänger-Themen 1
K Konstruktor für ein Objekt mit Zugriffsmethoden Java Basics - Anfänger-Themen 7
S Variablen Klassenvariable über Objekt aufrufen Java Basics - Anfänger-Themen 16
A Zufälliges Objekt basierend auf Wahrscheinlichkeiten bekommen. Java Basics - Anfänger-Themen 4
R Value von einem JSON-Objekt ausgeben Java Basics - Anfänger-Themen 4
P Objekt aus String-Array erzeugen Java Basics - Anfänger-Themen 104
N Bewegtes Objekt soll sich um eine Parallele bewegen Java Basics - Anfänger-Themen 0
S Objekt-Attribute "variabel" gestalten Java Basics - Anfänger-Themen 10
J Datenbankstruktur als Objekt anlegen Java Basics - Anfänger-Themen 4
L Objekt aus Textdatei in ArrayList speichern Java Basics - Anfänger-Themen 4
B Objekt an neue Stage übergeben? Java Basics - Anfänger-Themen 9
scratchy1 Wie deklariert man eine Methode, die ein Objekt zurückgeben soll? Java Basics - Anfänger-Themen 22
B Klassen Zugriff auf ein Objekt einer Klasse aus einer Methode heraus Java Basics - Anfänger-Themen 4
J Objekt erste freie Stelle zuweisen Java Basics - Anfänger-Themen 3
S Zugriff auf Objekt Java Basics - Anfänger-Themen 5
C Objekt soll ein Array sein. Java Basics - Anfänger-Themen 15
H Vererbung Static Scanner Objekt verwenden - von StdIn in einer importierten Klasse lesen Java Basics - Anfänger-Themen 10
CptK Datentypen Objekt lässt sich nicht zu arraylist hinzufügen Java Basics - Anfänger-Themen 2
R Vererbung werte von einem Objekt aus ein anderes übertragen Java Basics - Anfänger-Themen 7
Z Objekt Array führt zum NullPointerException Java Basics - Anfänger-Themen 2
L Objekt Typ zur Laufzeit ermitteln Java Basics - Anfänger-Themen 1
F Referenz an ein Objekt in einer anderen Klasse erstellen(Nullpointer exception) Java Basics - Anfänger-Themen 6
M Methode Objekt als Parameterübergabe Java Basics - Anfänger-Themen 6
G Objekt der selben Klasse wie selbst mit Aufrufen des Konstruktors erzeugen Java Basics - Anfänger-Themen 14

Ähnliche Java Themen

Neue Themen


Oben