编译器在构造函数初始化期间传递的实例变量和参数之间没有发现歧义?


package learning;
public class This_keyword {
int x;
int y;
This_keyword(int x,int y){
x = x;
y = y;
System.out.print("Value of 1st :" +x);
System.out.print("Value of 2nd :" +y);
}
public static void main(String args[]){
This_keyword sample = new This_keyword(4,5);
} 
}

这应该打印 0,0,因为我没有使用此关键字,但它仍然打印 4,5,它们作为参数化构造函数传递。

现在看看第二个代码,

package learning;
public class This_keyword {
int x;
int y;
This_keyword(int x,int y){
x = x;
y = y;
} 
void display(){ 
System.out.print("Value of 1st :" +x);
System.out.print("Value of 2nd :" +y);
}

public static void main(String args[]){
This_keyword sample = new This_keyword(4,5);
sample.display();
} 
}

现在是 prinitng 0,0,这是预期的和真实的,因为没有提到这个关键字,编译器在实例变量和参数之间解析相同的名称时存在歧义。

为什么编译器能够在第一种情况下打印值? 即使那边也存在歧义!!

在构造函数中,所有xy的非限定出现引用参数,而不是实例变量。 仔细遵循这个逻辑,你就会明白为什么你会得到你所做的结果。

在第一个示例中,您在构造函数中使用 System.out.print。由于构造函数接受"x"和"y"变量,因此最终引用传入的"x"和"y"值,而不是类的字段。如果您在第一个示例中将打印更改为使用"this.x"和"this.y",则得到 0 和 0。

在第二个示例中,您的 System.out.print 位于不同的方法中。请注意,您的显示方法在本地不接受"x"和"y"变量。由于方法本身没有"x"或"y",程序将尝试使用类本身的"x"和"y"字段,这就是你得到0和0的原因。

关键字"this"是指向进行调用的对象的指针(我随便使用"指针"一词;不是 100% 准确(。"this"有助于在局部变量与字段相同或处理继承时消除歧义。

那为什么不对局部变量使用不同的名称呢?你可以,是的。但是,当变量的名称开始变得更具描述性,因此很长时,随着程序复杂性的增加,为某些数据指定某些名称是有意义的,而不再使用名称只是为了区分它当前保存的位置。

在第一种情况下,您的println语句位于构造函数中。 他们只使用xy,而不是this.xthis.y,这意味着他们指的是构造函数的xy参数,而不是This_keywordxy成员。

在第二种情况下,print 语句位于一个单独的方法中,该方法没有称为xy的参数或局部变量。 所以在这里,xy指的是This_keyword类的成员。

最新更新