簡體   English   中英

單例設計模式,靜態訪問非靜態?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM