共有三堂课。
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关键字为新对象分配内存,但是不必取消分配该内存,垃圾回收会处理该问题。