JAVA中理解static修飾符的作用
阿新 • • 發佈:2019-01-09
static為是靜態修飾符,那麼究竟什麼叫靜態修飾符呢?大家都知道,在程式中任何變數或者程式碼都是在編譯時由系統自動分配記憶體來儲存的,而所謂靜態就是指在編譯後所分配的記憶體會一直存在,直到程式退出記憶體才會釋放這個空間,也就是隻要程式在執行,那麼這塊記憶體就會一直存在。這樣做有什麼意義呢?
在Java程式裡面,所有的東西都是物件,而物件的抽象就是類,對於一個類而言,如果要使用他的成員,那麼普通情況下必須先例項化物件後,通過物件的引用才能夠訪問這些成員,但是有種情況例外,就是該成員是用static宣告的(在這裡所講排除了類的訪問控制),例如:
//-------------------------------------未宣告為static
class ClassA{
int b;
public void ex1(){
…
}
}
class ClassB{
void ex2{
int i;
ClassA a = new ClassA();
i = a.b; //這裡通過物件引用訪問成員變數b
a.ex1; //這裡通過物件引用訪問成員函式ex1
}
}
//--------------------------------宣告為static
class ClassA{
static int b;
static void ex1(){
…
}
}
class ClassB{
void ex2{
int i;
i = ClassA.b; //這裡通過類名訪問成員變數b
ClassA.ex1; //這裡通過類名訪問成員函式ex1
}
}
通過以上兩種比較,就可以知道static用來修飾類成員的主要作用了,在java類庫當中有很多類成員都宣告為static,可以讓使用者不需要例項化物件就可以引用成員,最基本的有Integer.parseInt(),Float.parseFloat()等等用來把物件轉換為所需要的基本資料型別。這樣的變數和方法我們又叫做類變數和類方法。
接下來講一下被static修飾後的變數的值的問題,剛才在前面講過,被static修飾後的成員,在編譯時由記憶體分配一塊記憶體空間,直到程式停止執行才會釋放,那麼就是說該類的所有物件都會共享這塊記憶體空間,看一下下面這個例子:
class TStatic{
static int i;
public TStatic(){
i = 4;
}
public TStatic(int j){
i = j;
}
public static void main(String args[]){
TStatic t = new TStatic(5); //宣告物件引用,並例項化
TStatic tt = new TStatic(); //同上
System.out.println(t.i);
System.out.println(tt.i);
System.out.println(t.i);
}
}
這段程式碼裡面Tstatic類有一個static的int變數I,有兩個建構函式,第一個用於初始化I為4,第二個用於初始化i為傳進函式的值,在main中所傳的值是5,程式首先宣告物件的引用t,然後呼叫帶引數的建構函式例項化物件,此時物件t的成員變數I的值為5,接著宣告物件tt,呼叫無引數的建構函式,那麼就把物件tt的成員變數i的值初始化為4了,注意了,在這裡i是static,那就是說該類的所有物件都共享該記憶體,那也就是說在例項化物件tt的時候改變了i的值,那麼實際上物件t的i值也變了,因為實際上他們引用的是同一個成員變數。最後列印的結果是三個4 。呵呵,寫到這裡大家是否明白了呢?不明白就再看看書或者多寫幾個例子印證一下,呵呵。
在Java程式裡面,所有的東西都是物件,而物件的抽象就是類,對於一個類而言,如果要使用他的成員,那麼普通情況下必須先例項化物件後,通過物件的引用才能夠訪問這些成員,但是有種情況例外,就是該成員是用static宣告的(在這裡所講排除了類的訪問控制),例如:
//-------------------------------------未宣告為static
class ClassA{
int b;
public void ex1(){
…
}
}
class ClassB{
void ex2{
int i;
ClassA a = new ClassA();
i = a.b; //這裡通過物件引用訪問成員變數b
a.ex1; //這裡通過物件引用訪問成員函式ex1
}
}
//--------------------------------宣告為static
class ClassA{
static int b;
static void ex1(){
…
}
}
class ClassB{
void ex2{
int i;
i = ClassA.b; //這裡通過類名訪問成員變數b
ClassA.ex1; //這裡通過類名訪問成員函式ex1
}
}
通過以上兩種比較,就可以知道static用來修飾類成員的主要作用了,在java類庫當中有很多類成員都宣告為static,可以讓使用者不需要例項化物件就可以引用成員,最基本的有Integer.parseInt(),Float.parseFloat()等等用來把物件轉換為所需要的基本資料型別。這樣的變數和方法我們又叫做類變數和類方法。
接下來講一下被static修飾後的變數的值的問題,剛才在前面講過,被static修飾後的成員,在編譯時由記憶體分配一塊記憶體空間,直到程式停止執行才會釋放,那麼就是說該類的所有物件都會共享這塊記憶體空間,看一下下面這個例子:
class TStatic{
static int i;
public TStatic(){
i = 4;
}
public TStatic(int j){
i = j;
}
public static void main(String args[]){
TStatic t = new TStatic(5); //宣告物件引用,並例項化
TStatic tt = new TStatic(); //同上
System.out.println(t.i);
System.out.println(tt.i);
System.out.println(t.i);
}
}
這段程式碼裡面Tstatic類有一個static的int變數I,有兩個建構函式,第一個用於初始化I為4,第二個用於初始化i為傳進函式的值,在main中所傳的值是5,程式首先宣告物件的引用t,然後呼叫帶引數的建構函式例項化物件,此時物件t的成員變數I的值為5,接著宣告物件tt,呼叫無引數的建構函式,那麼就把物件tt的成員變數i的值初始化為4了,注意了,在這裡i是static,那就是說該類的所有物件都共享該記憶體,那也就是說在例項化物件tt的時候改變了i的值,那麼實際上物件t的i值也變了,因為實際上他們引用的是同一個成員變數。最後列印的結果是三個4