2010-05-21 12 views
5

this e super sono parole chiave non sono; allora come posso usarli per passare argomenti ai costruttori allo stesso modo con un metodo ?? In breve, in che modo entrambi possono mostrare comportamenti così distinti?questo e super in java

+1

spero di riuscire a dirlo ... – abson

risposta

7

È corretto che sia this sia super siano parole chiave. Lo Java language specification definisce in modo esplicito come devono comportarsi. La risposta breve è che queste parole chiave si comportano specialmente perché le specifiche dicono che devono.

Secondo la specifica this può essere utilizzato un primary expression (solo in determinati luoghi) o in un explicit constructor invocation.

La parola chiave può essere utilizzata solo nel corpo di un metodo di istanza, inizializzatore o costruttore di istanza o nell'inizializzatore di una variabile di istanza di una classe. Se appare altrove, si verifica un errore in fase di compilazione.

Quindi è possibile utilizzare this come argomento per una funzione per passare un riferimento all'oggetto corrente. Tuttavia notare che non è possibile utilizzare super nello stesso modo in quanto non è un'espressione primaria:

public class Program 
{ 
    void test(Program p) {} 

    void run() { test(super); } 

    public static void main(String[] args) 
    { 
     new Program().run(); 
    } 
} 

Risultato:

Program.java:5: '.' expected 
    void run() { test(super); } 

È possibile utilizzare super.foo, però, perché questo è definito in 15.11 di essere valida:

FieldAccess: 
    Primary . Identifier 
    super . Identifier 
    ClassName .super . Identifier 

La specifica mette anche restrictions on how super can be used:

I moduli speciali che utilizzano la parola chiave super sono validi solo in un metodo di istanza, inizializzatore o costruttore di istanza o nell'inizializzatore di una variabile di istanza di una classe; queste sono esattamente le stesse situazioni in cui la parola chiave può essere usata (§15.8.3).

+0

+1 per aver menzionato il passaggio come argomento e lo stesso non applicabile per il super – Sandeep

1

Non sono del tutto sicuro di cosa stai chiedendo qui, ma questo è il modo in cui è progettato il linguaggio. Il compilatore sa che quando si esegue questa operazione in un costruttore:

super("I'm a string!", 32); 

si dovrebbe trovare un costruttore della superclasse che prende una stringa e un int come parametri.

-1

Secondo Wikipedia, this e super sono le parole chiave, che è il modo in cui scappare con tutta la loro magia, suppongo.

+0

Secondo [JLS] (http://docs.oracle.com/ javase/specs/jls/se8/html/jls-3.html # jls-3.9) sono parole chiave. Wikipedia non è un riferimento normativo. – EJP

3

Il linguaggio Java fornisce una gestione specifica per queste due parole chiave e sono consentite in contesti limitati.

Invocando questo (...) verrà generato il bytecode che invocherà il costruttore corrispondente nella classe corrente, mentre richiamando super (...) genererà il bytecode che invocherà il costruttore corrispondente sul supertipo.

Java fornisce una gestione speciale per questi perché il loro legame è diverso da quello dei metodi normali (ad es., si desidera evitare l'invocazione dinamica o non si riuscirebbe mai a ottenere il costruttore sul supertipo).

Ogni lingua deve affrontare questo problema. Ad esempio, in C++ specifichi esplicitamente il nome del metodo genitore invece di usare super.

+0

c'è qualche codifica sotto super e questo per questo tipo di comportamento? – abson

+1

@abson È codificato ma non da voi. È una parte della JVM che suppongo, o forse il compilatore. Dovresti considerare questo e super come + e -, il compilatore sa solo cosa fare con loro. – extraneon

1

Dalla sottoclasse è possibile passare le variabili fornite al genitore. Esempi sono meglio allora lunghe spiegazioni ecco un esempio piuttosto generica di estensione della classe Eccezione per i propri scopi:

public class MyException extends Exception {  
public MyException() 
{ 

} 

public MyException(String message) 
{ 
    super(message); 
} 

public MyException(String string, Throwable e) 
{ 
    super(string, e); 
} 
} 
0

come è possibile che questi possono mostrare tali comportamenti distinti

La domanda non ha senso Tutte le parole chiave hanno comportamenti distinti. Ecco a cosa servono.

0

Non sono sicuro di quale sia il dubbio qui. Questo this si riferisce al riferimento all'istanza corrente, anche quando viene chiamato come this(arg) chiama lo constructor corrispondente nell'attuale class. Allo stesso modo, quando viene chiamato il numero super(), viene chiamato il numero corrispondente constructor nella classe super. Possono essere chiamati solo da un constructor.

Problemi correlati