下面小編就為大家帶來一篇詳談Java靜態動態的問題。小編覺得蠻不錯的,現在就分享給大家,也給大家做個參考。一起跟著小編過來看看吧
Cannot make a static reference to the non-static field
靜態方法中不能引用非靜態成員變數及方法
class A { private int a = 1; public sttaic void main(String[] args){ System.out.println(a); } }
因為實例變數應該是具體物件的狀態,應該先A a = new A();然後System.out.println(a,a);
或將變數改為static
No enclosing instance of type EventApp4 is accessible. Must qualify the allocation with an enclosing instance of type EventApp4 (e.g. x.new A() where x is an instance of EventApp4).
原因:內部類別沒有用static限定,所以是動態的,而我在main函式中new了這個內部類別。為什麼這樣就出現問題了呢,因為靜態的方法以及變數在類別載入之時就已經進入內存了,但是非靜態的方法和變數只能在實例化之後才會進入內存,所以在靜態方法中new非靜態的內部類別就會出錯,因為此時這個內部類別還不存在。反之,在動態方法中new靜態方法是不會出現錯誤的,原因同樣,靜態的在非靜態的之前就已經存在了。
從java的記憶機制去分析,首先當你New 一個物件的時候,並不是先在堆中為物件開闢記憶體空間,而是先將類別中的靜態方法(帶有static修飾的靜態函數)的程式碼載入到一個叫做方法區的地方,然後再在堆記憶體中建立物件。所以說靜態方法會隨著類別的載入而載入。當你new一個物件時,該物件存在於對記憶體中,this關鍵字一般指該對象,但如果沒有new對象,而是透過類別名稱呼叫該類別的靜態方法也可以。
遇到遇上問題時,有以下原則
#1.在main中,使用靜態方法靜態變數靜態類,即將變數、方法都限定為static
2.在main中,實例化本類別或其他類別(要使用的類別)
3.將main中的語句放進建構子中,在main中實例化本類,因為建構函式中可以使用本類的參考this
以上是Java靜態動態的問題解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!