[英]Singleton design pattern, static access non static?
我認為是一種常見的Singleton設計模式:
public class Singleton{
private static Singleton instance;
private Singleton(){}
public static Singleton getInstance(){
if(instance==null)
instance=new Singleton();
return instance;
}
}
據我所知,構造函數是NON靜態方法,因為它們可以使用上下文引用“ this”(在靜態上下文中被禁止)。 另一方面,靜態成員只能訪問靜態成員。
那么,靜態成員getInstance()如何訪問非靜態成員構造函數呢?
當您看到像new Singleton()
這樣的對象創建時,必須將new
運算符與構造函數代碼區分開,或更准確地說,是初始化程序代碼。
new
運算符就像一個靜態方法調用一樣。 它不需要對象的實例,因為它創建了一個。
構造函數代碼更像是實例方法,不同之處在於它沒有返回類型。 但是它可以訪問this
參考。
當您深入研究所生成的字節碼時,至少會看到差異。 new
運算符將導致此字節碼指令。
NEW yourpackage/Singleton
該指令僅在內存中創建對象。 參見jvms-6.5.new
創建對象后,通過執行初始化程序代碼對其進行初始化。 在字節碼中,它看起來像:
INVOKESPECIAL yourpackage/Singleton.<init> ()V
初始化程序代碼不僅僅是構造函數代碼。 它調用超類的初始化程序並初始化實例字段。
另請參閱Java虛擬機規范2.9
在Java虛擬機級別,用Java編程語言(JLS§8.8)編寫的每個構造函數都將顯示為具有特殊名稱的實例初始化方法。 此名稱由編譯器提供。 因為該名稱不是有效的標識符,所以不能直接用Java編程語言編寫的程序中使用它。 實例初始化方法只能由invokespecial指令(§invokespecial)在Java虛擬機內調用,並且只能在未初始化的類實例上調用。 實例初始化方法具有從其獲得構造函數的訪問權限(JLS§6.6)
構造函數不是方法。 靜態方法與一個類相關聯,非靜態方法與該類的實例相關聯。 您不能從靜態方法調用非靜態方法,因為沒有實例與該靜態方法相關聯。 您可以從靜態方法調用構造函數,因為構造函數與類而不是實例相關聯。
構造函數只能在實例化對象之后(即在構造函數被調用之后)使用“ this”引用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.