为什么在java中不允许分配到“this”?

2022-09-01 23:21:08

我从编译器那里得到的错误是“赋值的左侧必须是变量”。我的用例是深度复制,但并不真正相关。

在 C++ 中,可以分配给 。*this

问题不在于如何规避对 的赋值。这很简单,但决定不做变量背后有什么理由。thisthis

原因在于技术原因还是概念原因?

到目前为止,我的猜测 - 以随机方法重建对象的可能性容易出错(概念),但技术上是可能的。

编辑请克制“因为java规范这么说”的变体。我想知道决定的原因


答案 1

在C++中,可以分配给*this

是的,但是你不能C++,我实际上相信这与你在这里询问的Java方面的问题更匹配。this = something

[...]决定不将其作为变量的背后有什么理由。

我会说清晰度/可读性。

this被选为保留字,可能是因为它没有作为显式参数传递给方法。将其用作普通参数并能够为其重新分配新值,会严重破坏可读性。

事实上,出于这个原因,许多人认为你根本不应该改变参数变量。

原因在于技术原因还是概念原因?

我推测主要是概念性的。不过,会出现一些技术怪癖。例如,如果可以将值重新赋值到 ,则可以将实例变量完全隐藏在局部变量后面。this

到目前为止,我的猜测 - 以随机方法重建对象的可能性容易出错(概念),但技术上是可能的。

我不确定我是否完全理解这个陈述,但是是的,容易出错可能是决定使其成为关键字而不是变量的主要原因。


答案 2

因为这是最终的

this是关键字,而不是变量。并且您无法为关键字分配某些内容。现在考虑一下它是否是设计规范中的参考变量。并查看下面的示例

并且它包含对对象调用方法的隐式引用。它仅用于参考目的,现在考虑你分配一些东西,所以它不会破坏一切吗?this

考虑以下来自类的代码(注意:下面的代码包含编译错误,它只是为了演示OP的情况)String

   public CharSequence subSequence(int beginIndex, int endIndex) {
      //if you assign something here
       this = "XYZ"  ;
       // you can imagine the zoombie situation here
      return this.substring(beginIndex, endIndex);
   }