JavaRush /Blog Java /Random-FR /Différence entre ceci et les super mots-clés en Java
grishin
Niveau 27
Харьков

Différence entre ceci et les super mots-clés en Java

Publié dans le groupe Random-FR
thiset supersont deux mots-clés spéciaux en Java qui représentent respectivement l'instance actuelle d'une classe et sa superclasse. Les programmeurs Java confondent souvent ces mots et se montrent peu conscients de leurs propriétés particulières, qui sont souvent évoquées lors des entretiens avec Java Core. Par exemple, quelques questions qui me viennent immédiatement à l’esprit concernent thiset super: est-il possible d’attribuer une signification différente à un mot-clé thisen Java ? et quelle est la différence entre les mots-clés thiset superen Java. Ne sait pas? Eh bien, je ne donne pas la réponse ici, elle se trouve à la fin de l’article. Différence entre ceci et les super mots-clés en Java - 1Ainsi, comme je l'ai dit au début, la principale différence entre thiset superen Java est que thisl'instance actuelle d'une classe représente, tandis que superl'instance actuelle de la classe parent représente. Voici un exemple d'utilisation de variables thiset super- vous avez probablement déjà vu des exemples d'appel de constructeurs les uns aux autres, ce qu'on appelle. appeler des constructeurs dans une chaîne, cela est possible grâce à l'utilisation de mots-clés thiset super. À l'intérieur d'une classe, pour appeler son constructeur sans argument, on utilise this(), alors super()qu'il est utilisé pour appeler le constructeur sans argument, ou comme on l'appelle aussi, le constructeur par défaut de la classe parent. À propos, vous pouvez ainsi appeler non seulement un constructeur sans arguments, mais également n'importe quel autre constructeur en lui transmettant les paramètres appropriés. Nous verrons bientôt un exemple de cette thisutilisation super. Également en thisJava, superils sont utilisés pour accéder aux variables d'une instance de classe et de son parent. En fait, elles sont accessibles sans les préfixes superet this, mais seulement si dans le bloc actuel ces variables ne chevauchent pas d'autres variables, c'est-à-dire s'il ne contient pas de variables locales portant les mêmes noms, sinon vous devrez utiliser des noms avec des préfixes, mais cela n'a pas d'importance, car sous cette forme, ils sont encore plus lisibles. Un exemple classique de cette approche consiste à utiliser thisun constructeur à l'intérieur qui prend un paramètre portant le même nom que la variable d'instance. Plus loin dans l'article, nous découvrirons quelles sont les autres différences entre superet thiset examinerons quelques exemples de leur utilisation.

En quoi ceci et super sont similaires

Avant d'examiner les différences entre les mots-clés thiset super, examinons certaines de leurs similitudes :
  1. Les deux this, et supersont des variables non statiques, ils ne peuvent donc pas être utilisés dans un contexte statique, ce qui signifie qu'ils ne peuvent pas être utilisés dans la méthode principale. Cela entraînera une erreur de compilation "une variable non statique thisne peut pas être référencée à partir d'un contexte statique". La même chose se produit si vous utilisez le mot-clé dans la méthode main super.

  2. Les deux this, et superpeuvent être utilisés à l'intérieur des constructeurs pour appeler d'autres constructeurs dans une chaîne, par exemple, this() et super() appellent le constructeur sans arguments des classes héritières et parentes, respectivement.
Dans l'exemple ci-dessous, nous passons d'abord un appel d'un constructeur sans argument de classe B à un constructeur de la même classe B qui prend un seul paramètre de type String, qui à son tour super("")appelle le constructeur à un argument de la 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();
    }

}
Sortie : Constructeur à un argument de la classe A Constructeur à un argument de la classe B Constructeur sans argument de la classe B
  1. À l'intérieur du constructeur this, et superdoit apparaître au-dessus de toutes les autres expressions, au tout début, sinon le compilateur émettra un message d'erreur. D'où il s'ensuit qu'un constructeur ne peut pas contenir à la fois this(), et super().

Différences entre super et ça

Nous savons maintenant comment utiliser les mots-clés superet thiscomprenons pourquoi ils sont nécessaires. Mais il existe une autre option pour utiliser ces mots-clés, que je n'ai pas mentionnée - dans les classes internes, où, avec leur aide, il est très pratique de se référer à une classe externe en utilisant le formulaire de notation externe. thispour son instance actuelle et Outer. super- pour ses parents. N'oubliez pas de remplacer Outer par le nom de la classe externe. Énumérons maintenant brièvement les principales différences entre les mots-clés thisetsuper
  1. une variable thisfait référence à l'instance actuelle de la classe dans laquelle elle est utilisée, alors qu'elle fait superréférence à l'instance actuelle de la classe parent.

  2. Chaque constructeur, en l'absence d'appels explicites à d'autres constructeurs, appelle implicitement super()le constructeur sans argument de sa classe parent, mais vous avez toujours la possibilité d'appeler explicitement n'importe quel autre constructeur avec this(), ou super().
C'est probablement tout ce que l'on peut dire sur les différences entre les mots-clés thiset superen Java et sur la manière dont ils sont utilisés dans les programmes. Comme nous l'avons vu, leur objectif principal est d'appeler un constructeur à partir d'un autre et de faire référence aux variables d'instance déclarées dans la classe actuelle et sa classe parent. N'oubliez pas que ce ne sont pas exactement des variables ordinaires, et maintenant - la réponse à ma question, que j'ai posée dans le premier paragraphe. Non, une variable thisne peut pas recevoir de nouvelle valeur car elle est déclarée finale. Vous pouvez essayer de le faire dans l'EDI - vous recevrez une erreur de compilation "vous ne pouvez pas attribuer une nouvelle valeur à une variable this- elle est déclarée finale". Article original ici .
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION