Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java实例变量生命周期_Java_Lifecycle - Fatal编程技术网

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());

我想了解更多关于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 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 dig
foo.bar()
的意思是:拿着名为
foo
的藏宝图,沿着地图走到上面的大X,然后,挖出并打开宝藏,然后对着它大叫“嘿,我给你发了信息“bar”,这大概会让宝藏做一些有趣的事情


尝试遵循空白的宝藏图会导致NullPointerException。

对象当然有可能符合GC条件,而不是其实例变量。这是非常普遍的。你已经在这里演示过了。GC收集没有任何剩余引用的任何对象。引用
D
C
不是;将收集
C
。不会对实例变量进行垃圾收集。当任何代码都无法再访问某个实例变量引用的对象时,该对象将被GC调用。对于具有实例变量的对象也是如此。您需要在头脑中更清楚地区分变量和对象实例。变量可以引用对象实例,但它不是实例,只是对它的引用。对象实例可以有实例变量,也称为字段,但变量和对象实例是完全不同的两件事。记住这一点,试着再次问这个问题。