【问题标题】:Can someone explain to me in detail the use of 'this'?有人可以详细解释一下“this”的用法吗?
【发布时间】:2012-04-15 22:53:21
【问题描述】:

我不太了解 Java 中“this”的用法。如果有人能帮我澄清一下,我将不胜感激。

在这个网站上写着:http://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html

“在实例方法或构造函数中,这是对当前对象的引用——正在调用其方法或构造函数的对象。您可以通过以下方式在实例方法或构造函数中引用当前对象的任何成员用这个。”

它给出了以下示例:

比如Point类是这样写的

public class Point {
    public int x = 0;
    public int y = 0;

    //constructor
    public Point(int a, int b) {
        x = a;
        y = b;
    }
}

但也可以这样写:

public class Point {
    public int x = 0;
    public int y = 0;

    //constructor
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

然而,我仍然不完全明白为什么 x = a 可以写成 this.x = x?为什么不是this.x = a?为什么x在左边?

很抱歉,我对 Java 很陌生。我很抱歉让专家们感到厌烦。

【问题讨论】:

  • 在第二个例子中,构造函数的参数被命名为xy而不是ab,所以说this.x = a没有意义,因为没有a 存在。在您的第一个示例中,this.x = athis.y = b 完全可以接受。 this 用作区分同名变量的常用方法,如在第二个示例中,如果您只是说x = x,编译器将无法分辨哪个x 是哪个。

标签: java object methods this


【解决方案1】:

如果定义了一些与对象属性同名的变量/参数,它会“重叠”该属性的名称,并且应该使用 this.var_name。

所以是的,它可以写成this.x = a,但有些多余。

【讨论】:

  • 您能具体说明为什么使用this 引用是多余的吗?提前致谢。
  • 忽略我之前的评论。 :)
【解决方案2】:

在第二个例子中,其中一个参数被命名为 x。通过引用 this.x,您的意思是该方法所属的类的 x 字段/属性。它可以读作: Point.x = 参数 x

这是用于区分两者,使代码的含义清晰。

【讨论】:

    【解决方案3】:

    不是 this.x = a,因为在第二个示例中没有“a”。关键是您可以重用相同的变量名,这样不会造成混淆:-|

    【讨论】:

      【解决方案4】:

      我们的想法是非常清楚地表明您在构造函数中为xy 提供值。

      现在的问题是,由于在构造函数x 中引用传递的值而不是字段x 的作用域规则。因此x = x 导致参数被分配了自己的值并且阴影字段保持不变。这通常不是我们想要的。

      因此,需要一种机制来表示“我需要另一个 x,而不是此处立即可见的那个”。这里this 指的是当前对象 - 所以this.x 指的是当前对象中的一个字段,super 指的是这个对象扩展的对象,因此您可以“向上”访问一个字段。

      【讨论】:

        【解决方案5】:

        this 是对当前对象的引用,因此您可以像访问任何其他对象一样访问它 - this.xthisx 属性。所以x 是传入的参数,您将其分配给this.x

        这是命名空间 - 变量名称仅适用于给定代码块的想法。在 java 中,您在属于该类的函数中工作,您位于该类的命名空间中,但是,如果您有另一个与参数同名的变量,它将优先,您可以访问属性通过this

        this也可以用其他方式使用。例如,假设我想从类中将当前对象绘制到虚构库中的屏幕上,我可以这样做:

        window.draw(this)
        

        你也可以调用函数

        this 允许我们引用我们当前“内部”的对象,因此我们可以将当前对象作为参数传递。这非常有用。 (没有双关语)。

        【讨论】:

          【解决方案6】:

          “this”是对您正在使用的当前对象的引用。当字段和参数之间存在名称冲突时,您可以使用它。参数优先于字段。

          没有冲突,不需要这个:

          public Point(int a, int b) {
              x = a;
              y = b;
          }
          

          但这也可以:

          public Point(int a, int b) {
              this.x = a;
              this.y = b;
          }
          

          名称冲突,需要使用“this”:

          public Point(int x, int y) {
              this.x = x;
              this.y = y;
          }
          

          如果你只这样做了

          public Point(int x, int y) {
              x = x;
              y = y;
          }
          

          那么你只需为参数分配它自己的值,这实际上什么都不做。

          关键字“this”的用法更多。

          【讨论】:

            【解决方案7】:

            “This”是一个隐藏的“参数”,它会为您传递,以便对对象进行操作的方法知道它们要对哪个对象进行操作。

            现在假设您传递名称“x”的参数,但该类确实已经定义了该 var 名称。发生什么了 ?好吧,“属于”对象的名称 x 和参数 x 不是同一个数据对象,但它们共享名称。

            为了消除歧义,您需要明确地说“this.x”,它告诉编译器您正在谈论的 x 已经属于“this”对象。 (即,您正在尝试操作的当前对象。)

            【讨论】:

              【解决方案8】:

              在第二个例子中,构造函数的参数不是ab;改成xythis.x = x;的意思是“把这个Point类实例的成员变量x赋值给构造函数x”。

              【讨论】:

                【解决方案9】:

                这确实与 java 编译器如何通过名称识别变量有关。函数(正式)参数名称位于类成员变量之前。在第一个示例中,形参名称是 a 和 b,它们不会与成员变量 x 和 y 发生冲突,因此写作

                x = a;
                

                是合乎逻辑的,因为 x 只能表示成员变量类 Point。

                在第二个示例中,x 既指形式参数名称,也指成员变量。在函数体中写入 x 是指参数,因此如果您需要其他方式来引用成员变量 x。这是通过通过 'this' 关键字显式访问成员来完成的。

                【讨论】:

                  猜你喜欢
                  • 2011-01-09
                  • 2011-06-24
                  • 2021-04-11
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-07-24
                  • 2013-08-26
                  • 1970-01-01
                  相关资源
                  最近更新 更多