有时在特定类的所有实例中共享值是很有用的。静态字段和静态常量通过属于类而不是实际对象来启用这种类型的共享
通过在优锐课的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干货,以及项目可以分享给大家练手