[Java] Vous ne comprenez toujours pas le mot-clé this ? Comprenez parfaitement ce mot-clé en une minute

insérez la description de l'image ici

insérez la description de l'image ici

avant-propos

Question : Pourquoi cela existe-t-il ?
Dans le précédent article [JavaSE] Understanding Constructor/Constructor (Cunstructor) , nous avons déjà entrevu la pointe de l'iceberg de ce mot-clé dans le constructeur. Avez-vous déjà pensé à la raison pour laquelle nous devrions l'utiliser this.属性plutôt que directement dans le constructeur d'une classe 属性? Après tout, dans une classe, quel que soit le mot-clé par lequel l'attribut est modifié, il est accessible dans la classe. Suite à cette question, aujourd'hui Yao Yaozi vous amènera à analyser en profondeur le mot clé this en Java , afin que chacun puisse bien comprendre le mot clé this .


Partie 1 : ceci dans le constructeur

1.1 Apprendre à connaître cela pour la première fois :

public class Account {
    
    
    private String name;
    private double balance;
    private String pwd;
	
	//Account类的一个构造器
	public Account (String name,double balance,String pwd){
    
    
		//构造器的实现---初始化对象
		this.name = name;
		this.balance = balance;	
		this.pwd = pwd;
	}
}
  • [Réflexion] : Que se passera-t-il si cela n'est pas utilisé ?
class Account {
    
    
    private String name;
    private double balance;
    private String pwd;

    //Account类的一个构造器
    public Account(String name, double balance, String pwd) {
    
    
        //构造器的实现---初始化对象
        //不用this
        name = name;
        balance = balance;
        pwd = pwd;
    }

    public void showInfo() {
    
    
        System.out.println("name:" + name + " " + "balance:" + balance + " " + "pwd:" + pwd);
        return;
    }
}

public class Main {
    
    
    public static void main(String[] args) {
    
    
        Account account = new Account("Yaoyao", 20, "123456");
        account.showInfo();
    }
}
  • 【résultat de l'opération】 :insérez la description de l'image ici

  • 【Explication】:

    • Nous pensions que la variable de gauche était une variable membre, mais en fait, la variable de gauche est une variable locale ! C'est-à-dire que la variable locale est assignée à la variable locale, et la variable membre n'a pas changé du tout, et c'est toujours la valeur par défaut !
      insérez la description de l'image ici

    • Les variables de la méthode sont des variables locales , stockées dans la pile , et la portée de l'action est dans la méthode ; nous voulons initialiser les variables membres via le constructeur , stockées dans le tas , et la portée de l'action est à l'intérieur de la classe .
      Lorsque la variable membre et la variable locale portent le même nom , la variable locale est utilisée en premier .
      L'essentiel est de voir s'il y a des variables locales. S'il y a des variables locales, les variables locales sont utilisées en premier, sinon l'attribut - le principe de proximité !

insérez la description de l'image ici

1.2 : Pourquoi cela ?

 Grâce à l'analyse ci-dessus, nous avons constaté que lorsque la variable locale et la propriété portent le même nom, la propriété ne peut pas être initialisée avec succès dans le constructeur. Nous pensons que si la variable qui peut être assignée n'est pas une variable locale dans le constructeur, mais une variable membre, ce problème ne serait-il pas résolu ? Oui, alors il y a ça !!!

public class Account {
    
    
    private String name;
    private double balance;
    private String pwd;
	
	//Account类的一个构造器
	public Account (String name,double balance,String pwd){
    
    
		//构造器的实现---初始化对象
		this.name = name;
		this.balance = balance;	
		this.pwd = pwd;
	}
}

 De cette façon, il est passé this.属性pour indiquer qu'il s'agit d'une variable membre, qui se distingue des variables locales .

Partie 2 : cette introduction

2.1 : Qu'est-ce que c'est exactement ?

  • Explication plus officielle :

La machine virtuelle Java (JVM) attribuera un this à chaque objet pour représenter l'objet courant ,

  Voir cette phrase est vraiment ennuyeux, il semble que ce soit le cas, non ? Mais cela ne semble pas très courant. Yao Yaozi parle le langage humain !

Expliquez en termes humains :

  • Cela peut en fait être compris comme un attribut (variable membre) de l'objet , mais cet attribut est caché , c'est-à-dire qu'il équivaut à un attribut caché de l'objet.
  • Comme les autres propriétés d' newun objet, lorsqu'un nouvel objet est créé, de l'espace est alloué à l'objet dans la mémoire de tas et les propriétés sont stockées dans cet espace. Et la valeur de l' attribut this est l'adresse de l'objet dans la mémoire de tas , c'est-à-dire que this pointe vers l'objet (cela représente l'objet).

[Points clés] Pour résumer : il s'agit d'un attribut caché d'un objet (essentiellement une variable membre ordinaire). Comme les autres non-staticattributs, chaque nouvel objet se verra attribuer une variable membre dédiée de l'objet lors de la création de l'objet (il s'agit d'une d'entre eux. ), cette variable membre est stockée dans la mémoire de tas, et la valeur de cette variable est l'adresse de l'objet dans la mémoire de tas.

Autrement dit : pour créer 1 000 objets, il y aura 1 000 this, et ils sont indépendants les uns des autres (oh, ce n'est qu'une variable membre ordinaire !)

  • [Illustration]:
    insérez la description de l'image ici

Partie 3 : Détails d'utilisation et précautions

  • Le mot clé this peut être utilisé pour distinguer les propriétés et les variables locales de la classe actuelle.
  • L'utilisation du mot-clé this peut être utilisé pour accéder aux propriétés d'instance, aux méthodes d'instance et aux constructeurs de cette classe ("instance" fait référence à celle non-staticmodifiée)
    • Accédez aux propriétés d'instance de cette classe :this.属性
    • Accédez aux méthodes d'instance de cette classe :this.方法名(参数列表)
    • Accédez à ce constructeur de classe :this(参数列表)
  • [Note] :this(参数列表) Pour accéder au constructeur de cette classe, vous devez faire attention aux points suivants
    • Il ne peut être utilisé que dans le constructeur, c'estthis(参数列表); -à-dire accéder à un autre constructeur de cette classe dans un constructeur. ( Le constructeur par défaut commence par super();,).
    • Lorsqu'il est utilisé explicitement this(), la valeur par défaut super()est remplacée
    • this(参数列表)et super(参数列表)Il ne peut y en avoir qu'un et un seul dans le constructeur.
    • Si elle est utilisée dans un constructeur this(参数列表), cette instruction ne peut être placée que sur la première ligne du constructeur
    • Ne peut pas être utilisé dans les méthodes statiquesstatic method des classes . C'est très simple à comprendre : les variables membres ne peuvent pas apparaître dans les méthodes statiques (cela dépend des objets, et statique ne dépend pas des objets. Lorsqu'il n'y a pas d'objet, comment pouvez-vous rendre cela inconfortable ! Il ne sait même pas quel objet il appartient à !) Dans [JavaSE] Tutoriel de niveau nounou | 10 000 mots + 10 images pour apprendre des classes et des objets - il est recommandé de mettre en signet la partie 4 et la partie 5 de ce billet de blog , qui ont été expliquées en détail sur les méthodes membres et les méthodes statiquesthis类名.静态方法
//错误代码:
public class Account {
    
    
    private String name;
    private double balance;
    private String pwd;
	
	public static void show(){
    
    
		System.out.print(name);//编译出错:实例变量依赖于对象
		System.out.print(this.name);//编译出错,this.name依赖对象
	}
}
  • Une solution stupide haha : puisque vous avez besoin d'un objet, alors je vais en faire newun haha, pour que les variables d'instance et les méthodes appartiennent toutes ~
public class Account {
    
    
    private String name;
    private double balance;
    private String pwd;
	
	public static void show(){
    
    
		Account account = new Account();//创建对象
		System.out.print(account.name);
	}
}

Le prochain aperçu - une explication détaillée de Java -
série de colonnes de package :

Il n'est pas facile d'être original, si cela vous est utile, n'hésitez pas à suivre ! Je suis Yaoyaozi et je continue à produire des articles de haute qualité !

insérez la description de l'image ici

おすすめ

転載: blog.csdn.net/Yaoyao2024/article/details/128753927