Maison > Java > javaDidacticiel > Explication détaillée de l'utilisation de ce mot-clé en Java

Explication détaillée de l'utilisation de ce mot-clé en Java

黄舟
Libérer: 2017-10-14 09:35:36
original
1731 Les gens l'ont consulté

Cet article présente principalement les informations pertinentes sur la façon d'utiliser le mot-clé Java this en détail. J'espère que cet article pourra aider tout le monde et permettre à tout le monde de bien comprendre cette partie du contenu. Les amis dans le besoin peuvent s'y référer

Explication détaillée de la façon d'utiliser le mot-clé Java this

Le mot-clé this dans la méthode constructeur

La méthode constructeur est un objet d'un classe qui transmet la nouvelle clé Elle est automatiquement appelée lors de la création du mot. Elle ne peut pas être appelée via le nom de la méthode (c'est-à-dire le nom de la classe) comme les autres méthodes du programme. Mais si une classe a plusieurs constructeurs, vous pouvez appeler d'autres constructeurs via ceci (paras...) dans un seul constructeur.
Utiliser ceci pour appeler d'autres constructeurs a les contraintes suivantes.

1) Les autres constructeurs ne peuvent être appelés que via cela dans le constructeur et ne peuvent pas être utilisés dans les méthodes ordinaires.
2) Le constructeur ne peut pas être appelé de manière récursive via cela, c'est-à-dire que le constructeur lui-même ne peut pas être appelé directement ou indirectement via cela dans un constructeur.

Par exemple :


class test {
  test() {
    this(1);
  }
  test(int a){
    this();
  }
  test(int a, int b) {
    this(1, 2);
  }
}
Copier après la connexion

Le constructeur test(int) est appelé dans la méthode test(), et le constructeur test(int ) constructeur Le constructeur test() est également appelé, formant un appel récursif. S'appeler dans test(int, int) constitue également un appel récursif. Tous ne sont pas autorisés.

3) L'appel d'autres constructeurs via ceci doit être exécuté dans la première ligne du constructeur. Puisque super appelle le constructeur de la classe parent doit également être exécuté dans la première ligne du constructeur, par conséquent, appeler le constructeur via ceci et super ne peut pas apparaître dans le même constructeur en même temps. Vous ne pouvez pas appeler plusieurs constructeurs différents dans un seul constructeur.
Vous pouvez également utiliser le mot-clé this dans le constructeur pour accéder aux variables membres et aux fonctions membres de cette classe. Son utilisation est la même que celle du mot-clé this dans les méthodes non constructeurs.

Ce mot-clé dans les méthodes non constructeurs

En Java, les variables membres et les méthodes d'une classe peuvent être appelées via le mot-clé this. Son utilisation est.

1) this.xxx; accédez à la variable membre xxx dans la classe
2) this.yyy(paras…); accédez à la méthode membre yyy dans la classe
3) this. ; actuellement Références aux objets de classe

Le mot-clé this n'est pas soumis au contrôle des autorisations d'accès lors de l'accès aux variables membres et aux fonctions membres de la classe. Il peut accéder à toutes les variables et méthodes membres de cette classe, y compris privées. variables membres et méthode. Vous pouvez également accéder aux membres statiques de cette classe via ceci. Cependant, étant donné que les membres statiques sont directement accessibles via le nom de la classe, si vous accédez via cela, un message d'avertissement s'affichera : "Le champ statique ××× doit être accessible dans un manière statique". Cela ne peut pas être utilisé dans un membre statique d'une classe ou dans un bloc statique.

Ce mot-clé sous relation d'héritage

Sous relation d'héritage, le mot-clé this dans la classe parent ne représente pas toujours les variables et les méthodes de la classe parent. Les quatre utilisations de ce mot-clé sont telles que mentionnées ci-dessus et sont répertoriées ci-dessous.

1) this(paras…); Accéder à d'autres constructeurs
2) this.xxx; Accéder aux variables membres xxx dans la classe
3) this.yyy(paras…) ; méthodes membres dans la classe yyy
4) this; Référence de l'objet de classe actuel

Pour le premier type, que la sous-classe ait ou non un constructeur avec les mêmes paramètres, this(paras. ..) ;L'accès se fait toujours au constructeur dans la classe parent.
Pour le deuxième type, peu importe si la sous-classe remplace la variable membre, this.xxx accède toujours à la variable membre de la classe parent.
Pour le troisième type, si la sous-classe remplace la méthode membre, alors this.yyy(paras...); accède à la méthode membre de la sous-classe. Si la sous-classe ne remplace pas la méthode membre, alors this.yyy ( paras...); accède aux méthodes membres de la classe parent.
Pour le quatrième type, cela représente toujours l'objet de la sous-classe.

Par exemple :


public class ClassTest {
  public static void main(String[] args) {
    Child child = new Child();
    child.show();
  }
}

class Parent {
  public String str;
  Parent(){
    this(1);
  }
  Parent(int a) {
    this.str = "Parent";
    this.show();
  }
  public void show() {
    System.out.println(this.str);
  }
}

class Child extends Parent {
  public String str;
  Child() {
  }
  Child(int a) {
    str = "Child";
  }
  public void show() {
    System.out.println(str);
    super.show();
  }
}
Copier après la connexion

Il y a deux instructions dans la fonction main(), new Child() et child.show( ).

Lorsque la première instruction new Child() est exécutée, le constructeur de la classe Child sera exécuté. Cependant, la classe Child est une sous-classe de la classe Parent, donc le constructeur de la classe Parent. sera exécuté en premier. Le constructeur sans paramètre de la classe Child n'utilise pas super et cela pour appeler la classe parent ou d'autres constructeurs de cette classe, donc le constructeur sans paramètre de la classe parent sera appelé. This(1) est appelé et exécuté dans le constructeur sans paramètre Parent() de la classe parent. Cet appel signifie exécuter le constructeur avec un paramètre entier dans la classe parent. Bien qu'il existe également un constructeur avec un paramètre entier dans la sous-classe, Mais. il ne sera pas exécuté. La méthode constructeur avec un paramètre entier dans la classe parent exécute this.str="Parent". This.str représente ici la variable membre str dans la classe parent. Bien qu'il existe également une variable membre str dans la sous-classe, elle ne le sera pas. utilisé. Après avoir attribué la variable membre str dans la classe parent à "Parent", alors this.show() est exécuté Bien qu'il existe une méthode show() dans la classe parent, car la sous-classe remplace la méthode show(), this. Méthode show() de la sous-classe exécutée par show(). La méthode show() de la sous-classe effectue d'abord l'opération d'impression de str. À ce stade, ce qui est imprimé est évidemment la str de la sous-classe. La str de la sous-classe n'a pas de valeur car null est imprimé. Ensuite, la méthode show() de la sous-classe exécute super.show(), c'est-à-dire que la méthode show() de la classe parent est appelée. Dans la méthode show() de la classe parent, l'opération d'impression de this.str est. effectué. This.str représente également la variable membre str dans la classe parent, donc "Parent" est imprimé.

第二条语句child.show()先是执行子类的show()方法,子类的show()先是打印了子类的str值(null),然后执行了父类的show()打印了父类的str值(”Parent”)。

两条语句的打印结果为null, Parent, null, Parent。

如果将第一条语句改为new Child(1),则执行的是子类的有一个整数参数的构造方法,仍然是先执行父类的无参构造方法,初始化父类的str为”Parent”,然后执行子类的show(),子类的show()打印子类的str值(null),然后执行父类的show(),父类show()打印父类的str值(”Parent”),然后执行子类的构造方法将子类的str初始化为”Child”。 第二条语句child.show()先是执行子类的show()方法,子类的show()先是打印了子类的str值(”Child”),然后执行了父类的show()打印了父类的str值(”Parent”)。

两条语句的打印结果为null, Parent, Child, Parent。

super和this的异同

super在一个类中用来引用其父类的成员,它是在子类中访问父类成员的一个桥梁,并不是任何一个对象的引用,而this则表示当前类对象的引用。在代码中Object o = super;是错误的,Object o = this;则是允许的。
super关键字的作用在于当子类中覆盖了父类的某个成员变量,或者重写了父类的某个成员方法时还能够访问到父类的成员变量和成员方法。如果子类中没有重写父类的成员变量和成员方法,则子类会继承父类的所有非private的成员变量和成员方法。这时在子类中无论通过this来访问成员和通过super来访问成员,结果都是一样的。

super.getClass()和this.getClass()

getClass()是Object类定义的一个final方法,所有Java类的getClass()都继承自Object类。如前文所述,如果子类没有重写父类的某个成员方法,那么通过super来访问还是还是通过this来访问结果都是一样的。因此,super.getClass()和this.getClass()结果是一样的。Object类的getClass()方法返回的是该对象的运行时类,一个对象的运行时类是该对象通过new创建时指定的类。因此,super.getClass()和this.getClass()返回的都是new对象时指定的类。

例如:


public class ClassConstructorTest {
  public static void main(String[] args) {
    Child child = new Child();
    child.show();
  }
}

class Parent {
  private Parent mSelf;
  Parent(){
    mSelf = this;
  }
  public void show() {
    System.out.println(this.getClass().getName());
    System.out.println(super.getClass().getName());
    System.out.println(mSelf.getClass().getName());
  }
}

class Child extends Parent {
  public void show() {
    System.out.println(this.getClass().getName());
    System.out.println(super.getClass().getName());
    super.show();
  }
}
Copier après la connexion

打印的类名都是Child。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal