this

this est un objet de lui-même, représentant l'objet lui-même. On peut le comprendre comme :Un pointeur vers l'objet lui-même。

L'utilisation de this en Java peut être grossièrement divisée en 3 types :

1. Référence directe ordinaire

Pas besoin de développer ce point ; this équivaut à pointer vers l'objet courant lui-même.

2. Lorsque les paramètres formels ont le même nom que les membres, utilisez this pour les distinguer :

Exemple

class Person { private int age = 10; public Person(){ System.out.println("Initialiser l'âge :"+age); } public int GetAge(int age){ this.age = age; return this.age; } } public class test1 { public static void main(String[] args) { Person Harry = new Person(); System.out.println("L'âge de Harry est "+Harry.GetAge(12)); } }

Sortie :

初始化年龄:10
Harry's age is 12

On peut voir qu'ici age est le paramètre formel de la méthode membre GetAge, et this.age est la variable membre de la classe Person.

3. Référence aux constructeurs

Ceci sera abordé avec super, voir ci-dessous.


super

super peut être compris comme un pointeur vers l’objet de sa classe super (parente), et cette classe super fait référence à la classe parente la plus proche.

super a également trois utilisations :

1. Référence directe ordinaire

Semblable à this, super équivaut à pointer vers la classe parente de l’objet courant, donc vous pouvez utilisersuper.xxxpour référencer les membres de la classe parente.

2. Lorsque les variables membres ou les méthodes de la sous-classe ont le même nom que celles de la classe parente

Exemple

class Country { String name; void value() { name = "China"; } } class City extends Country { String name; void value() { name = "Shanghai"; super.value(); //Appeler la méthode de la classe parente System.out.println(name); System.out.println(super.name); } public static void main(String[] args) { City c=new City(); c.value(); } }

Sortie :

Shanghai
China

On peut voir qu'ici, à la fois la méthode de la classe parente et la variable de la classe parente sont appelées. Si la méthode value() de la classe parente n'est pas appelée et que seule la variable name de la classe parente est appelée, alors la valeur de name de la classe parente sera la valeur par défaut null.

3. Référence aux constructeurs

  • super(parameters): Appeler un constructeur dans la classe parente (doit être la première instruction du constructeur).
  • this(parameters): Appeler une autre forme de constructeur dans cette classe (doit être la première instruction du constructeur).

Exemple

class Person { public static void prt(String s) { System.out.println(s); } Person() { prt("Classe parente - constructeur sans argument :"+"Une personne."); }//Constructeur (1) Person(String name) { prt("Classe parente - constructeur avec un paramètre :"+"Le nom d'une personne est " + name); }//Constructeur (2) } public class Chinese extends Person { Chinese() { super(); //Appeler le constructeur de la classe parente (1) prt("Sous-classe - appelle le « constructeur sans argument » de la classe parente :"+"Un codeur chinois."); } Chinese(String name) { super(name);//Appeler le constructeur de la classe parente avec les mêmes paramètres formels (2) prt("Sous-classe - appelle le « constructeur avec un paramètre » de la classe parente :"+"son nom est " + name); } Chinese(String name, int age) { this(name);//Appeler le constructeur avec les mêmes paramètres formels (3) prt("Sous-classe : appelle un constructeur de sous-classe avec les mêmes paramètres formels : son âge est" + age); } public static void main(String[] args) { Chinese cn = new Chinese(); cn = new Chinese("codersai"); cn = new Chinese("codersai", 18); } }

Sortie :

父类·无参数构造方法: A Person.
子类·调用父类”无参数构造方法“: A chinese coder.
父类·含一个参数的构造方法: A person's name is codersai
子类·调用父类”含一个参数的构造方法“: his name is codersai
父类·含一个参数的构造方法: A person's name is codersai
子类·调用父类”含一个参数的构造方法“: his name is codersai
子类:调用子类具有相同形参的构造方法:his age is 18

À partir de cet exemple, nous pouvons voir que super et this peuvent être utilisés pour appeler respectivement le constructeur de la classe parente et d'autres formes de constructeurs dans cette classe.

Dans l'exemple, le troisième constructeur de la classe Chinese appelle le deuxième constructeur de cette classe, et le deuxième constructeur appelle la classe parente. Par conséquent, le constructeur de la classe parente doit être appelé en premier, puis le deuxième constructeur de cette classe, et enfin le troisième constructeur est réécrit.


Similarités et différences entre super et this

  • super(paramètres) : Appelle un constructeur de la classe de base (doit être la première instruction du constructeur)
  • this(paramètres) : Appelle une autre forme de constructeur dans cette classe (doit être la première instruction du constructeur)
  • super : il référence les membres de la classe parente directe de l'objet courant (utilisé pour accéder aux données membres ou aux fonctions de la classe parente masquées dans la classe parente directe. Lorsque la classe de base et la classe dérivée ont les mêmes définitions de membres, par ex., super.variableName super.memberFunctionName(actual parameters)). this : il représente le nom de l'objet courant (là où l'ambiguïté peut facilement se produire dans le programme, utilisez this pour indiquer l'objet courant ; si les paramètres formels de la fonction ont le même nom que les données membres de la classe, utilisez this pour indiquer le nom de la variable membre).
  • L'appel à super() doit être écrit comme première ligne du constructeur de la sous-classe, sinon la compilation échouera. La première instruction de chaque constructeur de sous-classe appelle implicitement super(). Si la classe parente n'a pas de constructeur de cette forme, une erreur sera signalée lors de la compilation.
  • super() et this() sont similaires. La différence est que super() appelle le constructeur de la classe parente depuis la sous-classe, tandis que this() appelle d'autres méthodes au sein de la même classe.
  • super() et this() doivent tous deux être placés en première ligne du constructeur.
  • Bien que this puisse être utilisé pour appeler un constructeur, il ne peut pas en appeler deux.
  • this et super ne peuvent pas apparaître en même temps dans un constructeur, car this appellera inévitablement un autre constructeur, et cet autre constructeur aura inévitablement une instruction super. Par conséquent, avoir la même instruction dans le même constructeur fait perdre à l'instruction sa signification, et le compilateur ne l'acceptera pas.
  • this() et super() font tous deux référence à des objets, ils ne peuvent donc pas être utilisés dans un environnement static. Y compris : les variables static, les méthodes static, les blocs d'instructions static.
  • Par essence, this est un pointeur vers cet objet, tandis que super est un mot-clé Java.

Lien original : https://www.cnblogs.com/hasse/p/5023392.html