一、非靜態內部類:
1、變量和方法不能聲明為靜態的。(類的編譯順序:外部類--靜態方法或屬性--內部類,如果內部類聲明為靜態的,造成編譯順序沖突。個人理解)
2、實例化的時候需要依附在外部類上面。比如:B是A的非靜態內部類,實例化B,則:A.B b = new A().new B();
3、內部類可以引用外部類的靜態或者非靜態屬性或者方法。
二、靜態內部類:
1、屬性和方法可以聲明為靜態的或者非靜態的。
2、實例化靜態內部類:比如:B是A的靜態內部類,A.B b = new A.B();
3、內部類只能引用外部類的靜態的屬性或者方法。
4、如果屬性或者方法聲明為靜態的,那么可以直接通過類名直接使用。比如B是A的靜態內部類,b()是B中的一個靜態屬性,則可以:A.B.b();
三、關於java靜態方法的相關總結:
一個類的靜態方法只能訪問靜態屬性(靜態方法是屬於類的,而普通方法是屬於對象的。)
一個類的靜態方法不能夠直接調用非靜態方法;
如訪問控制權限允許,static 屬性和方法可以使用類名加“.”方式調用;當然也可以使用實例加“.”方式調用;
靜態方法中不存在當前對象,因而不能使用“this”,當然也不能使用”super”;
靜態方法不能被非靜態方法覆蓋;
構造方法不允許聲明為 static 的;
局部變量不能使用static修飾;
問題:為什么一個類的靜態方法只能訪問靜態屬性或靜態方法?
回答:靜態方法是屬於類的,而普通方法是屬於對象的。 屬於類的靜態方法可以在對象不存在的時候就能訪問到,而普通方法必須先new一個對象才能用這個對象訪問 。當我們訪問調用靜態方法的時候(使用類名.靜態方法名)這個時候就沒有對象創建,所以普通方法是訪問不到的。 為了避免這種錯誤,所以java就不允許在靜態方法中訪問非靜態方法。可以想一下main方法。