有時在特定類的所有實例中共享值是很有用的。靜態字段和靜態常量通過屬於類而不是實際對象來啓用這種類型的共享
通過在優銳課的java架構學習分享中,討論了關於類中定義的字段和方法只能在創建該類類型的對象時使用。例如,考慮一個簡單的Item類,它可以跟蹤商店中的商品:
public class Item {
private String itemName;
public Item(String itemName)
{
this.itemName = itemName;
}
public String getItemName()
{
return itemName;
}
}
爲了能夠使用getItemName(),我們必須首先創建一個Item對象,在本例中爲catFood:
public class StaticExample {
public static void main(String[] args) {
Item catFood = new Item("Whiskas");
System.out.println(catFood.getItemName());
}
}
但是,如果靜態修飾符包含在字段或方法聲明中,則使用字段或方法不需要類的實例-它們與類關聯,而不是單個對象。如果你回顧以上示例,你將看到靜態修飾符已在主方法聲明中使用:
public static void main(String[] args) {
主要方法是靜態方法,在調用對象之前不需要對象存在。作爲主()是任何Java應用程序的起點,實際上已經沒有對象來調用它。如果你想擁有一個不斷調用自己的程序,你可以這樣做:
public class StaticExample {
public static void main(String[] args) {
String[] s = {"random","string"};
StaticExample.main(s);
}
}
不是很有用,但請注意如何在不使用StaticExample類實例的情況下調用main()方法。
什麼是靜態場?
靜態字段也稱爲類字段。它們只是在聲明中包含靜態修飾符的字段。例如,讓我們回到Item類並添加一個靜態字段:
public class Item {
//static field uniqueId
private static int uniqueId = 1;
private int itemId;
private String itemName;
public Item(String itemName)
{
this.itemName = itemName;
itemId = uniqueId;
uniqueId++;
}
}
temId和itemName字段是普通的非靜態字段。創建項類的實例時,這些字段將具有保存在該對象中的值。如果創建了另一個Item對象,它也將具有用於存儲值的itemId和itemName字段。
但是,uniqueId靜態字段的值在所有Item對象中都是相同的。如果有100個Item對象,則itemId和itemName字段將有100個實例,但只有一個唯一的靜態字段。
在上面的例子中,uniqueId用於給每個Item對象一個唯一的數字。如果創建的每個Item對象都接受uniqueId靜態字段中的當前值,然後將其遞增一,則很容易做到這一點。使用靜態字段意味着每個對象不需要知道其他對象就可以獲得唯一的id。如果你想知道創建項對象的順序,這可能很有用。
什麼是靜態常數?
靜態常量與靜態字段完全相同,只是它們的值不能更改。在字段聲明中,使用final和static修飾符。例如,Item類可能應該對itemName的長度施加限制。我們可以創建一個靜態常量maxItemNameLength:
public class Item {
private static int id = 1;
public static final int maxItemNameLength = 20;
private int itemId;
private String itemName;
public Item(String itemName)
{
if (itemName.length() > maxItemNameLength)
{
this.itemName = itemName.substring(0,20);
}
else
{
this.itemName = itemName;
}
itemId = id;
id++;
} }
與靜態字段一樣,靜態常量與類而不是單個對象相關聯:
public class StaticExample {
public static void main(String[] args) {
Item catFood = new Item("Whiskas");
System.out.println(catFood.getItemName());
System.out.println(Item.maxItemNameLength);
}
}
喜歡這篇文章的可以點個贊,歡迎大家留言評論,記得關注我,每天持續更新技術乾貨、職場趣事、海量面試資料等等
如果你對java技術很感興趣也可以交流學習,共同學習進步。
不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代
文章寫道這裏,歡迎完善交流。最後奉上近期整理出來的一套完整的java架構思維導圖,分享給大家對照知識點參考學習。另外有更多JVM、Mysql、Tomcat、Spring Boot、Spring Cloud、Zookeeper、Kafka、RabbitMQ、RockerMQ、Redis、ELK、Git等Java乾貨,以及項目可以分享給大家練手