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/