我知道我們不能在static
方法中使用this
關鍵字,但我很困惑爲什麼我們不能在static blocks
或static methods
內使用this
。即使是與super()
相同的情況。任何人都可以闡明這一點嗎?此關鍵字和靜態
感謝
我知道我們不能在static
方法中使用this
關鍵字,但我很困惑爲什麼我們不能在static blocks
或static methods
內使用this
。即使是與super()
相同的情況。任何人都可以闡明這一點嗎?此關鍵字和靜態
感謝
this
和super
分別指當前實例和父實例。
在任何static
上下文中,無論是static block
還是static method
,都沒有實例參考,因此不允許使用關鍵字。
super()
是對父實例的無參數構造函數的調用,並且只允許作爲構造函數中的第一條語句,從而使其不會出現在任何靜態上下文中。
靜態方法和塊,顧名思義,鏈接到類,而不是這個類的任何實例。
由於this
引用了當前對象實例,所以在任何靜態初始化塊或方法中都不能使用它是完全正常的。
因爲這指向類的一個實例,所以在靜態方法/塊中沒有實例。
按照doc
在實例方法或構造,這是對 當前對象的引用 - 它的方法或構造正在 調用的對象。您可以使用此方法從 實例方法或構造函數中引用當前對象的任何成員。
但是靜態方法與Class沒有關係到對象。在靜態方法中你沒有任何實例。
例如,靜態塊可用於初始化靜態變量。
靜態方法不在實例範圍內工作。
兩者都只與類有關,並且與該類的實例無關。
爲了回答這個問題,我們應該考慮什麼靜態方式 - 這意味着這個位被放在內存中的「靜態」位置,它只存在一次。
所以每個類都有靜態位和非靜態位。靜態位存在一次,非靜態位可以存在多次(即許多不同的實例)。 'this'這個詞可以被認爲是'這個版本的非靜態位'的簡寫。
在靜態上下文中,我們沒有要引用的非靜態位的版本(或者更確切地說,我們不知道應該引用哪個版本!),所以我們沒有這個。 super可以做出同樣的說法。
「靜態」模塊在調用其中一個「類」構造函數之前執行。所以沒有可以被'this'引用的對象 –