static聲明的有三種:1.靜態變量,2,靜態方法。3.靜態類
1.靜態變量:靜態變量相當於c中的全局變量
按照是否靜態的對類成員變量進行分類可分兩種:一種是被static修飾的變量,叫靜態變量或類變量;另一種是沒有被static修飾的變量,叫實例變量。
兩者的區別是:
對於靜態變量在內存中只有一個拷貝(節省內存),JVM只爲靜態分配一次內存,在加載類的過程中完成靜態變量的內存分配,可用類名直接訪問(方便),當然也可以通過對象來訪問(但是這是不推薦的)。
對於實例變量,每創建一個實例,就會爲實例變量分配一次內存,實例變量可以在內存中有多個拷貝,互不影響,非常靈活。
靜態變量:所有此類實例共享此靜態變量,也就是說在類裝載時,只分配一塊存儲空間,所有此類的對象都可以操控此塊存儲空間
聲明爲static的變量實質上就是全局變量。當聲明一個對象時,並不產生static變量的拷貝,而是該類所有的實例變量共用同一個static變量。
class Value{
static int c=0;
static void inc(){
c++;
}
}
class Count{
public static void prt(String s){
System.out.println(s);
}
public static void main(String[] args){
Value v1,v2;
v1=new Value();
v2=new Value();
prt("v1.c="+v1.c+" v2.c="+v2.c);
//結果v1.c=0 v2.c=0
v1.inc();//共享一塊存儲區,v1變化v2也變化
prt("v1.c="+v1.c+" v2.c="+v2.c);
//結果v1.c=1 v2.c=1
}
}
在static{後面跟着一段代碼,這是用來進行顯式的靜態變量初始化,這段代碼只會初始化一次,且在類被第一次裝載時。
class Count
{
public static void prt(String s){
System.out.println(s);
}
Value v=new Value(10);
static Value v1,v2;
Static{
prt("v1.c="+v1.c+" v2.c="+v2.c);
v1=new Value(27);
prt("v1.c="+v1.c+" v2.c="+v2.c);
v2=new Value(15);
prt("v1.c="+v1.c+" v2.c="+v2.c);
}
}
2.靜態方法:相當於全局函數
通常,在一個類中定義一個方法爲static,那就是說,無需本類的對象即可調用此方法
如果一個成員被聲明爲static,它就能夠在它的類的任何對象創建之前被訪問,而不必引用任何對象。你可以將方法和變量都聲明爲static。static 成員的最常見的例子是main( ) 。因爲在程序開始執行時必須調用main() ,所以它被聲明爲static。
我們定義了一個靜態的方法名爲main,這就意味着告訴Java編譯器,我這個方法不需要創建一個此類的對象即可使用。
靜態方法有幾條限制:
1. 只能調用其他的static方法
2. 只能訪問static數據
3. 不能以任何方式引用this和super
public class HelloWorld{
//靜態方法,
public static void main(String[] args){
System.out.println("Hello,world!");
}
}
3.靜態類:
通常一個普通類不允許聲明爲靜態的,只有一個內部類纔可以。這時這個聲明爲靜態的內部類可以直接作爲一個普通類來使用,而不需實例一個外部類。
public class StaticCls{
public static void main(String[] args){
OuterCls.InnerCls oi=new OuterCls.InnerCls();
}
}
class OuterCls{
public static class InnerCls{
InnerCls(){
System.out.println("InnerCls");
}
}
}