【问题标题】:Why isn't the "this." command needed in this constructor? (java)为什么不是“这个”。这个构造函数中需要的命令? (爪哇)
【发布时间】:2011-01-30 11:44:33
【问题描述】:

我正在读一本关于 java 的书。它只是解释了如何创建一个名为“deck”的类,该类包含一组卡片作为其实例变量。这是代码片段:

class Deck { 
    Card[] cards; 
    public Deck (int n) { 
        cards = new Card[n]; 
    } 
} 

为什么不使用this. 命令?

例如为什么代码不是这样:

class Deck { 
    Card[] cards; 
    public Deck (int n) { 
       this.cards = new Card[n];
    }
}

【问题讨论】:

  • 第二个例子有错误。有 2 个[
  • 注意:如果您想讨论使用或省略this. 是否是一个好主意,那么还有很多其他地方可以讨论这个问题。例如,看到这个问题:stackoverflow.com/questions/132777/…

标签: java constructor class


【解决方案1】:

因为没有歧义。只有一个cards 变量。如果有两个,则需要this - 其中一个是实例变量(当前是类的一部分),另一个是构造函数的参数。

顺便说一句,this 不是“命令”。这是一个“关键字”。

【讨论】:

    【解决方案2】:

    this. 是隐含的。

    一般来说,最好只在绝对必要时使用this(至少认为它是一个)。例如,当您有一个名为cards 的局部变量和一个名为cards 的成员变量时,您将需要this.cards 来引用成员变量,因为cards 引用的是局部变量。

    在这种情况下,this 是个好主意(尽管重命名成员变量可能更好)。

    在所有其他情况下,隐式this 可以工作,使用它。

    【讨论】:

    • 可以这个。总是被省略呢?还是您的意思是作者希望它在那里但不是因为它隐含相对于读者而写它?
    • @David:它总是可以省略,除非你还有一个同名的局部变量(因为 cards 本身就是局部变量而不是实例变量,你会需要this.cards 显式引用实例)。
    • 为什么只在绝对必要时才使用它?
    • 因为它是隐含的,每个人都应该知道?这也是无关紧要的; 5 个额外的字符对可读性毫无帮助。好吧,是这样认为的……显然这是主观的。
    【解决方案3】:

    您无需使用this 关键字来限定对成员的所有访问权限。仅当另一个变量隐藏成员方法时才需要使用它。

    这不是一个仅限于构造函数的功能,而是在所有方法中都可用:

    public class Test 
    {
       private int member;
       private int value;
       public Test(int value) {
          member = 5;
          this.value = value; // required to differentiate from the parameter
       }
       public void f( int member ) {
          int value = 5
          this.member = value; // assign local 'value' (5) to member 'member'
          this.value = member; // assign parameter 'member' to member 'value'
       }
    }
    

    【讨论】:

      【解决方案4】:

      对象的this 引用是隐含的,但它有助于清晰(并且消除对象成员和同名局部变量之间的歧义是必要的,如下面的构造函数中所示):

         public class Foo {
             final private int x;
      
             public Foo(int x) { this.x = x; }
      
             public int getX() { return this.x; }
         }
      

      【讨论】:

        【解决方案5】:

        当您在构造函数中使用标识符 cards 时,编译器会注意到字段(也称为成员变量)cards 在范围内,并使用它。 this.cards 仅用于解决歧义,例如,如果您还有一个名为 cards 的局部变量或参数。

        【讨论】:

          【解决方案6】:

          如果您还有一个名为cards 的参数,那将是有意义的。然后this.cards 将指定您的意思是类的字段cards,而不是参数。

          但无论如何,在您的示例中描述的情况下使用this. 被认为是一种好习惯。

          【讨论】:

          • 不,在您的源代码中添加视觉噪音不是一个好习惯。
          • @Bombe:这取决于你问谁。 一些人认为使用this.是一种好的做法,而其他人则不认为。
          • 确实如此。所以,这不是一个好的做法,因为无论如何都没有好的做法。 :)
          【解决方案7】:

          This 是隐含的。

          让我们详细说明:

          class Deck { 
               Card[] cards; 
               public Deck (Card[] cards) { 
                    this.cards = cards; 
               } 
          } 
          

          在这种情况下,您传入一个与对象的卡片数组同名的卡片数组。 This 指的是对象的数据成员,而不是构造函数的参数。

          【讨论】:

            【解决方案8】:

            在这种情况下,“this”关键字是多余的。卡片已经在类范围内定义,并且编译器知道该成员是“this”类的一部分。

            【讨论】:

              【解决方案9】:

              “this”是隐含的。没有必要使用“这个”。我通常把它放在那里只是为了使代码可读,但同样不是必需的。

              【讨论】:

                【解决方案10】:

                我尝试以不需要“this”关键字的方式选择变量名。也就是说,如果我有一个名为“value”的属性,我将传递给一个名为 val 的参数。

                “this”关键字的一个很好的用途是构造函数重载。考虑以下内容(我将使用它来演示差异):

                public class Person
                {
                   int age;
                   public Person(int age)
                   {
                      this.age=age;
                   }
                   public Person()
                   {
                      this(25); //default age
                   }
                }
                

                如果可能,我会尽量避免属性和参数名称相同,以避免在第 6 行看到的情况。但是,使用 this 关键字调用另一个构造函数是防止代码重复的好方法.这是一个微不足道的例子,但是当你开始发现自己的构造函数可以做很多相同的工作而它们之间的差异很小时,它就派上用场了。

                【讨论】:

                  猜你喜欢
                  • 2011-09-02
                  • 2013-07-28
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多