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

Compiler not finding ambiguity among instance variable and parameters passed during constructor initialisation?

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();
        } 
}

现在是 printng 0,0,这是预期的并且是正确的,因为没有提到 this 关键字,编译器在解析实例变量和参数之间的同名时存在歧义。

为什么编译器能够在第一种情况下打印值??虽然那里也有歧义!!

在构造函数中,所有次不合格的xy指的是参数,不是实例变量。仔细遵循该逻辑,您就会明白为什么会得到这样的结果。

在第一种情况下,您的 println 语句在构造函数中。它们只使用 xy,而不是 this.xthis.y,这意味着它们引用构造函数的 xy 参数,不是 This_keyword.

xy 成员

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

的成员

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

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

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

那为什么不为局部变量使用不同的名称呢?你可以,是的。然而,当你的变量的名字开始变得更具描述性,并且因此变得越来越长时,随着你的程序的复杂性增加,为某些数据赋予某些名称而不是为了区分它当前所在的位置而不再使用这些名称是有意义的举行。