2010-05-21 8 views
5

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

+1

hoffe, ich bin in der Lage, es zu vermitteln .... – abson

Antwort

7

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).

+0

+1 für die Erwähnung über die Weitergabe dieser als Argument und das gleiche gilt nicht für Super – Sandeep

1

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.

-1

Nach Wikipedia, this und super Schlüsselwörter sind, die ist, wie sie mit all ihren Zauber weg, nehme ich an.

+0

Nach dem [JLS] (http://docs.oracle.com/ javase/specs/jls/se8/html/jls-3.html # jls-3.9) sie sind Schlüsselwörter. Wikipedia ist keine normative Referenz. – EJP

3

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.

+0

gibt es irgendwelche Codierung unter Super und dies für diese Art von Verhalten? – abson

+1

@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

1

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); 
} 
} 
0

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.

0

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.

Verwandte Themen