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
risposta
È 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).
+1 per aver menzionato il passaggio come argomento e lo stesso non applicabile per il super – Sandeep
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.
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.
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);
}
}
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.
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
.
- 1. Confuso circa la parola chiave "super" in questo esempio Java
- 2. Java setter e "questo"
- 3. "override" membro super classe in sottoclasse java
- 4. Usa super() con riferimento in Java
- 5. Vedere tutte le classi super-in Java
- 6. Uso di "super" con "?" in Java
- 7. differenza tra chiamare super e chiamare super()
- 8. Significato di .questo e .class in java
- 9. classi java anonime e sincronizzazione e "questo"
- 10. interazione super() e @staticmethod
- 11. Classi nidificate locali Java e accesso a super metodi
- 12. Java: uso di super() nell'esempio fornito
- 13. Qual è la differenza tra `super (...)` e `return super (...)`?
- 14. Livello java persistence super leggero necessario
- 15. perché questo() e super() non possono essere usati insieme in un costruttore?
- 16. Ereditarietà e casting: è buono questo java?
- 17. Chiamata super nel contesto di questo metodo chiamante
- 18. dettaglio circa la wildcard "super" in generici Java
- 19. Dove mettere super() o questo() nelle mie classi
- 20. Dove usare "questo" in java?
- 21. L'uso di "questo" in Java
- 22. creare un oggetto prima della chiamata di super in java
- 23. Super classi multiple e riutilizzo del codice
- 24. Qual è la differenza tra Class.questo e questo in Java
- 25. Argomenti Python super(): perché non super (obj)?
- 26. "sincronizzato (questo)" contro "sincronizzato ((BaseClass) questo" in Java?
- 27. chiamata metodo di classe super super
- 28. SonarLint è super slow
- 29. In java, a cosa viene compilato questo tipo di enum?
- 30. Avvolgimento di eccezioni generate in super/questo costruttore chiama in altre eccezioni
spero di riuscire a dirlo ... – abson