Java实例变量生命周期
我想了解更多关于Java实例变量生命周期的信息。考虑下面的场景:Java实例变量生命周期,java,lifecycle,Java,Lifecycle,我想了解更多关于Java实例变量生命周期的信息。考虑下面的场景: public class A { B b; public A(B b) { this.b = b; } public void process() { C c = getC(); b.register(c.getD()); } private C getC() { return new C(new D());
public class A {
B b;
public A(B b) {
this.b = b;
}
public void process() {
C c = getC();
b.register(c.getD());
}
private C getC() {
return new C(new D());
}
}
public class B {
List<D> dList;
public B() {
dList = new ArrayList<>();
}
public void register(D d) {
dList.add(d);
}
}
public class C {
D d;
public C(D d) {
this.d = d;
}
public D getD() {
return this.d;
}
}
公共A类{
B B;
公共服务A(B){
这个.b=b;
}
公共程序(){
C=getC();
b、 寄存器(c.getD());
}
私有C getC(){
返回新的C(新的D());
}
}
公共B级{
名单;
公共图书馆B(){
dList=newarraylist();
}
公众作废登记册(D){
d.增加(d);
}
}
公共C类{
D;
公共图书馆C(D){
这个。d=d;
}
公共D getD(){
把这个还给我;
}
}
当调用对象的public方法process
时,将创建一个局部变量C。一旦此方法返回,c的生命周期应该结束。但是,c的实例变量D现在被b引用,因此即使进程
方法返回,它也不应该被垃圾收集。对象是否可能符合GC条件,但不符合其实例变量?c及其实例变量d的生命周期是如何工作的
如果你能推荐一些关于这个主题的文档,那就太好了。我相信我理解基本概念,但肯定需要深入研究。对象和变量之间有很大的区别 Java是所有的指针,除了原语。除此之外,指针是一个有点脏的词,所以在java中这些被称为引用。波塔托,波塔托 因此,在这方面:
C c = getC();
这只是语法:
C c;
c = getC();
c
变量是一个指针(参考)。它就像一张上面有藏宝图的小纸片它不是宝藏
getC将运行:newc(newd())
new
是java ese的目标:凭空召唤宝藏,将其掩埋,然后还给我一张指向宝藏的地图。因此,newd()
将制作宝藏,将其埋在沙子中,然后给你一张宝藏地图(不是宝藏)。然后,宝藏图被传递给C。现在“java都是按值传递的,即只传递副本”开始有意义:只有一个“D”宝藏。但是那张地图呢?那是抄袭的。地图便宜、小,而且一直都是复制的
因此,C的构造器运行时,会有一个映射到您创建的新D宝藏的副本,结果是创建了一个C宝藏,并将其掩埋。现在,您的C变量是一个宝藏映射,如果您遵循它,它将使您找到该宝藏
当你的方法结束时,那张藏宝图瞬间变成稀薄的空气。那宝藏呢?这一点一直存在。有一段时间
在没有藏宝图的地方,有没有埋藏在沙子里的宝藏?这些垃圾最终会被收集起来
为了详细说明这种思考方式,
是JavaESE的缩写:Follow and digfoo.bar()
的意思是:拿着名为foo
的藏宝图,沿着地图走到上面的大X,然后,挖出并打开宝藏,然后对着它大叫“嘿,我给你发了信息“bar”,这大概会让宝藏做一些有趣的事情
尝试遵循空白的宝藏图会导致NullPointerException。对象当然有可能符合GC条件,而不是其实例变量。这是非常普遍的。你已经在这里演示过了。GC收集没有任何剩余引用的任何对象。引用
D
;C
不是;将收集C
。不会对实例变量进行垃圾收集。当任何代码都无法再访问某个实例变量引用的对象时,该对象将被GC调用。对于具有实例变量的对象也是如此。您需要在头脑中更清楚地区分变量和对象实例。变量可以引用对象实例,但它不是实例,只是对它的引用。对象实例可以有实例变量,也称为字段,但变量和对象实例是完全不同的两件事。记住这一点,试着再次问这个问题。