在 JavaRush,学生们从第一堂课开始就逐字逐句地了解了关键字
事实证明,您只需
也就是说,
下面是带有关键字的程序代码
this
。随着时间的推移,它的含义就会变得清晰。但很多人回想起来,可能会诚实地对自己说,很长一段时间他们都无法意识到这个关键词的禅宗。this
在这篇文章中,我们为那些仍然无法弄清楚的人揭开了使用关键字的秘密......欢迎!如果您阅读Schildt 的 Java参考书,第 171 页,您会读到需要关键字this
,以便方法可以引用调用它的对象。这实际上可能是它的结束。但我们需要具体细节。 一般来说,this
它应该在两种情况下使用:
- 当类实例变量和方法/构造函数变量同名时;
- 当您需要从一种类型调用另一种类型的构造函数(例如,默认或参数化构造函数)时。这也称为显式构造函数调用。
示例一-实例变量和方法变量同名
假设我们有一个Human
定义了“name”字段的类: 让我们name
为变量创建一个 setter(该 setter 非常有效,这里没有技巧): 请注意,我们将变量传递给方法(setter )。我们引入了一个新变量,并且(通常)可以将其命名为我们想要的任何名称,因为它仅在方法的 {花括号} 内可见。请注意,setter 中有一行: setName
String newName
setName
name = newName;
也就是说,实际上我们引入了一个新变量newName
并将其赋值给类中已经存在的变量name
。许多程序员认为,如果最终我们谈论的是同一件事,那么引入一个具有新名称的变量很奇怪。关于班级里的名字Human
。因此,语言开发人员就想到了如何方便地使用一个变量名。换句话说,为什么同一个变量有两个名字呢?也就是说,我想做这样的事情: 但在这种情况下出现了一个问题。现在我们有两个名称相同的变量。一个String name
属于类Human
,另一个String name
属于它的方法setName
。因此,当你在 setter 中写入字符串时,Java 机器不知道你指的是哪个变量:
name = name;
name
Java从方法中 选取最接近的一个setName
:
name
从该方法中为变量分配一个值即可。这当然没有任何意义。因此,需要某种方法来区name
分类中的变量和方法中的Human
变量。为了解决这个问题,引入了关键字,在这种情况下,它将指示需要调用不是方法的变量,而是调用变量。一个类的: name
setName
this
Human
this
它将引用调用对象,如本文开头所述。结果,人名将setName
通过 setter 设置到创建的对象中。下面是不使用关键字的代码this
。该代码创建一个类对象Human
并为其命名:
this
:
public class Solution{
public static void main(String[] args) {
Human human1 = new Human();
human1.setName("Volodya");
human1.print();
}
}
class Human{
String name;
public String getName() {
return name;
}
public void setName(String name){
this.name = name;
}
void print(){
System.out.println(name);
}
}
因此,它this
避免引入新变量来表示相同的事物,这使得代码较少因附加变量而“过载”。
示例二 - 使用此显式调用构造函数
当您(奇怪的是)有多个构造函数并且您不想在新的构造函数中重写构造函数中先前给出的初始化代码时,从另一个构造函数调用一个构造函数可能会很有用。使困惑?一切并不像看起来那么可怕。看下面的代码,它有两个类构造函数Human
:
class Human{
int age;
int weight;
int height;
Human(int age, int weight){
this.age = age;
this.weight = weight;
}
Human(int age, int weight, int height){
//you call the constructor with two parameters
this(age, weight);
//and add the missing variable
this.height = height;
}
}
int age
这里我们首先有一个接受和 的 双参数构造函数int weight
。假设我们在其中编写了两行代码:
this.age = age;
this.weight = weight;
然后他们决定添加另一个带有三个参数的构造函数,除了年龄和体重之外,还需要身高。在新的构造函数中你可以这样写:
this.age = age;
this.weight = weight;
this.height = height;
但是,您可以使用关键字显式调用带有两个参数的构造函数,而不是重复已在此构造函数中编写的代码this
:
this(age, weight);
// and add the missing variable:
this.height = height;
所以你用三个参数告诉构造函数:
- 调用这个构造函数,它有两个参数。
- 并添加缺失的变量。
this
被传递给除静态方法之外的所有方法(因此它this
通常被称为隐式参数),并且可用于引用调用该方法的对象。没有必要害怕这个关键词,因为This
它并不可怕。
GO TO FULL VERSION