1. 程式人生 > >非靜態內部類為什麼不能有靜態成員

非靜態內部類為什麼不能有靜態成員

http://www.iteye.com/topic/659959
1.我的理解,因為靜態的東西是在編譯的時候就要有記憶體空間的,但是不是靜態的東西只有當例項化的時候才會分配空間,如果你在非靜態方法裡面包含了靜態的東西,這個方法還沒有去分配空間,怎麼又能為裡面的變數去分配空間呢,個人理解。

2.如果一個內部類是非靜態的 構造這個內部類 必須要通過它的外部類的物件來構造
JVM啟動的時候要先把static的東西初始化 但此時外部類可能還沒有被例項化 所以會引起混亂

3.這個跟編譯器的記憶體處理有關係,靜態成員變數需要在一開始就分配記憶體進行初始化,而一般的類成員只是在類例項化的時候才會為止分配記憶體初始化,從方面來說,假如允許非靜態類中有靜態成員變數,如下面所示:
class A{
public class B{
static string var_a;
}
}
那麼在程式一開始就需要給A.B.var_a分配記憶體並初始化,假如這個成立了,那麼A.B也應該會有相應的記憶體,但是由於B只是A的一個非靜態成員變數,在類A還沒有例項化的時候就以及有了相應的記憶體(也就是非靜態成員變數只有在類的例項中才會有相應的記憶體位置),這樣跟原來的標準有衝突,假如 JAVA編譯器(或者JAVA虛擬機器)支援這種做法(其實也是可以實現的),這有的後果會導致編譯器混亂無序的,大大增加了編譯器的難度和複雜性,每一種語言都有預先制定好的語言標準,相對應的編譯器都是基於這種標準來實現的,假如隨意突破這種標準,那隻會導致災難性的後果而已
http://group.gimoo.net/review/151475

第一個連結的文章中第二個糾正中用static final 來說明問題是不對的。可以看下面的連結http://chihom.iteye.com/blog/233035