为了账号安全,请及时绑定邮箱和手机立即绑定

将实例变量设置为类本身的实例

将实例变量设置为类本身的实例

四季花海 2021-08-06 10:24:23
我不知道如何表达这个问题,我不是在寻求帮助,我只是想知道为什么这是可能的。假设我有一个类 foo:public class foo {    private foo i = this;    public foo() {        ...    }}为什么我可以设置i为类本身的实例?
查看完整描述

2 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

让我们看看foo创建对象时会发生什么。

foo x = new foo();

遇到newJVM 时会foo在堆中创建一个对象。下一步(注意它的下一步)是构造函数的执行。在 java 对象在堆上创建,然后构造函数被调用。这就是即使构造函数抛出异常,即使对象被创建(可以在 finalize() 中回收)的原因。因为对象已经创建并且存在于堆中,所以引用可以引用它。 this是对对象的引用。

现在private foo i = this;作为构造函数的一部分执行(这是按照 java 行为,所有实例字段如果在声明的地方初始化,它就会在调用构造函数时执行)。 this已经指代在堆上创建的对象,现在i还指代堆上的同一个对象。一旦构造函数成功执行,没有任何异常,变量x也指向堆上的同一个对象。

所以我们有一个对象foo我们有对该对象的引用,如下所示:

  1. this(来自 的实例方法foo

  2. 我们有实例可变 i

  3. 我们有变量x作为对该对象的引用

同样i是类型,foo因此它可以引用类型对象,foo并且this也是引用类型foo对象的类型引用foo。使i等于this使i也指代相同的对象。

希望这有助于消除您的疑虑。


查看完整回答
反对 回复 2021-08-06
?
烙印99

TA贡献1829条经验 获得超13个赞

Java中的变量就像指针,它们实际上并不是对象,而是指向保存对象的存储空间。所以你创建了一个指针,指向你自己的对象。


查看完整回答
反对 回复 2021-08-06
  • 2 回答
  • 0 关注
  • 190 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信