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.
auf die clone() methode der Obeklasse zurück, und präpariert dann die geklonte Map noch vorm returnen. Ich muss mir also die Oberklasse anschaun, um zu verstehen, wie sich die TreeMap clont - also die AbstractMap ??
Code:
public abstract class AbstractMap<K,V> implements Map<K,V> {
Greift die TreeMap mit super.clone() also auf diese Methode zurück? Wenn ja, worauf greift dann in AbstractMap super.clone() zurück? AbstractMap extended ja keine Klasse sondern implementiert nur eine Interface...
Wieso die Oberklasse von TreeMap ist doch AbstractMap oder nicht??
Ich verstehe wirklich nicht ganz, an welcher Stelle, denn jetzt eine Funktion steht, die auch wirklich klont und nicht nur mit super() auf eine überliegende clone() Funktion verweist.
Die clone() Methode ist in Object native implementiert. In überschreibenden Klassen muss man "nur" mutable und nicht primitive
Attribute klonen. Desweiteren muss die Klasse das Interface Cloneable implementieren. Es ist ähnlich wie Serializable
ein reines Marker-Interface. All dies ist in der Beschreibung von Object#clone() und in der API Doku von Clonable beschrieben.
Die ist aber nicht implementiert und wirft beim Aufruf eine Exception. Um die API Dokumentation zu zitieren:
The class Object does not itself implement the interface Cloneable, so calling the clone method on an object whose class is Object will result in throwing an exception at run time.
Das hatte ich mir auch überlegt, dass alle Klassen letztendlich eine Unterklasse der "Object" Klasse sind. Dann verweist das super() in der clone() Funktion aus AbstractMap also auf die clone() Funktion der Klasse "Object".
Nur blöderweise, sieht die clone() Funktion in "Object" so aus:
Die Methode ist native, die wird vermutlich in C programmiert sein
Fremdfunktionen werden innerhalb des Java-Codes wie normale Methoden deklariert. Der einzige Unterschied ist das zusätzliche Schlüsselwort native. Parameter und Rückgabewert werden ebenfalls als Java-Datentypen bzw. Objekte angegeben. Der C-Code, der die Funktion implementiert, wird übersetzt und zu einer shared library gebunden. Diese Bibliothek wird beim Instantiieren der Klasse über einen static initializer automatisch geladen. Hierdurch wird die Implementierung der Fremdfunktion auf die Deklaration der native method abgebildet
Gibt es einen Sinn dafür, irgendwann native Funktionen einzusetzen ? Wäre es nicht viel schöner in immer kleineren Teilen nach unten zu gehen und dort mit assembler zu arbeiten ?