Dynamisches/Statisches Binden ??

Status
Nicht offen für weitere Antworten.

JimmyT

Mitglied
Hi,

Ich habe mal eine Frage zu folgendem Quellcode.

Warum gibt es in der 2. Zeile von unten "System.out.println("Class Name of o is "+ o.m() );" eine Fehlermeldung?
Müsste der Compiler nicht die Methode m() in der Klasse B1 erkennen?
Eigentlich müßte die dynamische Methode doch im dynamischen Typ zu finden sein (hier Klasse B1)?

Wenn die Methode m() in Klasse A1 nicht auskommentiert ist, dann wird die Methode m() in Klasse B1 erkannt und B1 ausgegeben.

Warum ist das so?

************************************************
class A1 {
public String wurst() { return "A-Wurst"; };
/*
public String m() {
return "A1";
}*/
}

class B1 extends A1 {
public String wurst() { return "B-Wurst jami jami"; };
public String m() {
return "B1";
}
}

public class Dynamisches_Binden {
public static void main(String[] args) {
A1 o = new B1();
System.out.println("Class Name of o is "+ o.m() );
System.out.println("Class Name of o is "+ o.wurst() );
}
}
************************************************

Für jeden Tipp dankbar.

Gruß
jimmy
 

Illuvatar

Top Contributor
Müsste der Compiler nicht die Methode m() in der Klasse B1 erkennen?

Nein. Der Compiler weiß nur, dass die Variable vom Typ A1 ist. Der Compiler *kann* gar nicht wissen, was der Laufzeit-Typ ist. Wie sollte das denn funktionieren? Zur Laufzeit könnte das Objekt ja von sonstwo kommen, evtl. sogar zu einer Klasse gehören, die dem Compiler gar nicht bekannt ist.
 

JimmyT

Mitglied
Nein. Der Compiler weiß nur, dass die Variable vom Typ A1 ist. Der Compiler *kann* gar nicht wissen, was der Laufzeit-Typ ist. Wie sollte das denn funktionieren? Zur Laufzeit könnte das Objekt ja von sonstwo kommen, evtl. sogar zu einer Klasse gehören, die dem Compiler gar nicht bekannt ist.

Ja, ok.
Aber die Fehlermeldung verstehe ich trotzdem nicht.

Ich meine:
Es wird ein Objekt o erzeugt mit statischen Typ A1 und dynamischen Typ B1.
Wenn dann die dynamische Methode m() aufgerufen wird, müßte sie doch (wegen dynamischer Typ B1) ausgeführt und B1 ausgegeben werden?

Wenn das so nicht stimmt, dann bitte Erklärung weshalb nicht?
Wenn das so stimmt,
weshalb gibt's dann in dieser Form eine Fehlermeldung und wenn ich die Kommentare in Klasse A1 wegnehme läuft alles einwandfrei?

gruß
Jimmy
 

Illuvatar

Top Contributor
Wenn deine Klasse A1 die Methode m hat, dann bedeutet das für den Compiler, dass jedes A1-Objekt hat die Fähigkeit hat, "m" zu machen. In Klasse A2 wird diese Fähigkeit dann verändert, und das geschieht dynamisch. Wenn A1 grundsätzlich keine Fähigkeit "m" besitzt - dann weiß der Compiler nicht, dass der Variable ein Objekt von einem Typ zugewiesen wird, der zufällig doch "m" machen kann. In der Variable o könnte ja auch irgendwie ein ganz anderes Objekt reingeraten, das keine Methode m besitzt, sondern eine Methode xyz(). Trotzdem kannst du ja nicht o.xyz() schreiben, nur weil da eventuell ein Objekt sein könnte mit der "xyz"-Fähigkeit.
 

JimmyT

Mitglied
Wenn deine Klasse A1 die Methode m hat, dann bedeutet das für den Compiler, dass jedes A1-Objekt hat die Fähigkeit hat, "m" zu machen. In Klasse A2 wird diese Fähigkeit dann verändert, und das geschieht dynamisch. Wenn A1 grundsätzlich keine Fähigkeit "m" besitzt - dann weiß der Compiler nicht, dass der Variable ein Objekt von einem Typ zugewiesen wird, der zufällig doch "m" machen kann. In der Variable o könnte ja auch irgendwie ein ganz anderes Objekt reingeraten, das keine Methode m besitzt, sondern eine Methode xyz(). Trotzdem kannst du ja nicht o.xyz() schreiben, nur weil da eventuell ein Objekt sein könnte mit der "xyz"-Fähigkeit.

Erstmal danke dir für deine schnellen Antworten! :)

Bedeutet das:
Jede dynamische Methode in B1 muss auch in A1 deklariert und definiert werden damit die Methoden in B1 von Objekt o ausgeführt werden können??

Und wie sieht das mit statischen Methoden aus?
Also als Beispiel:
Beide Methoden m() in A1 und B1 wären static?
Dann würde bei o.m() doch auf jeden Fall A1 ausgegeben (wegen statischer Typ A1), oder nicht?
 

Illuvatar

Top Contributor
Bedeutet das:
Jede dynamische Methode in B1 muss auch in A1 deklariert und definiert werden damit die Methoden in B1 von Objekt o ausgeführt werden können??
Ja.
Und wie sieht das mit statischen Methoden aus?
Also als Beispiel:
Beide Methoden m() in A1 und B1 wären static?
Dann würde bei o.m() doch auf jeden Fall A1 ausgegeben (wegen statischer Typ A1), oder nicht?
Ich denke das stimmt so, ja. Bin mir grad nicht 100% sicher, da man eher selten mit statischen Methoden zu tun hat - aber etwas anderes würde keinen Sinn machen.
o.m() wäre dann nur eine Art Hilfsschreibweise - zwar erlaubt, aber mein Eclipse ist so eingestellt dass es bei so etwas warnt. o.m() wäre nämlich absolut gleichbedeutend mit A1.m().
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Dynamisches und statisches binden Java Basics - Anfänger-Themen 17
B Generische Typen für dynamisches Formular Java Basics - Anfänger-Themen 3
J Dynamisches Array durch split()-Funktion? Java Basics - Anfänger-Themen 3
N Dynamisches Programmieren/Fibonacci Java Basics - Anfänger-Themen 1
J Polymorphie und Dynamisches Binden richtig nutzen Java Basics - Anfänger-Themen 11
O Schlange als dynamisches Feld - Aufwand Java Basics - Anfänger-Themen 16
S Klassen Objekt- Tabelle / Dynamisches 2Dimensionales Array für Objekte Java Basics - Anfänger-Themen 6
C Erste Schritte Dynamisches Array Java Basics - Anfänger-Themen 11
T Dynamisches abarbeiten von statischen Methode aus verschiedenen Klassen. Java Basics - Anfänger-Themen 5
U Klassen Dynamisches Casten? Java Basics - Anfänger-Themen 39
X Methoden [GWT] Dynamisches Textfeld PopUp erstellen Java Basics - Anfänger-Themen 6
L dynamisches erzeugen von array Listen Java Basics - Anfänger-Themen 7
R dynamisches zweidimensionales Feld erzeugen Java Basics - Anfänger-Themen 8
A dynamisches Array - Index Liste Java Basics - Anfänger-Themen 2
maddin86 3 Dateien gleichzeitig speichern in dynamisches Benutzerverzeichnis (Windows) Java Basics - Anfänger-Themen 4
A dynamisches Array simulieren Java Basics - Anfänger-Themen 8
M Dynamisches Casten mal wieder Java Basics - Anfänger-Themen 4
A Dynamisches casten Java Basics - Anfänger-Themen 19
M Dynamisches Binden Java Basics - Anfänger-Themen 8
M dynamisches Clipboard mit Buttons Java Basics - Anfänger-Themen 5
R dynamisches binden Java Basics - Anfänger-Themen 3
K dynamisches Array Java Basics - Anfänger-Themen 13
M Zweidimensionales dynamisches Array füllen Java Basics - Anfänger-Themen 2
Bernasconi dynamisches JDialog Java Basics - Anfänger-Themen 2
R Dynamisches Gegenerieren von Objekten Java Basics - Anfänger-Themen 25
P dynamisches Binden klappt nicht so recht Java Basics - Anfänger-Themen 7
S dynamisches array + konstruktor Java Basics - Anfänger-Themen 5
K dynamisches Array erzeugen Java Basics - Anfänger-Themen 5
I Klassen von einem package laden, Statisches Feld auslesen und Objekt erstellen Java Basics - Anfänger-Themen 8
F Frage über Statisches binden Java Basics - Anfänger-Themen 1
B Statisches Array gesucht Java Basics - Anfänger-Themen 19
X SelectManyCheckbox an SelectOneRadio binden? Java Basics - Anfänger-Themen 3
V kann ich eine TextProperty an eine booloan variabel binden ? Java Basics - Anfänger-Themen 2
S Problem bei dynamischen Binden für Refaktorisierung Java Basics - Anfänger-Themen 2
T externe Datei fest an Projekt binden Java Basics - Anfänger-Themen 2
S Vector an Typ binden Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben