共有三堂课。

public class A
{
    private B b;
    private C c;

     public void abcMethod(){
        c = new C(this);
        b = c.xyzMethod(); // Doubt is here.
    }
}

public class B
{
    int i;
    public void setI( int i){
        this.i=i;
    }
    public int getI(){
        return i;
    }
}

public class C
{
     public B xyzMethod(){
        B b = new B();
        b.setI(10);
        return b;
    }
}


您可能已经注意到我对代码的怀疑。我的问题是-
1)为什么不需要“ new”为对象b分配内存?

可能的答案:“是由于作为数据成员的原因,它已经在创建A对象时分配了内存。”

2)我可能的答案正确吗?如果正确,为什么我们要使用new为对象c分配内存?也许是由于将“ this”传递给对象的原因。因此,为了进行适当的初始化,我们将new与参数“ this”一起使用。

3)如果我在上面的第2点是正确的,那么先前分配给对象c的内存会发生什么,因为new将分配新的内存块并将新地址分配给c?收集垃圾?

4)因此,从以上几点可以说,在创建包含类的对象时,已为包含类成员的对象分配了内存。我们可以直接为他们分配价值,而无需对其进行新的要求吗?

[我来自C ++,这在C ++中不会发生。如果一个类具有指向其他类的指针或引用,则需要为它们显式分配内存。]

请纠正我错的地方或我的理解中缺少的地方。
谢谢和最好的问候。

最佳答案

1)为什么不需要“ new”为对象b分配内存?


通过方法c.xyzMethod();创建一个新的B

public B xyzMethod(){
    B b = new B();
    b.setI(10);
    return b;
}


如您所见,此方法创建了功能齐全的B,并为其分配了内存并传递了对其的引用。对象A完全有权保留对此对象的引用。这与声明变量和在一行上初始化对象之间没有区别


2)我可能的答案正确吗?如果正确的话,我们为什么
使用新分配给对象c的内存?也许是由于其原因
将“ this”传递给对象。所以适当
初始化我们使用了带有参数“ this”的new。


重要的是要记住,对象A不需要为对象B分配内存,所有类A所需的都是用于引用对象B的内存。对象B可以保留在其他位置,并且许多A可以共享相同的B (尽管您的代码中并非如此)


3)如果我在以上第2点是正确的,那发生了什么
先前将内存分配给对象c作为new将分配新的块
内存并将新地址分配给c?收集垃圾?


假设在其他地方没有引用该对象(在您的代码中就是这种情况),则确实有资格被垃圾回收


4)因此,从以上几点可以说,内存已分配给
在对象时是包含类成员的对象
创建包含类。我们可以直接为
他们我们呼吁新的吗?


尽管实际上您可以考虑将对象“包含”其他对象,但这只是一种人工观察方式。例如,以下循环依赖关系非常好(尽管有时是不明智的):

public class A {
    private B b;

    public A() {
    }

    public B getB() {
        return b;
    }

    public void setB(B b) {
        this.b = b;
    }

    public void main(String[] args){
        A a=new A();
        B b=new B();

        a.setB(b);
        b.setA(a);

        //because all that a and b contain is references this circular referencing
        //doesn't blow up

        //this line is stupid, but perfectly valid
        A referenceToAnA=b.getA().getB().getA().getB().getA();

    }

}

public class B {
    private A a;

    public B() {
    }

    public void setA(A a) {
        this.a = a;
    }

    public A getA() {
        return a;
    }


}


最后的笔记

就像在C ++中一样,您必须使用new关键字为新对象分配内存,但是不必取消分配该内存,垃圾回收会处理该问题。

10-07 13:17
查看更多