原文出自 http://www.cnblogs.com/ggjucheng/archive/2012/11/30/2796085.html
這個章節,我們主要介紹static關鍵字建立類的欄位和執行個體,而不是講類的執行個體。
類變數
從類的藍圖中建立一個對象,每個對象都有自己的變數的唯一拷貝。例如Bicycle類,執行個體變數是cadence
, gear
, speed。每個Bicycle對象的每個變數都有自己的值,儲存在不同的記憶體位置。
有時,你希望所有對象共用變數。這通過static修飾符可以做到。使用static關鍵字修飾的欄位,稱之為靜態欄位或者類變數。這些變數是通過類關聯的,而不是任何對象。類的每個執行個體都共用每個類變數,每個類變數都儲存在固定位置。每個對象都可以修改類變數的值,但是類變數在沒有建立類執行個體的情況下,也可以操縱。
例子,加入你要建立Bicycle類,並賦值一個序號,第一對象從1開始,每個對象執行個體的ID都是唯一的,同時,你需要一個變數追蹤,至今有多少個Bicycle
類已經建立了,你才能知道下一個建立的對象要賦值什麼ID,而這個變數不與其他獨立的對象有關聯,但是它與整個類有關係。所以,我們需要一個類變數,numberOfBicycles
,如下:
public class Bicycle{ private int cadence; private int gear; private int speed; // add an instance variable for // the object ID private int id; // add a class variable for the // number of Bicycle objects instantiated private static int numberOfBicycles = 0; ...}
類變數可以通過類名引用,例如:
Bicycle.numberOfBicycles
這種使用方式清晰說明它是類變數。
注意:你也可以通過一個對象執行個體引用static欄位,例如
myBike.numberOfBicycles
but this is discouraged because it does not make it clear that they are class variables.
這種使用方式不不推薦的,因為它不能清晰說明它是一個類變數。
我們可以在Bicycle構造方法中,設定id執行個體變數,自增numberOfBicycles類變數:
public class Bicycle{ private int cadence; private int gear; private int speed; private int id; private static int numberOfBicycles = 0; public Bicycle(int startCadence, int startSpeed, int startGear){ gear = startGear; cadence = startCadence; speed = startSpeed; // increment number of Bicycles // and assign ID number id = ++numberOfBicycles; } // new method to return the ID instance variable public int getID() { return id; } ...}
類方法
java程式語言,支援靜態方法,就像支援靜態變數一樣。靜態方法,它在聲明中有static修飾符,應該使用類名調用,不需要建立任何類的執行個體,例如
ClassName.methodName(args)
注意:你可以通過對象引用靜態方法,例如
instanceName.methodName(args)
但是這種方法不推薦,因為它不能清晰表達它是一個類方法。
一個常見用途是使用static方法訪問static欄位,例如,我們可以在Bicycle類中添加一個static方法訪問static欄位numberOfBicycles。
public static int getNumberOfBicycles() { return numberOfBicycles;}
不是執行個體和類的變數和方法的組合都是合法的:
- 執行個體方法可以直接存取執行個體變數和執行個體方法
- 執行個體方法可以直接存取類變數和類方法
- 類方法可以直接存取類變數和類方法
- 類方法不能直接存取執行個體變數和執行個體方法—必須通過對象的引用訪問。同樣,類方法不能使用this關鍵字,因為當前沒有任何執行個體引用。
常量
static修飾符和final修飾符組合,可以用於聲明常量。final關鍵字指示欄位的值不能被初始化。
例如,以下的變數聲明聲明一個常量,名字為PI,其值是一個近似的pi(其直徑的圓的周長的比率)
static final double PI = 3.141592653589793;
使用這種方法聲明常量,常量不能重新賦值,如果程式試圖這麼做,編譯器會報錯。按照慣例,長嶺的名字是使用大寫字母拼字,如果名字包含多個單詞,單詞與單詞之間通過底線(_)做分割。
注意:如果一個原生類型或者是一個string聲明為常量,它的值可以在編譯期擷取,編譯器會在代碼中,使用這個常量的做一個替換。這種稱之為編譯時間常量。如果常量在外面的類改變了值(例如,如果立法PI實際為3.975),你需要重新編譯引用到這個常量的任何類。
Bicycle類
Bicycle使用了這個章節全部的修飾符,代碼如下:
public class Bicycle{ private int cadence; private int gear; private int speed; private int id; private static int numberOfBicycles = 0; public Bicycle(int startCadence, int startSpeed, int startGear){ gear = startGear; cadence = startCadence; speed = startSpeed; id = ++numberOfBicycles; } public int getID() { return id; } public static int getNumberOfBicycles() { return numberOfBicycles; } public int getCadence(){ return cadence; } public void setCadence(int newValue){ cadence = newValue; } public int getGear(){ return gear; } public void setGear(int newValue){ gear = newValue; } public int getSpeed(){ return speed; } public void applyBrake(int decrement){ speed -= decrement; } public void speedUp(int increment){ speed += increment; }}