1 static 靜態(tài)修飾符
在程序中任何變量或者代碼都是在編譯時由系統(tǒng)自動分配內(nèi)存來存儲的。
static修飾表示靜態(tài)的,在類加載時JVM會把它放到方法區(qū),被本類以及本類中所有實例所公用。在編譯后所分配的內(nèi)存會在一直存在,直到程序退出內(nèi)存才會釋放這個空間。如果一個被所有實例公用的方法被申明為static,那么就可以節(jié)省空間了,不用每個實例初始化的時候都被分配到內(nèi)存。
2.內(nèi)部類
定義在一個類內(nèi)部的類叫內(nèi)部類,包含內(nèi)部類的類稱為外部類。內(nèi)部類可以聲明public、protected、private等訪問限制,可以聲明 為abstract的供其他內(nèi)部類或外部類繼承與擴展,或者聲明為static、final的,也可以實現(xiàn)特定的接口。外部類按常規(guī)的類訪問方式使用內(nèi)部 類,唯一的差別是外部類可以訪問內(nèi)部類的所有方法與屬性,包括私有方法與屬性。
3.靜態(tài)類(只有內(nèi)部類才能被聲明為靜態(tài)類,即靜態(tài)內(nèi)部類)
1.只能在內(nèi)部類中定義靜態(tài)類
2.靜態(tài)內(nèi)部類與外層類綁定,即使沒有創(chuàng)建外層類的對象,它一樣存在。
3.靜態(tài)類的方法可以是靜態(tài)的方法也可以是非靜態(tài)的方法,靜態(tài)的方法可以在外層通過靜態(tài)類調(diào)用,而非靜態(tài)的方法必須要創(chuàng)建類的對象之后才能調(diào)用。
4.只能引用外部類的static成員變量(也就是類變量)。
5.如果一個內(nèi)部類不是被定義成靜態(tài)內(nèi)部類,那么在定義成員變量或者成員方法的時候,是不能夠被定義成靜態(tài)的。
以上稍微介紹了一下靜態(tài)類,接下來將用代碼來分析靜態(tài)部類與非靜態(tài)內(nèi)部類的區(qū)別。
public class OutClassTest {
int out1=1;
static int out2=1;
void out(){
System.out.println("非靜態(tài)");
}
static void outstatic(){
System.out.println("靜態(tài)");
}
public class InnerClass{
void InnerClass(){
System.out.println("InnerClass!");
System.out.println(out1);
System.out.println(out2);
out();
outstatic();//靜態(tài)內(nèi)部類只能夠訪問外部類的靜態(tài)成員
}
// static void inner(){} static int i=1; 非靜態(tài)內(nèi)部類不能有靜態(tài)成員(方法、屬性)
}
public static class InnerstaticClass{
void InnerstaticClass(){
System.out.println("InnerstaticClass");
// System.out.println(out1);out(); 靜態(tài)內(nèi)部類只能夠訪問外部類的靜態(tài)成員
System.out.println(out2);
outstatic();
}
static void innerstatic(){} static int i=1;//靜態(tài)內(nèi)部類能有靜態(tài)成員(方法、屬性)
}
public static void main(String args[]){
OutClassTest a=new OutClassTest();
OutClassTest.InnerstaticClass b=new OutClassTest.InnerstaticClass();//創(chuàng)建靜態(tài)內(nèi)部類
OutClassTest.InnerClass c=a.new InnerClass();//創(chuàng)建非靜態(tài)內(nèi)部類
}
}
1.是否能擁有靜態(tài)成員
靜態(tài)內(nèi)部類可以有靜態(tài)成員(方法,屬性),而非靜態(tài)內(nèi)部類則不能有靜態(tài)成員(方法,屬性)。
2.訪問外部類的成員
靜態(tài)內(nèi)部類只能夠訪問外部類的靜態(tài)成員,而非靜態(tài)內(nèi)部類則可以訪問外部類的所有成員(方法,屬性)。
3.靜態(tài)內(nèi)部類和非靜態(tài)內(nèi)部類在創(chuàng)建時有區(qū)別
//假設(shè)類A有靜態(tài)內(nèi)部類B和非靜態(tài)內(nèi)部類C,創(chuàng)建B和C的區(qū)別為:
A a=new A();
A.B b=new A.B();
A.C c=a.new C();