例項變數和類變數的區別
Java類體中的成員變數可以分為例項變數和類變數。其中類變數需用static修飾,否則則為例項變數。類變數又稱為static變數或者靜態變數。例如:
class Book{
string name; //例項變數
static int a=0; // 類變數
}
其區別:
1)不同物件的例項變數互不相同:
類可以宣告很多不同的物件,這些物件將會分配不同的成員變數。即分配給不同物件的例項變數佔有不同的記憶體空間,改變其中一個物件的例項變數不會對其他物件的例項變數造成影響。
例如:
Book a,b;
a.name=Chinese;
b.name=English;
則System.out.println("a書的名字為"+a.name);的結果是
a書的名字為Chinese
即對b物件的name這個例項變數進行操作,不會影響a物件的name變數。
2)所有物件共享類變數
所謂的共享類變數就是指,類在宣告不同物件時,分配的這些物件的類變數會佔用同一個記憶體,即改變一個物件的類變數,其他物件的這個類變數也會改變。
例如:
Book a,b;
a.a++;
System.out.println(a.a);
b.a++;
System.out.println(b.a);
結果為:
1
2
即類變數為所有物件共享
3)通過類名可以直接訪問類變數
類變數是與類相關聯的資料變數,即類變數是和該類建立的所有物件相關聯的變數。改變其中一個物件的這個類變數就同時改變了其他所有物件的這個類變數。因此類變數不僅可以通過某個物件進行訪問,也可以直接用類名進行訪問。例項變數僅僅適合相應物件相關聯的變數,不同物件的例項變數互不相同,分配不同記憶體空間,改變其中一個物件的例項變數不會影響其他物件的這個例項變數。例項物件可以通過物件進行訪問,但不能通過類名進行訪問,這是因為當物件未被宣告時,例項變數是不分配記憶體的。
例如:
Book a,b;
a.name=Chinese;//物件a呼叫例項變數name,正確
b.a=1;//物件b呼叫類變數a ,正確
Book.a=2;//類名呼叫類變數,正確
Book.name=Chinese;//類名呼叫例項變數,錯誤,不能用類名直接呼叫例項變數。