【问题标题】:Why is the "this" keyword final in Java? [duplicate]为什么Java中的“this”关键字是final? [复制]
【发布时间】:2014-12-05 07:10:20
【问题描述】:

这似乎是一件几乎没有人意识到的事情,但Java中的“this reference”是最终的。在正常的编程日,我认为我可以通过在自己的类中重新定义 this 引用来重新定义整个实例:

public void method() {
    this = new MyObject("arg1", arg2, arg3); //it throws a compile error
}

为什么 this 引用在 Java 中是最终的?

【问题讨论】:

  • 防止人们编写这样的代码。
  • It seems a thing that almost no one has realized 每个用 Java 写过真实程序的人都会意识到这一点。
  • final 仅与引用有关,与被引用对象的内容无关。
  • 'this' 是关键字而不是变量,您不能将某些内容分配给关键字。就是这样!

标签: java final


【解决方案1】:

问题不在于 thisfinal 引用 - 它本身根本不是引用。 this 是一个关键字,它“表示一个值,该值是对调用实例方法或默认方法的对象的引用”(JLS §15.8.3)。

此外,从可以重新分配变量的意义上说,重新分配它是没有意义的。请记住,重新分配引用只会更改该引用,而不会更改可能指向同一对象的其他引用。所以重新分配this 不仅很疯狂,而且毫无用处。

【讨论】:

  • +1 你不能在java句号中实例化关键字
【解决方案2】:

从理论的角度来看,我觉得这个问题很有趣。

从技术的角度来看,这是行不通的,因为在 Java 中,我们有按值传递引用 (http://www.javaworld.com/article/2077424/learn-java/does-java-pass-by-reference-or-pass-by-value.html),并且不能在代码的其他一些部分持有对该对象的引用的情况下交换对象——即Java 中不可能有真正的交换方法(请参阅链接文章)。

虽然理论上您可以重新分配 this,但对该对象的所有其他引用都不会改变,并且会使操作变得毫无意义。

您可以实现的最接近的事情是复制构造函数。

【讨论】:

    【解决方案3】:

    this 不是可以赋值的变量。它是一个内置表达式,返回作为当前执行方法的上下文的对象。

    虽然重新分配 this 可能对一些不错的 hack 有用,但它会搞砸各种事情。

    【讨论】:

      【解决方案4】:

      this 关键字用于提供对其类中当前对象的引用。大多数情况下,它用于澄清与类成员具有相同标识符的局部变量的范围问题。例如

      public void function (int param) {
         this.param = param   
      }
      

      将其重新分配给另一个对象超出了分配给键盘的任务。您想要做的(重新评估引用)可以在上层上下文中实现,即创建对象的上下文(并分配对它的引用)。

      【讨论】:

        【解决方案5】:

        错误地思考thisthis 只是 java 中的一个关键字(不是变量),它引用了当前实例,并且它的一个编译限制是关键字(不仅是 this)不能被初始化。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-08-14
          • 2018-09-20
          • 1970-01-01
          • 2011-12-10
          • 2014-05-11
          • 2011-07-11
          • 1970-01-01
          相关资源
          最近更新 更多