Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Entschuldigt bitte die etwas seltsame Frage, aber ich komme nicht hinter dieses Konstrukt!
Beim Auslesen eines XML - Dokuments wird u. a. folgendes verwendet:
Und genau bei diesen paar Zeilen ist mein Verständnisproblem.
Document und NodeList sind lt. der Java - API ein Interface, aber seit wann kann man sie auf der linken Seite des Statements ( Document doc u. NodeList nodeLst ) wie eine Klasse verwenden?
Ich habe zwar gelesen, dass es etwas mit Vererbung auf sich hat, aber ich frage mich hier was genau?
Wenn mir jemand bitte das relativ verständlich erklären kann!
Das geht schon immer. Das ist dann auch richtig angewendete Vererbung bzw. Schnittstellenvererbung.
Du kannst die Interfaces zwar selbst nicht instanziieren (also
Code:
Document d = new Document()
würde nur klappen, wenn du eine anonyme Klasse anlegst), allerdings kannst du ja durchaus Objekte des Types Document haben.
Das können dann zum Beispiel solche Klassen sein, die das Interface implementieren.
Genau das zeichnet Interfaces und abstrakte Klassen aus, dass man davon eben keine Instanz haben möchte, sondern nur Schnittstellen weitergibt
Das heisst also, dass Interfaces in etwa abstrakten Klassen entsprechen, aber nicht instanziert werden können, jedoch können davon Objekte angelegt werden?!
Das heisst also, dass Interfaces in etwa abstrakten Klassen entsprechen, aber nicht instanziert werden können, jedoch können davon Objekte angelegt werden?!
Abstrakte klassen können z.T implementiert sein. Interfaces sind eine reine deklaration. D.h. bei Interfaces interessiert dich nur, dass eine Methode existiert und nicht wie diese implementiert wurde. Eine Klasse kann zudem von mehreren Interfaces erben aber nur von einer (abstrakten) Klasse.
Weder von Interfaces noch von abstrakten Klassen kannst du direkt Objekte erstellen.
Nach dem durchsehen der Galileo Seite ist es klarer geworden!
Es war anfangs äußerst seltsam, dass ein Interface plötzlich ein Objekt zurückgegeben bekommt und auf den ersten Blick aussieht als wäre es eine "Klasse".
Ich habe bis jetzt Interfaces immer nur implementiert, aber noch nie habe ich es gesehen, als würden sie in etwa wie eine Klasse aufgerufen werden!
Stell dir vor, du hast das Interface Säugetier.
Macht wenig Sinn, davon ein Objekt zu erzeugen, weil was genau ist denn ein Säugetier? Man muss es also noch weiter spezialisieren (über implements)
Dann kommt die Klasse Tiger ins Spiel. Tiger zu erzeugen würde natürlich schon viel eher Sinn machen, da es die auch als konkrete Lebewesen gibt (im Gegensatz zu Säugetier, die einfach eine Familie darstellen).
Dann sähe dein Konstruktoraufruf so aus:
Es war mir einfach nicht bewusst, dass man Instanzen ebenso ähnlich aufrufen kann wie normale Klassen, auch wenn es jetzt keine Klassen im richtigen Sinne sind!
Dann kommt die Klasse Tiger ins Spiel. Tiger zu erzeugen würde natürlich schon viel eher Sinn machen, da es die auch als konkrete Lebewesen gibt (im Gegensatz zu Säugetier, die einfach eine Familie darstellen).
Dann sähe dein Konstruktoraufruf so aus:
Aber es gibt doch Papiertiger, Stubentiger, Fruchtiger....
Aber zurück zum Thema. Was in deinem Programm in der Variablen doc steckt ist natürlich ein richtiges Objekt, also die Instanz irgendeiner richtigen Klasse. Wichtig ist für die weitere Verwendung aber nur, dass ein Objekt dieser Klasse die Methoden zur Verfügung stellt, die das Interface Document liefert. Da einen der Rest nicht interessiert ist es sinnvoll sich hier auch darauf zu beschränken, dass das Objekt, welches du von der Methode db.parse(..) erhälst eben tatsächlich diese Methoden bereitstellt. Ein Vorteil ist z.B. nun, dass du die Implementierung von db.parse() so abändern kannst, das meinetwegen nicht mehr ein Objekt vom Typ MeinDokument zurückgegeben wird, sondern ein Objekt vom Typ AnderesDokument. Am Code der Klasse, die db.parse() aufrufst musst du aber nichts ändern..
Ich bin gerade eben die einzelnen Stellen des Codes nach oben hin auch noch durchgegangen und konnte ebenso feststellen, dass hier mehrere Interfaces verwendet werden und es gibt 2 richtige Klassen, nämlich die Klasse DocumentBuilderFactory und DocumentBuilder.