看看这个例子:
Class Car{
private Chassis chassis;
private Engine engine;
public Car(Engine engine){ //passing a object that is instantiated outside the class
this.engine = engine;
}
public void foo(){
chassis = new Chassis(engine);
}
public void print(){
System.out.println(chassis);
}
public setEngine(Engine engine){
this.engine = engine;
}
}
class CarPark{
private Car car;
public CarPark(Car car){
this.car = car;
}
public void doSometing(){
Engine engine = new Engine();
car.setEngine(engine);
}
}
一些注意事项:
如果我致电foo()
,则会创建 Chassis 的新实例作为engine
对象的参数, 以及创建的新对象也在方法之外吗?
例如:
如果我在调用print()
后调用方法foo()
,它会打印创建的新对象Chassis
的内存地址吗?
如果我致电doSomething()
,则会创建新的Engine
并立即拨打setEngine
,在这种情况下, 引擎“指针” class car指向我创建的新实例 :
所有这些考虑因素都是正确的吗?
答案 0 :(得分:2)
如果我调用foo(),则会创建一个新的Chassis实例作为参数an 引擎对象,以及创建的新对象的引用也保留 外面的方法吧?
例如:
如果在调用foo()之后调用方法print(),它将打印内存 机箱创建的新对象的地址?
是的,只要在同一个Car实例上调用这两个方法,你可以试试。
chassis
是Car
类的实例字段,在foo()
方法内,您正在创建Chassis
的实例并将其分配给实例字段{{1} }
如果我调用doSomething(),则会创建一个新引擎并立即调用 setEngine,在这种情况下,引擎"指针"班车 指向我创建的新实例:
旧引擎"指针"是垃圾收集现在参考是 创建了新实例,如果我回调foo,则会创建一个新机箱 使用引擎的新实例创建?
那里的位校正,引用不是垃圾收集,只有对象是垃圾收集。当您将对象分配给引用时,如果它没有任何实时引用,则前一个对象将被GGed。