this
e
super
sono due parole chiave speciali in Java che rappresentano rispettivamente l'istanza corrente di una classe e la sua superclasse. I programmatori Java spesso confondono queste parole e mostrano poca consapevolezza delle loro proprietà speciali, che spesso vengono poste nelle interviste su Java Core. Ad esempio, un paio di domande che vengono subito in mente riguardano
this
e
super
, è possibile assegnare un significato diverso a una parola chiave
this
in Java? e qual è la differenza tra parole chiave
this
e
super
in Java. Non lo so? Beh, non darò la risposta qui: la puoi trovare alla fine dell'articolo.
Quindi, come ho detto all'inizio, la differenza principale tra
this
e
super
in Java è che
this
l'istanza corrente di una classe rappresenta, mentre
super
l'istanza corrente della classe genitore rappresenta. Ecco un esempio di utilizzo delle variabili
this
e
super
probabilmente hai già visto esempi di chiamata di costruttori l'uno dall'altro, il cosiddetto. chiamando i costruttori in una catena, questo è possibile attraverso l'uso delle parole chiave
this
e
super
. All'interno di una classe, per chiamare il suo costruttore senza argomenti, viene utilizzato
this()
, mentre
super()
viene utilizzato per chiamare il costruttore senza argomenti, o come viene anche chiamato, il costruttore predefinito della classe genitore. A proposito, in questo modo puoi chiamare non solo un costruttore senza argomenti, ma anche qualsiasi altro costruttore passandogli i parametri appropriati. Vedremo presto un esempio di questo
this
utilizzo
super
. Anche in
this
Java
super
vengono utilizzati per accedere alle variabili di un'istanza di classe e del suo genitore. Ad essi infatti è possibile accedere senza i prefissi
super
e
this
, ma solo se nel blocco corrente tali variabili non si sovrappongono ad altre variabili, cioè se non contiene variabili locali con gli stessi nomi, altrimenti bisognerà usare nomi con prefissi, ma questo non ha importanza, perché in questa forma sono ancora più leggibili. Un classico esempio di questo approccio consiste nell'utilizzare
this
un costruttore interno che accetta un parametro con lo stesso nome della variabile di istanza. Più avanti nell'articolo scopriremo quali altre differenze ci sono tra
super
e
this
e vedremo alcuni esempi del loro utilizzo.
Come questo e il super sono simili
Prima di esaminare le differenze tra parole chiave
this
e
super
, esaminiamo alcune delle loro somiglianze:
- Entrambi
this
, e super
sono variabili non statiche, quindi non possono essere utilizzate in un contesto statico, il che significa che non possono essere utilizzate nel metodo main. Ciò comporterà un errore in fase di compilazione " this
non è possibile fare riferimento a una variabile non statica da un contesto statico". La stessa cosa accade se usi la parola chiave nel metodo main super
.
- Entrambi
this
, e super
possono essere utilizzati all'interno dei costruttori per chiamare altri costruttori in una catena, ad esempio, this
() e super
() chiamano il costruttore senza argomenti rispettivamente delle classi ereditarie e genitoriali.
Nell'esempio seguente, passiamo prima una chiamata da un costruttore senza argomento della classe B a un costruttore della stessa classe B che accetta un singolo parametro di tipo
String
, che a sua volta
super("")
chiama il costruttore con un argomento dalla superclasse.
class A{
A(){
System.out.println("Конструктор без аргументов класса A");
}
A(String args){
System.out.println("Конструктор с одним аргументом класса A");
}
}
class B extends A{
B(){
this("");
System.out.println("Конструктор без аргументов класса B");
}
B(String args){
super("");
System.out.println("Конструктор с одним аргументом класса B");
}
}
public class Test {
public static void main(String args[]) {
B b = new B();
}
}
Output: Costruttore con un argomento di classe A Costruttore con un argomento di classe B Costruttore senza argomento di classe B
- All'interno del costruttore
this
, e super
deve apparire sopra tutte le altre espressioni, proprio all'inizio, altrimenti il compilatore emetterà un messaggio di errore. Da cui ne consegue che un costruttore non può contenere sia this()
, che super()
.
Differenze tra super e questo
Ora sappiamo come utilizzare le parole chiave
super
e
this
capiamo perché sono necessarie. Ma c'è un'altra opzione per utilizzare queste parole chiave che non ho menzionato: nelle classi interne, dove con il loro aiuto è molto conveniente fare riferimento alla classe esterna utilizzando la forma di notazione esterna.
this
per la sua istanza corrente e Outer.
super
- per i suoi genitori. Non dimenticare di sostituire Outer con il nome della classe esterna. Ora elenchiamo brevemente le principali differenze tra parole chiave
this
e
super
- una variabile
this
si riferisce all'istanza corrente della classe in cui viene utilizzata, mentre si super
riferisce all'istanza corrente della classe genitore.
- Ogni costruttore, in assenza di chiamate esplicite ad altri costruttori, chiama implicitamente
super()
il costruttore senza argomenti della sua classe genitore, ma hai sempre la possibilità di chiamare esplicitamente qualsiasi altro costruttore con this()
, o super()
.
Questo è probabilmente tutto ciò che si può dire sulle differenze tra le parole chiave
this
e
super
in Java e su come vengono utilizzate nei programmi. Come abbiamo visto, il loro scopo principale è chiamare un costruttore da un altro e fare riferimento alle variabili di istanza dichiarate nella classe corrente e nella sua classe genitore. Non dimenticare che queste non sono esattamente variabili ordinarie, e ora - la risposta alla mia domanda, che ho posto nel primo paragrafo. No, a una variabile
this
non può essere assegnato un nuovo valore perché è dichiarata final. Puoi provare a farlo nell'IDE: riceverai un errore di compilazione "non puoi assegnare un nuovo valore a una variabile
this
- è dichiarata finale".
Articolo originale qui .
GO TO FULL VERSION