1.關鍵字static(先記住這些,再往下看)
1)靜態方法和靜態變數是屬於某乙個類,而不屬於類的物件。
2)靜態方法和靜態變數的引用直接通過類名引用。
3)在靜態方法中不能呼叫非靜態的方法和引用非靜態的成員變數。反之,則可以。
4)靜態變數在某種程式上與其他語言的全域性變數相類似,如果不是私有的就可以在類的外部進行訪問。
2.何時使用static
在我們建立乙個類的例項時(物件),通常使用new方法,這樣這個類的資料空間才會被建立,其方法才能被呼叫。
但是,有時候我們希望乙個類雖然可以被建立n個物件(顯然這n個物件的資料空間是不相同的),但這n個物件的某些資料是相同的,即不管這個類有多少的例項,這些資料對這些例項而言之有乙份記憶體拷貝(見示例1)。這是靜態變數的情形。
另一種情形是,你希望某個方法不與包含它的類的任何物件關聯在一起。也就是說,即使沒有建立物件,也能夠呼叫這個方法。static 方法的乙個重要用法就是在不建立任何物件的前提下,就可以呼叫它(見示例2)。這是靜態方法的情形。
還有一種特殊的用法出現在內部類中,通常乙個普通類不允許宣告為靜態的,只有乙個內部類才可以。這時這個宣告為靜態的內部類可以直接作為乙個普通類來使用,而不需例項乙個外部類(見示例3)。這是靜態類的情形。
示例1publicclasststatic
publictstatic(intj)
publicstaticvoidmain(string args)
} 結果: 0
5 4
4 4
static變數在類被載入時建立,只要類存在,static變數就存在。它們在定義時必須進行初始化。上例中沒有初始化i,所以會得到預設的初始值0。static的變數的初始化僅能一次,static變數只是接受了最後一次的初始化。
實際這還是多個例項共享乙個靜態的變數的問題。
示例2未宣告為static
classclassa
classclassb
}}
宣告為static
classclassa
}classclassb
}在使用靜態方法時要注意,在靜態方法中不能呼叫非靜態的方法和引用非靜態的成員變數(在static方法中也不能以任何方式引用this或super)。理由很簡單,對於靜態的東西,jvm在載入類時,就在記憶體中開闢了這些靜態的空間(所以可以直接通過類名引用),而此時非靜態的方法和成員變數所在的類還沒有例項化。
所以如果要使用非靜態的方法和成員變數,可以直接在靜態方法中例項化該方法或成員變數所在的類。public static void main就是這麼幹的。
示例3
publicclassstaticcls
}classoutercls
}}
結果:
innercls
3.靜態初始化
static定義的變數會優先於任何其它非static變數,不論其出現的順序如何。靜態**塊(在「static
value(inti)
staticvoidinc()
}classcount
value
v=newvalue(10);
staticvalue
v1 ,
v2 ;
static
}publicclasststaticblock
} 結果:
in the static block of calss count v1.c=0v2.c=0
in the static block of calss count v1.c=27v2.c=27
in the static block of calss count v1.c=15v2.c=15
in the main:
ct.c=10
v1.c=10v2.c=10
v1.c=11v2.c=11
ct.c=11
不管是v,v1還是v2,它們操作的成員變數都是同乙個靜態變數c。
在類count中先初始化v1,v2(static value v1, v2;),再初始化靜態**塊(static{}),最後初始化v。
java關鍵字介紹
關鍵字 含義 abstract表明類或者成員方法具有抽象屬性 assert 用來進行程式除錯 boolean 基本資料型別之一,布林型別 break 提前跳出乙個塊 byte 基本資料型別之一,位元組型別 case 用在switch語句之中,表面其中的乙個分支 catch 用在異常處理中,用來捕捉異...
Java關鍵字介紹之static
1 關鍵字static 先記住這些,再往下看 1 靜態方法和靜態變數是屬於某乙個類,而不屬於類的物件。2 靜態方法和靜態變數的引用直接通過類名引用。3 在靜態方法中不能呼叫非靜態的方法和引用非靜態的成員變數。反之,則可以。4 靜態變數在某種程式上與其他語言的全域性變數相類似,如果不是私有的就可以在類...
Java之關鍵字
1.transient 在實際中,有時出於安全性等方面的考慮,我們不希望一些類的某些屬性被序列化,這時可以考慮使用transient關鍵字進行修飾這些變數 屬性。transient使用小結 1 一旦變數被transient修飾,變數將不再是物件持久化的一部分,該變數內容在序列化後無法獲得訪問。2 t...