Java中的靜態變數和靜態函式
Java中的靜態變數和靜態函式
靜態變數:
在JAVA中類在宣告的時候,其實並沒有申請和產生記憶體空間,就如同我們的一個切實可行的想法,但其實並沒有去實施這個想法。而類只有在用這種資料型別建立一個類的物件的時候,才能在記憶體中申請和產生類大小的記憶體空間,這一塊記憶體空間是用來存放成員變數和成員函式的備份。所以在類宣告的時候,是不可以對成員變數進行初始化的,只有用類建立的物件時,才能通過物件對變數初始化,SO,便產生的靜態變數!!!它對所有的類物件都是很公共的,對每一個類的物件都具有相同的值。靜態變數的關鍵字是static,它的語法是:
Static<
靜態變數在宣告的時候就同時初始化,並且只能初始化一次(即使建立多個物件,初始化多次,只保留最最後一次的初始化值),它有自己的變數作用域,但具有全域性的生命週期,可以隨時被呼叫。它宣告的時候記憶體中就從開始一直保留一份值。在類的物件沒有被建立之前可以使用類名調靜態成員變數,它的語法是:
<類名>.<靜態成員變數>;
靜態函式:
既然有了靜態變數那就會有靜態函式,靜態函式只有訪問靜態變數,其它非靜態的函式是不被允許的,但在靜態成員函式中可以宣告它自身的變數,它也是一個函式也具有其它函式的特性
Static<資料型別><靜態函式名>(變量表);
和靜態變數一樣,靜態函式在宣告的時候就在記憶體中存在(即使沒有建立物件這和其它的非靜態函式是不一樣的),也具有全域性的生命週期。
下面給出一個靜態函式和靜態變數的例子:
import java.io.*; //匯入io流
public classTest_Static
{
int iNum1;
static intiNum2;
Test_Static(int
{
this.iNum1=iNum1;
this.iNum2=iNum2;
this.iNum1++;
this.iNum2++;
}
public voidDisplay1(String str)
{
System.out.println(str+".iNum1="+iNum1);
}
//靜態函式只能訪問靜態變數
public staticvoidDisplay2(String str)
{
System.out.println(str+".iNum2="+iNum2);
}
public staticvoidmain(String[] args)
{
Test_Static Obj1=new Test_Static(1,2);
Test_Static Obj2=new Test_Static(10,20);
Test_Static Obj3=new Test_Static(40,50);
Obj2.Display1("Obj2"); //輸出:iNum1=11
Obj2.Display2("Obj2"); //輸出:iNum2=51
Obj1.Display1("Obj1"); //輸出:iNum1=2
Obj1.Display2("Obj1"); //輸出:iNum2=51
Obj3.Display1("Obj3"); //輸出:iNum1=41
Obj3.Display2("Obj3"); //輸出:iNum2=51(最後一次NUM2初始化為50,所以所有的object(object1——object3)所屬的NUM2全變成了51.但是各自的NUM1還是按照各自初始化的值做了++運算。)
}
}