[Java] ¿Aún no entiendes la palabra clave this? Comprenda completamente esta palabra clave en un minuto

inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

prefacio

Pregunta: ¿Por qué existe esto?
En el artículo anterior [JavaSE] Comprensión de Constructor/Constructor (Cunstructor) , ya hemos vislumbrado la punta del iceberg de esta palabra clave en el constructor. ¿Alguna vez has pensado por qué deberíamos usarlo en this.属性lugar de directamente en el constructor de una clase 属性? Después de todo, en una clase, no importa qué palabra clave modifique el atributo, se puede acceder a él en la clase. Siguiendo esta pregunta, hoy Yao Yaozi lo llevará a analizar profundamente esta palabra clave en Java , para que todos puedan entender completamente esta palabra clave .


Part1: esto en el constructor

1.1 Conociendo esto por primera vez:

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;
	}
}
  • [Pensando]: ¿Qué pasará si esto no se usa?
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();
    }
}
  • 【resultado de la operación】:inserte la descripción de la imagen aquí

  • 【Explicación】:

    • Pensamos que la variable de la izquierda era una variable miembro, pero de hecho, ¡la variable de la izquierda es una variable local! Es decir, la variable local se asigna a la variable local, y la variable miembro no ha cambiado en absoluto, ¡y sigue siendo el valor predeterminado!
      inserte la descripción de la imagen aquí

    • Las variables en el método son variables locales , almacenadas en la pila , y el alcance de la acción está dentro del método ; queremos inicializar las variables miembro a través del constructor , almacenadas en el montón , y el alcance de la acción está dentro de la clase .
      Cuando la variable miembro y la variable local tienen el mismo nombre , la variable local se usa primero .
      La clave es ver si hay variables locales. Si hay variables locales, las variables locales se usan primero, de lo contrario, el atributo: ¡el principio de proximidad!

inserte la descripción de la imagen aquí

1.2: ¿Por qué esto?

 A través del análisis anterior, encontramos que cuando la variable local y la propiedad tienen el mismo nombre, la propiedad no se puede inicializar con éxito en el constructor. Estamos pensando, si la variable que se puede asignar no es una variable local en el constructor, sino una variable miembro, ¿no se resolvería este problema? Si, entonces hay esto!!!

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 esta forma, se pasa this.属性para indicar que se trata de una variable miembro, que se distingue de las variables locales .

Parte 2: esta introducción

2.1: ¿Qué es esto exactamente?

  • Más explicación oficial:

La máquina virtual de Java (JVM) asignará un this a cada objeto para representar el objeto actual ,

  Ver esta oración es realmente molesto, parece ser el caso, ¿verdad? Pero no se siente muy común. ¡Yao Yaozi habla lenguaje humano!

Explícalo en términos humanos:

  • Esto en realidad puede entenderse como un atributo (variable miembro) del objeto , pero este atributo está oculto , es decir, esto es equivalente a un atributo oculto del objeto.
  • Al igual que otras propiedades de newun objeto, cuando se crea un nuevo objeto, se asigna espacio para el objeto en la memoria del montón y las propiedades se almacenan en este espacio. Y el valor de este atributo es la dirección del objeto en la memoria del montón , es decir, esto apunta al objeto (esto representa el objeto).

[Puntos clave] Para resumir: este es un atributo oculto de un objeto (esencialmente una variable miembro ordinaria). Al igual que otros non-staticatributos, a cada nuevo objeto se le asignará una variable miembro dedicada del objeto cuando se cree el objeto (esta es una de ellos. ), esta variable miembro se almacena en la memoria del montón, y el valor de esta variable es la dirección del objeto en la memoria del montón.

Es decir: para crear 1000 objetos, habrá 1000 esto, y son independientes entre sí (¡oh, esto es solo una variable miembro ordinaria!)

  • [Ilustración]:
    inserte la descripción de la imagen aquí

Parte 3: detalles de uso y precauciones

  • La palabra clave this se puede usar para distinguir propiedades y variables locales de la clase actual.
  • El uso de esta palabra clave se puede usar para acceder a las propiedades de la instancia, los métodos de la instancia y los constructores de esta clase ("instancia" se refiere a la non-staticmodificada)
    • Acceda a las propiedades de instancia de esta clase:this.属性
    • Accede a los métodos de instancia de esta clase:this.方法名(参数列表)
    • Acceda a este constructor de clase:this(参数列表)
  • [Nota]:this(参数列表) Para acceder al constructor de esta clase, debe prestar atención a los siguientes puntos
    • Solo se puede usar en el constructor,this(参数列表); es decir, acceder a otro constructor de esta clase en un constructor. ( El constructor predeterminado comienza con super();,).
    • Cuando se usa explícitamente , se anula this()el valor predeterminadosuper()
    • this(参数列表)y super(参数列表)Solo puede haber uno y solo uno de ellos en el constructor.
    • Si se usa en un constructor this(参数列表), esta declaración solo se puede colocar en la primera línea del constructor .
    • No se puede utilizar en métodos estáticosstatic method de clases . Es muy simple de entender: las variables miembro no pueden aparecer en métodos estáticos (esto depende de los objetos, y lo estático no depende de los objetos. Cuando no hay ningún objeto, ¡cómo puedes hacer que esto se sienta incómodo! Ni siquiera sabe qué objeto ¡pertenece a!) En [JavaSE] Tutorial de nivel de niñera | 10,000 palabras + 10 imágenes para aprender clases y objetos: se recomienda marcar la Parte 4 y la Parte 5 de esta publicación de blog , que se han explicado en detalle sobre los métodos miembro y los métodos estáticosthis类名.静态方法
//错误代码:
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依赖对象
	}
}
  • Una solución estúpida jaja: como necesitas un objeto, entonces haré newuno jaja, para que las variables de instancia y los métodos pertenezcan ~
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);
	}
}

La próxima vista previa - una explicación detallada de Java -
serie de columnas de paquete:

No es fácil ser original, si te es útil, ¡síguenos! ¡Soy Yaoyaozi y sigo publicando artículos de alta calidad!

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/Yaoyao2024/article/details/128753927
Recomendado
Clasificación