我要问的是,如果我在java中的类的main()
内声明一个数据成员,它是否会被实例化为该类对象的对象缓冲区?
例如:
class Demo{
int x=10;
public static void main(String... s){
int y=20;
Demo d=new Demo();
}
}
此处,int y
是否会在类d
的对象Demo
中实例化。如果没有,如何分配内存?它会被视为局部变量吗?
答案 0 :(得分:3)
不,y
在main
方法中被实例化为堆栈上的简单局部变量,因此它仅在该范围内可用。与任何其他局部变量一样,它会在其范围退出时被销毁,因此在这种情况下,y
会在main
退出时被销毁。
同样,d
是main
中的局部变量,但它指向的(em {{>}对象(在这种情况下为Demo
个对象)已分配在堆上。就像堆上的任何其他对象一样,当没有其他引用指向它时,它将被垃圾收集。当然,在这种情况下,d
是从main
方法的本地范围内指向它的引用,因此当d
为no时,该对象将仅被垃圾收集更长的时间(即main
退出后)。
然后还有多线程增加的额外复杂性,这使得对象的生命周期更难以推理。
答案 1 :(得分:2)
将为每个Demo实例创建一个单独的x实例化。每次主运行时都会实例化一个单独的y。