Java的靜態內部類與非靜態內部類的區別
1 static 靜態修飾符
在程式中任何變數或者程式碼都是在編譯時由系統自動分配記憶體來儲存的。
static修飾表示靜態的,在類載入時JVM會把它放到方法區,被本類以及本類中所有例項所公用。在編譯後所分配的記憶體會在一直存在,直到程式退出記憶體才會釋放這個空間。如果一個被所有例項公用的方法被申明為static,那麼就可以節省空間了,不用每個例項初始化的時候都被分配到記憶體。
2.內部類
定義在一個類內部的類叫內部類,包含內部類的類稱為外部類。內部類可以宣告public、protected、private等訪問限制,可以宣告 為abstract的供其他內部類或外部類繼承與擴充套件,或者宣告為static、final的,也可以實現特定的介面。外部類按常規的類訪問方式使用內部 類,唯一的差別是外部類可以訪問內部類的所有方法與屬性,包括私有方法與屬性。
3.靜態類(只有內部類才能被宣告為靜態類,即靜態內部類)
1.只能在內部類中定義靜態類
2.靜態內部類與外層類繫結,即使沒有建立外層類的物件,它一樣存在。
3.靜態類的方法可以是靜態的方法也可以是非靜態的方法,靜態的方法可以在外層通過靜態類呼叫,而非靜態的方法必須要建立類的物件之後才能呼叫。
5.只能引用外部類的static成員變數(也就是類變數)。
6.如果一個內部類不是被定義成靜態內部類,那麼在定義成員變數或者成員方法的時候,是不能夠被定義成靜態的。
接下來將用程式碼來分析靜態內部類與非靜態內部類的區別。
public class OutClassTest {
int out1=1;
static int out2=1;
void out(){
System.out.println("非靜態");
}
static void outstatic(){
System.out.println("靜態");
}
public class InnerClass{
void InnerClass(){
//非靜態內部類則可以訪問外部類的所有成員
System.out.println("InnerClass!");
System.out.println(out1);
System.out.println(out2);
out();
outstatic();
}
// static void inner(){} static int i=1; 編譯失敗,非靜態內部類不能有靜態成員(方法、屬性)
}
public static class InnerstaticClass{
void InnerstaticClass(){
System.out.println("InnerstaticClass");
// System.out.println(out1); out(); 編譯失敗靜態內部類只能夠訪問外部類的靜態成員
System.out.println(out2);
outstatic();
}
static void innerstatic(){} static int i=1;//靜態內部類能有靜態成員(方法、屬性)
void inner(){} int j=1;//靜態內部類能有非靜態成員(方法、屬性)
}
public static void main(String args[]){
OutClassTest a=new OutClassTest();
OutClassTest.InnerstaticClass b=new OutClassTest.InnerstaticClass();//建立靜態內部類
OutClassTest.InnerClass c=a.new InnerClass();//建立非靜態內部類
}
}
總結
1.是否能擁有靜態成員
靜態內部類可以有靜態和非靜態成員(方法,屬性),而非靜態內部類則不能有靜態成員(方法,屬性)。
2.訪問外部類的成員
靜態內部類只能夠訪問外部類的靜態成員(方法,屬性),而非靜態內部類則可以訪問外部類的所有成員(方法,屬性)。
3.靜態內部類和非靜態內部類在建立時有區別,假設類A有靜態內部類B和非靜態內部類C,建立B和C的區別為:
A a=new A();
A.B b=new A.B();
A.C c=a.new C();