2010-05-17 53 views
2

我有類似如下的靜態變量測試oObject創造者

TestObjectCreator{ 

    private static Person person; 

    private static Company company; 

static { 
    person = new Person() 
    person.setName("Joe"); 
    company = new Company(); 
    company.setName("Apple"); 
} 

public Person createTestPerson(){ 
    return person; 
} 

public Person createTestCompany(){ 
    return company; 
} 

}

通過應用靜態{}我是什麼獲得?我認爲這些對象是單身人士。但是,如果我做了以下操作:

Person person = TestObjectCreator.createTestPerson(); 
    person.setName("Jill"); 
    Person person2 = TestObjectCreator.createTestPerson(); 

將person2命名爲Jill或Joe?

+0

我相信「Person person = TestObjectCreator.createTestPerson();」會導致編譯器錯誤,因爲該方法未聲明爲靜態,並且您沒有TestObjectCreator的實例。 – DJClayworth 2010-05-17 20:49:56

+0

不正確。靜態塊在靜態方法之前執行 – 2010-05-17 23:54:43

+0

不,編譯器錯誤。 createTestPerson()是一個實例方法。 – DJClayworth 2010-05-18 13:32:42

回答

2

字段上的靜態關鍵字導致它們表現爲類實例。整個類有一個對象副本,並且該類的所有實例將共享同一個對象。當類被加載到JVM中時,您創建的靜態構造函數將被調用。這設置了類的靜態字段。在此之後,對該對象的所有實例反映對靜態字段的任何更改。

在你的例子中,這意味着當TestObjectCreator類被加載到JVM中時,該人被創建並且名字被設置爲「Joe」。然後,您使用第一個TestObjectCreator.createTestPerson()調用來檢索此人,並將該人員的姓名更改爲「Jill」。由於TestObjectCreator只有一個人,所以你現在已經在所有情況下改變了這個人的名字。所以,人2將被命名爲「Jill」。

+0

謝謝,那就是我一直在尋找的!我會盡我所能給你答案。 – stevebot 2010-05-17 19:15:50

+0

沒問題! static關鍵字是Java中更令人困惑的一點。我真的很高興我可以幫你清除它。 – Zoe 2010-05-17 19:19:56

0

我看不到你的setter方法,但它會是Jill,以防你正確實現它。

目前你的類並不是完全單一的,因爲它仍然可以創建你的類的幾個實例。爲了讓你的類單身,讓你的構造函數是私人的。然後,編寫一個TestObjectCreator的靜態實例並通過靜態工廠方法返回它。

使Person和Company靜態化的好處在於,TestObjectCreator的所有實例都具有Person和Company的相同副本。我不確定這是否是你想要的,但它是靜態提供給你的。