2014-05-09 82 views
-1

看看這個例子:的方法中創建一個新的實例,它仍然是外界方法

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(),新機箱的實例是創建爲參數engine對象,並且創建的新對象的引用也保持在方法外?

    • 例如:

      如果我調用方法print()調用foo()它將打印創建新對象Chassis的內存地址後?

  • 如果我叫doSomething()Engine創建和我立刻打電話setEngine,在這種情況下,類車點的引擎「指針」到新的實例我創建

    • 舊引擎 「指針」 是carbage收集
    • 現在的參考是創建的新實例
    • 如果我回電foo,一個新的機箱是由一個新的引擎實例創建的?

所有這些考慮是正確的?

回答

2

如果我調用foo(),底盤的新實例被創建爲一個參數的 發動機對象,並且還創建的新對象的引用保持 以外方法正確?

例如:

,如果我調用foo之後調用方法print()()將打印新對象機箱的內存 地址創建?

是的,只要兩個方法都會在Car的同一個實例上調用,您可以試試。

chassisCar類的一個實例字段,以及內部foo()方法,您要創建的Chassis一個實例,並將其分配給實例字段chassis

如果我叫DoSomething的()的新引擎創建和馬上我叫 setEngine,在這種情況下,發動機的中高級車的「指針」 指向新的實例我創建:

舊引擎「指針」是carbage收集,現在引用 新的實例創建,如果我回電foo,一個新的底盤是 創建一個新的引擎實例?

位校正那裏,引用不垃圾收集,只有對象是垃圾收集。當您將對象分配給引用時,如果前一個對象沒有任何實時引用,則該對象將被GGed。

+0

好的,所以它會打印兩個地址的內存,理解。關於其他的考慮@Abimaran Kugathasan。 – OiRc

+0

@Cimat:答案更新了 –

+0

,在這種情況下,它是整個舊的對象機箱,可以被刪除?,自然在調用doSomething()之後,因爲您可以看到沒有該對象的強引用,並且新實例可以創造得很好@Abimaran Kugathasan – OiRc

相關問題