Ich habe mich gefragt, ob ich beim Erstellen neuer Activity
Klassen und beim Überschreiben der onCreate()
Methode in Eclipse immer automatisch hinzugefügt werde : super.onCreate()
. Wie kommt es dazu? Gibt es ein Java-Schlüsselwort in der abstrakten oder übergeordneten Klasse, das dies erzwingt?
Ich weiß nicht, ob es illegal ist, die Superklasse nicht aufzurufen, aber ich erinnere mich bei einigen Methoden, dass ich eine Ausnahme ausgelöst habe, weil ich dies nicht getan habe. Ist das auch in Java eingebaut? Können Sie dazu ein Schlüsselwort verwenden? Oder wie geht das?
java
android
overriding
super
Peterdk
quelle
quelle
Antworten:
Hier ist die Quelle von
Activity#onCreate()
- es sind fast alle Kommentare ( Original - siehe Zeile ~ 800 ):Ich würde also vermuten, dass das ADT Eclipse-Plugin das ist, was diesen Aufruf automatisch
super.onCreate()
für Sie hinzufügt . Es ist jedoch eine totale Vermutung.quelle
mCalled = true
wird auch für eine mögliche Ausnahme verwendet. Vielleicht nicht in der,onCreate()
aber wenn tatsächlich eine solche Ausnahme ausgelöst wird, wird dieses einfache Muster verwendet.Dies wird in der Support-Anmerkungsbibliothek hinzugefügt:
http://tools.android.com/tech-docs/support-annotations
@ CallSuper
quelle
Wenn Sie Unterklassen zwingen möchten , die Logik der übergeordneten Klasse auszuführen, sieht ein allgemeines Muster wie folgt aus:
Dies beantwortet nicht wirklich Ihre Frage, was Eclipse dazu veranlasst, automatisch einen Aufruf der Oberklasse in die Implementierung einzufügen. aber dann denke ich nicht, dass das sowieso der richtige Weg ist, da dies immer gelöscht werden kann.
Sie können nicht wirklich erzwingen, dass eine Methode die Version der Oberklasse mit einem Java-Schlüsselwort oder ähnlichem aufrufen muss. Ich vermute, dass Ihre Ausnahmen einfach von einem Code in der übergeordneten Klasse herrühren, der erwartete Invarianten überprüft, oder etwas, das durch Ihren Ansatz ungültig gemacht wurde. Beachten Sie, dass sich dies geringfügig vom Auslösen einer Ausnahme unterscheidet, da Sie nicht aufgerufen haben
super.onCreate()
.quelle
Wenn Sie unbedingt sicherstellen möchten, dass auch die Superklassenmethode aufgerufen wird, müssen Sie einen kleinen Trick ausführen: Lassen Sie nicht zu, dass die Superklassenmethode überschrieben wird, sondern lassen Sie sie eine überschreibbare geschützte Methode aufrufen.
Auf diese Weise muss der Benutzer Super.foo () oder Base.foo () aufrufen und es wird immer die Basisklassenversion sein, wie sie als endgültig deklariert wurde. Das implementierungsspezifische Material befindet sich in impl_stuff (), das überschrieben werden kann.
quelle
Um Ihre eigentliche Frage zu beantworten, ist die automatische Erstellung des Aufrufs von super.onCreate () eine Funktion des ADT-Plugins. In Java können Sie eine Unterklasse nicht direkt zwingen, die Superimplementierung einer Methode afaik aufzurufen (siehe das in anderen Antworten beschriebene Muster zur Umgehung). Beachten Sie jedoch, dass Sie in Android Aktivitätsobjekte (oder Serviceobjekte) nicht direkt instanziieren - Sie übergeben eine Absicht an das System und das System instanziiert das Objekt und ruft onCreate () auf (zusammen mit anderen Lebenszyklusmethoden). Das System hat also einen direkten Objektverweis auf die Activity-Instanz und kann (vermutlich) einen Booleschen Wert überprüfen, der in der Superklassen-Implementierung von onCreate () auf true gesetzt ist. Obwohl ich nicht genau weiß, wie es implementiert ist, sieht es wahrscheinlich ungefähr so aus:
Und in der Level-Klasse "System", die die Absicht empfängt und das Activity-Objekt daraus instanziiert:
Ich vermute, es ist wahrscheinlich etwas komplexer, aber Sie haben die Idee. Eclipse erstellt den Anruf automatisch, da das ADT-Plugin ihn aus praktischen Gründen dazu auffordert. Viel Spaß beim Codieren!
quelle
In Java gibt es nichts, was das Aufrufen von Super erzwingt, und es gibt viele Beispiele, bei denen Sie dies nicht möchten. Der einzige Ort, an dem Sie das Aufrufen von Super erzwingen können, sind Konstruktoren. Alle Konstruktoren müssen einen Konstruktor der Oberklasse aufrufen. Einer (der Konstruktor ohne Argumente) wird eingefügt, wenn Sie keinen explizit schreiben, und wenn es keinen Konstruktor ohne Argumente gibt, müssen Sie ihn explizit aufrufen.
quelle
Eclipse ist nur hilfreich und erinnert Sie daran, dass Sie die Implementierung der Superklasse aufrufen können, wenn Sie möchten.
Sie erhalten wahrscheinlich eine Fehlermeldung, weil Sie nicht das tun, was die Oberklasse benötigt, da Sie ihre Implementierung nicht aufrufen.
quelle
Eclipse hilft Ihnen nur dabei, die Dinge richtig zu machen und Ausnahmen zu vermeiden.
Von http://developer.android.com/reference/android/app/Activity.html#onCreate(android.os.Bundle )
quelle