在Java中使用“this”

时间:2009-02-05 15:13:17

标签: java this variable-assignment

如果我写下面的课程:

public class Example {

      int j;
      int k;

      public Example(int j, int k) {
           j = j;
           k = k;
      }

      public static void main(String[] args) {
           Example exm = new Example(1,2);
           System.out.println(exm.j);
           System.out.println(exm.k);
      }

}

程序编译,但是当我运行程序时,main方法将打印出两个0。我知道为了说我想在构造函数中初始化实例变量,我必须写:

this.j = j;
this.k = k;

但是如果我不写它,那么在构造函数中(在表达式的左侧和写入侧)评估(或考虑)哪个变量?是参数还是实例变量?它有所作为吗?

是否还有其他需要使用this的情况?

13 个答案:

答案 0 :(得分:30)

如果你没有在构造函数中写“this.variable”,并且你有一个局部变量(包括函数参数)与构造函数中的字段变量同名,那么将考虑局部变量;局部变量遮蔽了字段(也就是类变量)。

“这个”是唯一的出路:

class OuterClass {
  int field;

  class InnerClass {
    int field;

    void modifyOuterClassField()
    {
      this.field = 10; // Modifies the field variable of "InnerClass"
      OuterClass.this.field = 20; // Modifies the field variable of "OuterClass",
                                  // and this weird syntax is the only way.
    }
  }
}

答案 1 :(得分:10)

如果你在构造函数中只说j,那么编译器会认为你的意思是两种情况下的参数。所以

j = j;

简单地将参数j的值赋给参数j(这是一个非常毫无意义,但仍然有效的陈述)。

因此,为了消除歧义,您可以在this.前加上前缀,以明确表示具有相同名称的成员变量。

this的另一个用途是当你需要将对当前对象的引用传递给某个方法时,例如:

someObject.addEventListener(this);

在此示例中,您需要将当前对象作为一个整体引用(而不仅仅是对象的成员)。

答案 2 :(得分:6)

如果你不写这个,那么你将参数分配给自己;参数变量影响实例变量。

答案 3 :(得分:5)

当你想要返回对象本身时,这很有用

return this;

这很有用,因为如果一个类有例如Method1()和Method2(),两者都返回这个,你可以编写像

这样的调用
object.Method1().Method2()

同样在方法中,在调用期间将对象本身传递给另一个函数会很有用。

答案 4 :(得分:5)

另一种有用的方法(虽然很少使用)是声明方法参数final:

以下块将无法编译,从而立即提醒您错误:

  public Example(final int j, final int k) {
       j = j;
       k = k;
  }

答案 5 :(得分:3)

在构造函数代码中,您要为自己分配变量。 'j'是构造函数的参数中指定的j。即使它是上面定义的类变量j,那么你仍然说“j = j”......即j在左侧和右侧不会进行不同的评估。

  public Example(int j, int k) {
       this.j = j;
       this.k = k;
  }

答案 6 :(得分:3)

您遇到的问题称为variable shadowing。请查看different kinds of variables in Java的此概述。

一般来说:Java编译器使用它可以为赋值找到的最近变量。在一个方法中,它将首先尝试查找局部变量,然后将其搜索焦点扩大到类和实例变量。

我个人认为好的一个习惯(其他人不喜欢它)是使用m_为成员变量添加前缀,并使用不改变其值的CONSTANT_VARIABLES的大写字母。有意使用变量阴影的代码非常(!)难以调试和使用。

答案 7 :(得分:2)

在示例中将参数分配给自身。

更一般地说:如果你没有在你的变量前面添加一个范围,那么假定当前的范围 - 这是你的情况下的函数。 'this.j'告诉jre在对象范围内使用变量j - 对象的成员变量。

答案 8 :(得分:1)

就像罗伯特·格兰特所说的那样,'这个'就是你如何明确指出你是指成员变量而不是局部变量。

答案 9 :(得分:1)

要回答follow-up question about this with methodinner class mentioned by Srikanth is still a valid example of using this:(此次使用方法)

public class OuterClass
{
    void f() {System.out.println("Outer f()");};
    class InnerClass {
        void f() {
            System.out.println("Inner f()");
            OuterClass.this.f();
        }
    }
}

您与anonymous class具有相同的情况:

  

您可以通过以下方式引用外部类的方法:

     
      
  • MyOuterClass.this.yOuterInstanceMethod()
  •   
  • MyOuterClass.myOuterInstanceMethod()
  •   
  • 或只是myOuterInstanceMethod() ,如果没有歧义
  •   

答案 10 :(得分:0)

这并不能完全回答您的问题,但如果您使用Eclipse,您可能会发现“分配无效”设置很有用。我相信这也将在其他IDE中。

答案 11 :(得分:0)

您可能需要查看What is the advantage of having this/self pointer mandatory explicit?
虽然在Java中使用this并不是强制性的,因为您注意到我确信它会对在Java中使用this的主题有所了解。

答案 12 :(得分:0)

要避免这种情况,请使用IDE(如Eclipse),在这种情况下会生成警告。

此外,除非绝对不能,否则请将您的字段设为最终字段。这样做有很多原因(除此之外)。