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

时间:2017-07-03 03:19:14

标签: java constructor resolve ambiguity

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这是预期的和真实的,因为没有提到这个关键字编译器有一个歧义解决实例变量和参数中的相同名称。

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

在第一种情况下,您的println语句位于构造函数中。他们只使用xy,而不是this.xthis.y,这意味着它们引用了构造函数的xy参数,不是x的{​​{1}}和y成员。

在第二种情况下,print语句位于一个单独的方法中,该方法没有参数或名为This_keywordx的局部变量。因此,yx代替y类的成员。

答案 2 :(得分:0)

在第一个示例中,您在构造函数中使用System.out.print。由于您的构造函数接受了' x'和一个' y'变量,你最终指的是' x'并且' y'传入的值,而不是类的字段。如果您更改了打印件以使用' this.x'和' this.y'在你的第一个例子中,你会得到0和0。

在第二个示例中,System.out.prints位于不同的方法中。请注意您的显示方法如何不接受' x'并且' y'变量局部。因为没有' x'或者' y'在方法本身,程序将尝试使用' x'并且' y'类本身的字段,这就是你获得0和0的原因。

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

为什么不为局部变量使用不同的名称呢?你可以,是的。但是,当变量的名称开始变得更具描述性,并且因此随着程序复杂程度的增加而变得更长时,为某些数据提供某些名称而不再仅仅为了区分它的位置只是为了区分它们是有意义的。 ; s目前正在举行。