1.靜態變量
當一個類被加載到內存中時,會立即創建一個靜態對象。該對象存儲靜態類變量(靜態類字段)。即使沒有創建該類的普通(非靜態)對象,靜態對像也存在。
當我們在一個類中聲明變量時,我們指出它們是否只創建一次,或者是否應該在每個對像中有這些變量的不同實例。默認情況下,為每個對象創建每個變量的新副本。
靜態變量綁定到類的靜態對象,並且始終只有一個實例。
要在類中創建靜態變量,需要static
在其名稱前寫上關鍵字。聲明靜態變量的一般格式是:
static Type name = value;
如果沒有為靜態變量分配初始值,則使用默認值對其進行初始化:
類型 | 默認值 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
(同樣的事情
) |
|
|
和任何課程 |
|
例子:
代碼 | 筆記 |
---|---|
|
|
|
|
|
|
|
|
|
在類內部,您可以簡單地通過使用它們的名稱來引用它的靜態變量。但是要從另一個類訪問它們,您需要在靜態變量名之前寫上類名。
ClassName.variable
例子:
多變的 | 班級 | 訪問其類之外的變量 |
---|---|---|
|
|
|
|
|
|
|
|
變量是private 。它在課堂之外是不可見的。 |
|
|
變量是private 。它在課堂之外是不可見的。 |
|
|
變量是private 。它在課堂之外是不可見的。 |
2.靜態變量和非靜態變量的區別
類的非靜態(普通)變量的聲明方式與靜態變量相同,只是沒有關鍵字static
。
普通變量和靜態變量有什麼區別?
類的普通變量綁定到類的對象(類的實例),而靜態變量綁定到類的靜態對象。
如果一個類有多個實例,每個實例都有自己的非靜態(普通)變量副本。一個類的靜態變量總是存儲在它的靜態對像中,並且只存在它們的一個實例。
僅當您擁有對類對象的引用時,才能訪問類的普通變量(字段)。當然,還有類的內部方法。
例子:
使用對象引用訪問類的字段 |
---|
|
您可以從任何地方訪問靜態變量(在考慮可見性修飾符之後):從普通方法、從同一類的靜態方法、從其他類的方法等。
例子:
在不使用對象引用的情況下訪問類的靜態字段 |
---|
|
內存是如何組織的:
假設我們有一個Person
包含 4 個字段的類:兩個是靜態的,兩個不是。
public class Person
{
public static int count = 0;
public static int sum = 0;
public int age = 0;
public String name;
}
加載類後立即
當 Java 機器完成加載Person
類時,內存將如下所示:
創建第一個對像後
如果我們創建一個Person
對象,那麼圖片就變成了這樣:
請注意,雖然兩個對像都有兩個變量,但它們是不同的變量:普通對像有普通變量,靜態對像有靜態變量。
我們需要更多物品
讓我們再創建兩個Person
對象。現在內存看起來像這樣:
請注意,每個對像都有自己的年齡和名稱變量。
3.刪除和添加static
修改器
從靜態到普通
如果我們拿一個靜態變量並通過刪除它的修飾符將它變成一個普通變量會發生什麼static
?例如,static int sum
變量。
修改後的代碼將如下所示:
public class Person
{
public static int count = 0;
public int sum = 0;
public int age = 0;
public String name;
}
現在內存看起來像這樣:
靜態變量從靜態對像中消失了,現在每個普通對像都有自己的sum
變量。
從普通到靜態
我們可以反其道而行之:將static
修飾符添加到類的普通變量中。它們將從所有普通對像中消失,並會出現在靜態對像中。假設我們決定將age
和name
變量設為靜態。然後代碼將如下所示:
public class Person
{
public static int count = 0;
public int sum = 0;
public static int age = 0;
public static String name;
}
現在內存看起來像這樣:
GO TO FULL VERSION