java - "this"是什么时候分配的内存位置,什么时候可以在 java 中调用方法

标签 java

class A
{
    B b;
    public A()
    {
        b = new B(this);
        //initialization of class A variables
    }

    public void meth1()
    {

    }
}

class B
{
    A a;
    public B(A a)
    {
        this.a = a;
    }
}

我知道这个引用不应该以这种方式传递,但是如果这样做会发生什么

其他一些类调用类 A 的构造函数。 “this”引用何时实际分配内存?是否会在调用 super() 之前调用 A 的构造函数时立即为其分配内存。

假设类 B 是一个线程,并且由于 B 具有 A 的引用,如果“this”引用尚未分配内存,B 可以在 A 的构造函数甚至不返回之前调用 A 上的方法。

最佳答案

对象的内存分配之前任何构造函数执行。否则构造函数将没有地方写入变量的值。

因此,您可以将对当前对象(又名 this)的引用传递给构造函数中的其他代码段。

正如您所指出的,该对象当时尚未完全构建,实际这样做是个坏主意,但“只是”因为对象的可以处于不一致的状态。此时已为该对象分配和保留内存。

this 只是对“当前对象”的引用,您可以将其视为任何非静态方法获取的另一个参数。事实上,这就是 JVM 对待它的方式。参见 JVMS §2.6.1 Local Variables :

On instance method invocation, local variable 0 is always used to pass a reference to the object on which the instance method is being invoked (this in the Java programming language).

因此,“this 何时分配”的直接答案实际上是:每当您在对象上调用方法时。

关于java - "this"是什么时候分配的内存位置,什么时候可以在 java 中调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15552312/

相关文章:

java - Http客户端在java中发布xml文件

java - 线程不会唤醒

java - 如何解决 ListView 音乐文件中的 ResourceNotFoundException

java - @Autowired 字段在测试中始终为空,我错过了什么?

java - 批量运行java程序

java - WatchService/dectect 重命名和/或移动

Java Builder 模式传递给 session JSP servlet

java - Android:错误:任务 ':app:transformClassesWithJarMergingForFlavorDebug' 执行失败

java - 在 Android 上运行 Java 小程序

java - 通过内置属性进行 Maven 编译器配置?