static可以修飾成員變數、方法、游離塊、內部類。
static修飾的成員變數:static修飾的成員變數也叫類變數或全域變數,在類被載入時static修飾的成員變數被初始化,與類關聯,只要類存在,static變數就存在。一個static變數單獨劃分一Block Storage空間,不與具體的對象綁定在一起,該儲存空間被類的各個對象所共用。也就是說當聲明一個對象時,並不產生static變數的拷貝,而是該類所有的執行個體對象共用同一個static變數。static修飾的成員變數能在建立任何執行個體對象之前被訪問,而不必引用任何對象,也就是說不管建立多少對象,static修飾的變數只佔有一塊記憶體。
static修飾的成員變數的引用:
可以通過執行個體對象名和類名進行引用,在同一各類中可以直接調用,而不需要對象名和類名。
看下面執行個體:
package com.baiye.test;
public class StaticTest {
static int a=9;
static String str="quan";
public StaticTest(){
System.out.println("static變數在類裝載的時候就初始化(在執行個體化對象之前):a="+a);
//a=4;
System.out.println(a);
System.out.println(str);
}
static void staticMethod(){
str="baiye";
//return str;
System.out.println("在靜態方法引用靜態變數:str="+str);
}
void generalMethod(){
a=6;
System.out.println("在非靜態方法中調用靜態變數:a="+a);
}
public static void main(String[] args){
StaticTest st1=new StaticTest();
StaticTest st2=new StaticTest();
StaticTest st3=new StaticTest();
st1.a=5;
System.out.println("st1.a="+st1.a+" st2.a="+st2.a+" st3.a="+st3.a);
staticMethod();
System.out.println("st1.str="+st1.str+" st2.str="+st2.str+" st3.str="+st3.str);
StaticTest st4=new StaticTest();
st1.generalMethod();
System.out.println("st1.a="+st1.a+" st2.a="+st2.a+" st3.a="+st3.a);
}
}
輸出結果:
static變數在類裝載的時候就初始化(在執行個體化對象之前):a=9
9
quan
static變數在類裝載的時候就初始化(在執行個體化對象之前):a=9
9
quan
static變數在類裝載的時候就初始化(在執行個體化對象之前):a=9
9
quan
st1.a=5 st2.a=5 st3.a=5
在靜態方法引用靜態變數:str=baiye
st1.str=baiye st2.str=baiye st3.str=baiye
static變數在類裝載的時候就初始化(在執行個體化對象之前):a=5
5
baiye
在非靜態方法中調用靜態變數:a=6
st1.a=6 st2.a=6 st3.a=6
在這個結果中我們可以看出不管執行個體多少個對象static修飾的成員變數只佔有一塊