所以對於麪包類,它顯然可以這樣寫:爲什麼Toast可以在沒有新關鍵字的情況下實例化?
Toast toastMessage = Toast.makeText(this, "Hello", Toast.LENGTH_SHORT)
toastMessage.show();
究竟爲什麼可能toastMessage實例化和作爲一個對象而新的關鍵字?
toastMessage如何通過方法實例化?
所以對於麪包類,它顯然可以這樣寫:爲什麼Toast可以在沒有新關鍵字的情況下實例化?
Toast toastMessage = Toast.makeText(this, "Hello", Toast.LENGTH_SHORT)
toastMessage.show();
究竟爲什麼可能toastMessage實例化和作爲一個對象而新的關鍵字?
toastMessage如何通過方法實例化?
沒有什麼特別之處Toast
這裏。你只是調用一個創建實例的靜態方法(或者可能重用一個現有的實例 - 這是一個實現細節)。例如,您會在整個地方看到這種模式 - Calendar.getInstance()
。有時你可以調用構造函數,有時候你可以通過只有通過靜態方法創建一個實例。
除非有什麼工藝在引擎蓋下進行,否則的某個地方在實現中會有一個對構造函數的調用。這裏有一個簡單的例子:
public final class CreateViaMethod {
private final String name;
private CreateViaMethod(String name) {
this.name = name;
}
public static CreateViaMethod newInstance(String name) {
return new CreateViaMethod(name);
}
}
爲什麼有一個API設計者可能想這樣做,有多種原因。例如,可能有幾個具有相同參數類型但具有不同名稱的「創建」方法,例如,
public static Duration fromSeconds(int seconds)
public static Duration fromMinutes(int minutes)
public static Duration fromHours(int hours)
...你不能有三個重載的構造函數在那裏,但你可以給方法不同的名稱。
因爲Toast.makeText()是一個返回Toast對象的靜態方法。
這是一個初學者的問題,但相當不錯。讓我給你一個普遍的答案。
讓我們假設你有MyClass
,像這樣:
public class MyClass {
public MyClass() {} //constructor
public static MyClass generateMyClass() {
return new MyClass();
}
}
您可以使用MyClass.generateMyClass()
它創建了一個MyClass
實例,並返回它:
MyClass myClassInstance = MyClass.generateMyClass();
這同樣與Toast.makeText
。閱讀更多here。
不確定...但可能以類似'SomeClass.getInstance()'的單一類的方式? 'makeText()'方法可能是創建一個新對象或者返回一個已經存在的對象。 – Codebender