2017-11-11 85 views
-1

我看到隔壁班:爲什麼有可能聲明一個返回正在創建的同一類的類型的方法?

public static class DetailsFragment extends Fragment { 

    public static DetailsFragment newInstance(int index) { 
     DetailsFragment f = new DetailsFragment(); 

     // Supply index input as an argument. 
     Bundle args = new Bundle(); 
     args.putInt("index", index); 
     f.setArguments(args); 

     return f; 
    } 
} 

什麼,我不明白的是爲什麼你可以返回DetailsFragment型即使you're只是定義DetailsFragment是什麼。對於我來說(一個新手),就像在字典中搜索一個詞,定義使用這個詞來定義它。

請解釋。 在此先感謝。

+1

那麼,一個類的構造函數也在類中。這就是實際用來構造類的實例的內容。那麼爲什麼類的靜態方法不能調用這個構造函數呢?沒有什麼可以解釋的。它不僅被允許,而且是一種常見的被稱爲工廠方法的模式。 –

+2

您需要區分類和類本身的實例。類就像你的字典隱喻之後的定義。實例化一個類可以被看作是使用定義(更多的是模板)來創建實際的東西(例如* apple *是類* Apple *的一個實例)。 – jrook

+0

你似乎有區別聲明一個類(以及類型)實例化該類(或類型)的對象的問題。 – Seelenvirtuose

回答

1

構造與上newInstance方法靜態工廠法

static modifier是關鍵。該修飾符將方法定義爲分離,簡單代碼以獨立運行,而不是定義屬於對象(實例)的行爲。

靜態方法是Java的一部分,即而不是object-oriented。長話短說,有時只需運行一大塊代碼而不用捆綁到一個對象上就很方便。

如果您遵循常見的Java命名約定,其中一個類用一個初始的高級字符命名,並且該類的一個實例用一個初始小寫字母命名,那麼您可以輕鬆地發現靜態方法的調用。

DetailsFragment.newInstance() // A static method call made on a class. Not object-oriented. 
detailsFragment.someMethod() // Instance method, invoked on one instance (one object) of type DetailsFragment named 'detailsFragment'. 

所以你newInstance方法構造方法。它是類似於的構造方法,因爲它旨在創建一個對象。這種方法有時被稱爲工廠方法。

您的思路是正確的。一個爲同一個類調用new的構造函數會導致無限循環的對象創建一個創建對象的對象,直到您的應用程序執行失敗。這種重複呼叫被稱爲recursion。如果失控,遞歸是不好的,導致你的應用程序失敗。工廠方法的遞歸也會以同樣的方式失敗,直到失敗纔會無休止地運行。

但是在這裏我們有一個調用構造函數的工廠方法,通過調用new。所以,沒有不受控制的遞歸,根本沒有遞歸。

如果您對這些概念還不熟悉,那麼將自己的思想包裹在其中可能會很棘手。對我而言,關鍵在於,當我的眼睛達到任何使用static修飾符的角度時,我認爲「不是面向對象」,並將我的大腦從OOP模式轉移出來,轉而根據簡單的過程代碼進行思考。

在視覺上,我認爲一個類是一個餅乾,對象/實例是正在生產的餅乾,而靜態方法是一個由字符串綁定到餅乾的註釋。這種靜態方法實際上與類沒有任何關係,但將它與類綁在一起給我們留下了一個地方,這是我們稍後查找和調用該方法的一種方式。

+1

也就是說,狗創造了狗,貓創造了貓,並且完全允許類的實例方法創建同一類的其他實例。 –

+0

不過這不僅僅是關於'static'。有許多實例方法的例子返回同一類的實例,例如'substring','concat','subList'(和'String.toString()',但這是一種不尋常的情況!)。 –

+0

@AndyTurner&JBNizet我正在處理這個問題的具體問題,我認爲這個問題是作者將靜態工廠方法與構造函數混合在一起的。這兩人確實很容易混淆。我們不需要在這裏解釋面向對象的每個方面,只有混淆作者的特定方面。 –

相關問題