this
und super
sind Schlüsselwörter sind sie nicht; wie kann ich sie dann zum Übergeben von Argumenten an Konstruktoren auf die gleiche Weise wie bei einer Methode verwenden? Kurz gesagt, wie können beide so unterschiedliche Verhaltensweisen zeigen?dies und super in Java
Antwort
Sie haben Recht, dass sowohl this
als auch super
Schlüsselwörter sind. Die Java language specification definiert explizit, wie sie sich verhalten müssen. Die kurze Antwort ist, dass diese Schlüsselwörter sich besonders verhalten, weil die Spezifikation sagt, dass sie müssen.
Entsprechend der Spezifikation this
kann ein primary expression (nur an bestimmten Orten) oder in einem explicit constructor invocation verwendet werden.
Das Schlüsselwort this darf nur im Rumpf einer Instanzmethode, Instanzinitialisierer oder Konstruktor oder im Initialisierer einer Instanzvariablen einer Klasse verwendet werden. Wenn es irgendwo anders erscheint, tritt ein Fehler bei der Kompilierung auf.
Sie können also this
als Argument für eine Funktion verwenden, um einen Verweis auf das aktuelle Objekt zu übergeben. Beachten Sie jedoch, dass Sie nicht super
auf die gleiche Art und Weise verwenden können, da es nicht ein einfacher Ausdruck ist:
public class Program
{
void test(Program p) {}
void run() { test(super); }
public static void main(String[] args)
{
new Program().run();
}
}
Ergebnis:
Program.java:5: '.' expected
void run() { test(super); }
Sie super.foo
verwenden können, aber, weil diese in 15.11 definiert ist gültig zu sein:
FieldAccess:
Primary . Identifier
super . Identifier
ClassName .super . Identifier
Die Spezifikation legt auch restrictions on how super can be used:
Die Sonderformen, die das Schlüsselwort super verwenden, sind nur in einer Instanzmethode, Instanzinitialisierer oder Konstruktor oder im Initialisierer einer Instanzvariablen einer Klasse gültig; Dies sind genau die gleichen Situationen, in denen das Schlüsselwort verwendet werden darf (§15.8.3).
+1 für die Erwähnung über die Weitergabe dieser als Argument und das gleiche gilt nicht für Super – Sandeep
Ich bin nicht ganz sicher, was Sie hier fragen, aber so ist die Sprache entworfen. Der Compiler weiß, dass, wenn Sie diese in einem Konstruktor tun:
super("I'm a string!", 32);
es sollte einen Konstruktor in der Oberklasse finden, die einen String und einen int als Parameter übernimmt.
Die Java-Sprache bietet spezifische Behandlung für diese beiden Schlüsselwörter und sie sind in begrenzten Kontexten zulässig.
Das Aufrufen von (...) führt zu einem Bytecode, der den entsprechenden Konstruktor der aktuellen Klasse aufruft, während das Aufrufen von super (...) zu einem Bytecode führt, der den entsprechenden Konstruktor des Supertyps aufruft.
Java bietet spezielle Handhabung für diese, weil ihre Bindung unterscheidet sich von denen der normalen Methoden (d. H., Sie möchten dynamischen Aufruf vermeiden, oder Sie würden nie den Konstruktor auf den Supertype bekommen).
Jede Sprache muss mit diesem Problem umgehen. In C++ geben Sie beispielsweise explizit den Namen der übergeordneten Methode anstelle von super an.
gibt es irgendwelche Codierung unter Super und dies für diese Art von Verhalten? – abson
@abson Es ist codiert, aber nicht von Ihnen. Es ist ein Teil der JVM, oder vielleicht der Compiler. Du solltest dies und super genauso wie + und - betrachten, der Compiler weiß einfach was damit zu tun hat. – extraneon
Von Ihrer Unterklasse können Sie die Variablen übergeben, die Ihrem Elternteil zur Verfügung gestellt werden. Beispiele sind besser dann so lange hier Erklärungen ist ein ziemlich allgemeines Beispiel der Exception-Klasse von Erweiterung für die eigene Nutzung:
public class MyException extends Exception {
public MyException()
{
}
public MyException(String message)
{
super(message);
}
public MyException(String string, Throwable e)
{
super(string, e);
}
}
wie kommt es, dass diese solche unterschiedliche Verhaltensweisen
Die Frage zeigt macht keinen Sinn. Alle Schlüsselwörter haben unterschiedliche Verhaltensweisen. Dafür sind sie da.
Ich bin mir nicht sicher, was hier der Zweifel ist. Diese this
bezieht sich auf den Verweis auf die aktuelle Instanz, auch wenn sie wie this(arg)
aufgerufen wird ruft die entsprechende constructor
in der aktuellen class
. Wenn super()
aufgerufen wird, ruft es entsprechend die entsprechende constructor
in der super
Klasse auf. Sie können nur von einer constructor
abgerufen werden.
- 1. Dies und Super-Keyword-Nutzung in Android
- 2. implizite Super-Schnittstelle in Java?
- 3. Java Vererbung und super() funktioniert nicht wie
- 4. Java. Wie Super() aufrufen super() in überschriebene Methode (Zucht- Methode)
- 5. dies = das in dekompilierten Java
- 6. Abstrakte Klassen - Super-Konstruktor (Java)
- 7. Super und erweitert kombiniert für Generika in Java
- 8. Inherit Unterklasse Variable von super in Java
- 9. Verwendung von "Super" mit "?" in Java
- 10. Java Super() Konstruktor funktioniert nicht?
- 11. Konstruktorähnliche Anweisung in Java, um Super
- 12. Super Anagram Hilfe für Java
- 13. LibGDX instanceof und dies
- 14. Unterschied zwischen 'super' und 'this'
- 15. Java: Warum sollte jemand jemals super() schreiben, wenn dies der Standard ist?
- 16. Eine Super-Klasse Super-Klasse Super
- 17. Mit randoms und super
- 18. Aufruf Super-Super-Methode
- 19. "override" Super-Klasse-Mitglied in der Unterklasse Java
- 20. Verwenden super() mit Bezug auf Java
- 21. Mischen Super und klassische Anrufe in Python
- 22. Was ist der Unterschied zwischen `super (...)` und `return super (...)`?
- 23. Dies und $ (this) in Widget
- 24. Wie greife ich auf die Super-Super-Klasse in Java zu? [Mini-Beispiel innen]
- 25. Python Klassenvererbung und Super() Verhalten?
- 26. Models, Naming, und dies
- 27. Java - Verwendung von super() in dem gegebenen Beispiel
- 28. Verwirrt über "Super" -Schlüsselwort in diesem Java-Beispiel
- 29. GWT - Wie Java-Exception-Stack-Trace in Super-Dev anzeigen?
- 30. ein Objekt vor dem Super-Aufruf in Java
hoffe, ich bin in der Lage, es zu vermitteln .... – abson