这似乎是几乎没有人意识到的事情,但是这个参考"在Java中是最终的。在正常的编程日,我想我可以通过在自己的类中重新定义这个引用来重新定义整个实例:
public void method() {
this = new MyObject("arg1", arg2, arg3); //it throws a compile error
}
为什么这个引用在Java中是最终的?
答案 0 :(得分:8)
问题不在于this
是final
引用 - 它根本不是一个引用。 this
是关键字,“表示一个值,该值是对调用了实例方法或默认方法的对象的引用”(JLS §15.8.3)。
此外,在可以重新分配变量的意义上重新分配它是没有意义的。请记住,重新分配引用只会更改该引用,而不会更改可能指向同一对象的其他引用。所以重新分配this
不仅会疯狂,而且也会毫无用处。
答案 1 :(得分:2)
从理论的角度来看,这个问题很有意思。
从技术角度来看,这不起作用,因为在Java中我们有值传递引用(http://www.javaworld.com/article/2077424/learn-java/does-java-pass-by-reference-or-pass-by-value.html)并且不能交换出代码的某些其他部分持有对该对象的引用的对象 - - 即Java中不可能使用真正的交换方法(参见链接文章)。
虽然理论上你可以重新分配this
,但对象的所有其他引用都不会改变,并使操作变得毫无意义。
你可以实现的最接近的是复制构造函数。
答案 2 :(得分:1)
this
不是您可以为其指定值的变量。它是一个内置表达式,返回作为当前正在执行的方法的上下文的对象。
虽然重新分配this
可能对某些不错的黑客有用,但它会搞砸所有类型的东西。
答案 3 :(得分:1)
this
关键字用于提供对其类中当前对象的引用。大多数情况下,它用于阐明具有与类成员相同标识符的局部变量的范围问题。 E.g。
public void function (int param) {
this.param = param
}
将其重新分配给另一个对象超出了分配给键盘的任务。你想做什么,(重新引用一个引用)可以在上层上下文中实现,即创建对象的上下文(并指定了对它的引用)。
答案 4 :(得分:0)
错误地考虑this
。 this
只是java中的一个关键字(非变量),它引用了当前实例及其编译限制,即关键字(任何不仅this
)都无法初始化。