2011-12-25 202 views
2

我知道在java中靜態方法只能使用靜態變量和靜態方法,而非靜態方法可以使用非靜態變量和方法。有什麼解釋爲什麼靜態方法只能訪問靜態變量/方法?並不能訪問非靜態方法和變量?靜態方法和變量

+0

可能的重複[無法從靜態函數?](http://stackoverflow.com/questions/8029845/cannot-be-referenced-from-a-static-function) – 2011-12-25 06:48:09

+0

它不是重複的,我的問題的內容是完全不同的。 – KyelJmD 2011-12-25 06:56:33

+2

該問題的答案同樣適用於這個問題。 – 2011-12-25 06:58:46

回答

8

要訪問非靜態方法/字段,您需要一個類的實例。

+0

...按定義。 – 2011-12-25 06:50:15

+0

但是OP想知道*爲什麼*。這是一些武斷的規則,還是有原因?我們應該解釋「是的,有一個非常重要的原因」。恕我直言... – paulsm4 2011-12-25 07:28:41

+1

如果我們理解「靜態」實際上意味着什麼(而不是僅僅學習規則),那麼理由應該是顯而易見的。 – 2011-12-25 07:38:25

2

想一想:

a)假設你是一個靜態方法。

b)您獨立於任何對象實例存在。即使沒有類實例,你也存在。

c)你想訪問一個非靜態變量。存在於ONE和ONLY一個對象實例中的變量 - 與該PARTICULAR對象實例相關的變量。

d)你打算使用哪個對象實例的非靜態變量?

靜態方法可以訪問類的非靜態成員...只要它們通過類引用來完成。

否則 - 沒有類引用 - 無法訪問。

有意義嗎? ;)

+0

soo它意味着是沒有類的引用,我無法訪問該實例變量?我對嗎? – KyelJmD 2011-12-25 07:00:57

+0

恰到好處:) – paulsm4 2011-12-25 07:26:08

3

當你實例化一個類時,它將被加載到堆或棧中。在這種情況下,您的應用程序會引用內存實例所在的那些部分。但是,靜態方法只是加載到內存中的函數。這就是爲什麼如果你的靜態方法想要訪問一個類變量或方法,它不能僅僅調用它,因爲可能存在多個對該堆中的那個類的引用,與之相反,只有一個靜態方法可以存在。

如果你想從靜態方法調用任何非靜態方法,你應該使用實例(或創建一個)到該類,以便你可以定義你真正意義的類引用。

0

在靜態上下文中,「this」關鍵字不可訪問。我們不能在靜態上下文中使用這個關鍵字。實例變量在構造函數調用時被初始化。但是靜態變量在類加載時被初始化。在類的加載過程中,如果我們在靜態上下文中使用實例變量,實例變量在這段時間內仍未被識別,它會導致編譯時錯誤,因爲它們當時未被識別