class Sub {
static int y;
public static void foo() {
this.y = 10;
}
}
我明白this
代表調用該方法的對象和靜態方法不綁定到任何物體,爲什麼我們不能用「這個」關鍵字。但是在上面提到的情況下,變量y也是靜態的。在靜態方法
如果我們可以在類對象上調用靜態方法,爲什麼我們不能讓靜態方法來設置類的靜態變量。
這個附加約束的目的是什麼?
class Sub {
static int y;
public static void foo() {
this.y = 10;
}
}
我明白this
代表調用該方法的對象和靜態方法不綁定到任何物體,爲什麼我們不能用「這個」關鍵字。但是在上面提到的情況下,變量y也是靜態的。在靜態方法
如果我們可以在類對象上調用靜態方法,爲什麼我們不能讓靜態方法來設置類的靜態變量。
這個附加約束的目的是什麼?
因爲this
引用了對象實例。靜態方法調用中沒有對象實例。但是,你當然可以訪問你的靜態字段(只有靜態字段!)。只需使用
class Sub {
static int y;
public static void foo() {
y = 10;
}
}
如果你想確保你得到的靜態字段y
並沒有使用相同的名稱一些局部變量,使用類名來指定:
class Sub {
static int y;
public static void foo(int y) {
Sub.y = y;
}
}
downvoters可能認爲這並不真正回答這個問題,因爲你基本上重複了OP已知的內容,只提供了一個詳細的解決方法。如果該類名爲'ThisClassHasAQuiteLongName',那麼在靜態方法中將類引用爲'this'會不會更好? – xehpuk 2015-12-17 14:42:57
雖然這不是真的,但我已經解釋了爲什麼'this'不能在靜態方法中使用(因爲沒有類的實例被命名爲'this')並且顯示了兩種訪問字段的方法。能夠在靜態上下文中使用'this'作爲類名的替代將會導致誤導和不一致(至少是imho)。儘管感謝您的反饋,但這也可能是降低成本的原因。 – brimborium 2015-12-18 09:21:27
這個問題,正如我所理解的,我也想知道的是,爲什麼Java不會在靜態上下文中將this'的含義重載爲類的意思,所以不是'Sub.y',而是可以輸入'this .y'。這似乎是一個明顯的設計選擇,因爲它消除了明確提及可能改變的類名的需要。一般來說,當有人問「爲什麼x被定義爲y而不是z在不同的上下文中」時,它並不令人滿意,而且確實有點回應「因爲它被定義爲y」。這讓我感到很尷尬,因爲我仍然是這樣。 – 2017-02-16 04:29:52
爲了使你的代碼編寫工作,像這樣:
class Sub {
static int y;
public static void foo() {
Sub.y = 10;
}
}
您可以在靜態方法靜態字段,但是你沒有在靜態方法獲得this
因爲this
代表的當前實例對象,而在靜態方法中,你沒有實例。
你願意解釋我的答案或者@彼得的答案有什麼問題嗎? – tibtof 2012-07-26 07:43:52
你的答案沒有錯。再次將其設爲0。 (由於蹩腳的投票 - 代表系統^^,所以總共留下+8代表) – brimborium 2012-07-26 08:42:16
這意味着「這個」對象,但沒有一個。在你的情況下,你可以使用@tibtof建議的類名稱。
this
指的是對象Sub
的這個實例。由於方法是static
,因此不存在Sub
的實例。
關鍵字「這」指到您正在操作的對象。在你的情況下,這裏面的任何非靜態方法或構造函數(如果你有一個和如果你在裏面使用「this」),那麼「this」指的是Sub類的特定實例。所以它只適用於對象被創建。但是任何在類的靜態上下文中,你都可以使用,甚至不需要爲它創建對象,因爲它在類加載期間被解析。 「this」只有在創建對象時才解析(您甚至可以動態地說出哪個對象)。所以「這個」在靜態上下文中是有意義的。希望能幫助到你。上帝保佑。
主要的原因,爲什麼我們不能用「這個」靜態方法方面: -
這一點: - 「這」是指當前類對象,所以它明確表示,「這個」只進來 畫面一次我們打算創建該類的對象。
靜態方法: - 爲了使用靜態方法,不需要創建對象。 意味着根據Java規則,「實例」或對象創建對於「靜態」沒有任何意義。
因此,如果我們一起使用(靜態和本),會有矛盾。 這就是我們不能在靜態方法中使用「this」的原因。
「this」關鍵字僅適用於創建對象實例的情況。而在靜態方法中,由於靜態方法屬於類區域,因此不創建實例。
我同意所有其他在我之前回復的人。讓我以不同的方式來回答這個問題:
我猜,實例方法/非靜態方法屬於一個類的實例(意味着遲早我們需要對象引用來訪問它),所以這個關鍵字在裏面有意義實例塊或方法。但是,靜態關鍵字到類的任何成員被解釋爲直接資產到類的對象,如果存在然後有權訪問它。所以在靜態上下文中,不確定該對象是否存在。這就是爲什麼在java中不允許使用這個靜態區域的原因。
我意識到這是一個古老的問題,但我想把它作爲一個非常有效的點。儘管對於字段來說,答案很簡單(將限定符放在外面),但對於靜態內部類來說,它變得相關,並且在您想要的是對類本身的運行時實例的引用時也是相關的。例如,我可以鍵入'MyClass.class'來獲得單身人士課,但只是'班'本身是無效的,並沒有類似的解決方法。這導致類名可能通過不太乾的單元重複。 –
2017-02-10 19:57:33