2012年8月27日 星期一

Must qualify the allocation with an enclosing instance of type

今天在寫某個程式時遇到的問題~
eclipse 回報「Must qualify the allocation with an enclosing instance of type」這個錯誤訊息
稍微查了一下,是因為我使用了 inner class,然後又在 static 的函式中嘗試使用 inner class 造成的
其實仔細想想,這也是個蠻簡單的觀念~(大概吧 XD,不知道我的想法有沒有錯!有錯請指正!)
static 的物件、函式跟變數會在程式一啟動時就一起被初始化,所以隨時都會有該 static 物件的 instance 在記憶體中
但非 static 的物件、函式跟變數則是在呼叫 new 時才被初始化、產生 instance
inner class 也是如此,會在 outer class 被 new 出來時才會一起出現
所以如果在某個 static 函式中嘗試要去初始化 inner class
有可能會因為 outer class 還沒初始化的關係,導致 inner class 不存在~這時就會出現錯誤了。
正確的作法應該要把 inner class 也設定為 static,才能確保 static 函式要初始化 inner class 時一定找得到東西。

參考資料:
1、Java编译错误“No enclosing instance of type AA is accessible. Must qualify the allocation with an enclosing instance of type SimpleTh
2、對於建構子的疑問
3、Java Gossip: 內部類別(Inner class)

另外同樣的觀念也存在於 static 函式為什麼不能呼叫 non-static 的變數和函式
也是因為可能會出現 static 函式呼叫時,被呼叫的 non-static 變數或函式還沒有 instance 可以呼叫的問題。

沒有留言: