JavaRush /Java Blog /Random-IT /Differenza tra questa e le super parole chiave in Java
grishin
Livello 27
Харьков

Differenza tra questa e le super parole chiave in Java

Pubblicato nel gruppo Random-IT
thise supersono 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 thise super, è possibile assegnare un significato diverso a una parola chiave thisin Java? e qual è la differenza tra parole chiave thise superin Java. Non lo so? Beh, non darò la risposta qui: la puoi trovare alla fine dell'articolo. Differenza tra questa e le super parole chiave in Java - 1Quindi, come ho detto all'inizio, la differenza principale tra thise superin Java è che thisl'istanza corrente di una classe rappresenta, mentre superl'istanza corrente della classe genitore rappresenta. Ecco un esempio di utilizzo delle variabili thise superprobabilmente 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 thise 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 thisutilizzo super. Anche in thisJava supervengono utilizzati per accedere alle variabili di un'istanza di classe e del suo genitore. Ad essi infatti è possibile accedere senza i prefissi supere 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 thisun 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 supere thise vedremo alcuni esempi del loro utilizzo.

Come questo e il super sono simili

Prima di esaminare le differenze tra parole chiave thise super, esaminiamo alcune delle loro somiglianze:
  1. Entrambi this, e supersono 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 " thisnon è 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.

  2. Entrambi this, e superpossono 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(""); // вызов конструктора с одним аргументом класса B
        System.out.println("Конструктор без аргументов класса B");
    }

   B(String args){
        super(""); // вызов конструктора с одним аргументом класса A
        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
  1. All'interno del costruttore this, e superdeve 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 supere thiscapiamo 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. thisper 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 thisesuper
  1. una variabile thissi riferisce all'istanza corrente della classe in cui viene utilizzata, mentre si superriferisce all'istanza corrente della classe genitore.

  2. 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 thise superin 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 thisnon 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 .
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION