java中的静态字段

有时,在特定类的所有实例之间共享值是很有用的。静态字段和静态常量通过属于类而不是实际对象来实现这种类型的共享。...

有时,在特定类的所有实例之间共享值是很有用的。静态字段和静态常量通过属于类而不是实际对象来实现这种类型的共享。

Man using computer

静态修饰符

通常,类中定义的字段和方法只能在创建该类类型的对象时使用。例如,考虑一个简单的项目类,它跟踪商店中的商品:

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()); } }

但是,如果静态修饰符包含在字段或方法声明中,则使用字段或方法不需要类的实例-它们与类关联,而不是单个对象。如果回顾上面的示例,您将看到static修饰符已经在main方法声明中使用:

public static void main(String[] args) {

main方法是一个静态方法,在调用对象之前不需要对象存在。由于main()是任何Java应用程序的起点,因此实际上没有对象可以调用它。如果您想让一个程序不断地调用自己,您可以这样做:

public class StaticExample { public static void main(String[] args) { String[] s = {"random","string"}; StaticExample.main(s); } }

这不是很有用,但请注意,在没有StaticExample类实例的情况下如何调用main()方法。

什么是静电场(a static field)?

静态字段也称为类字段。它们只是声明中包含静态修饰符的字段。例如,让我们回到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++; } }

字段itemId和itemName是正常的非静态字段。创建项目类的实例时,这些字段的值将保存在该对象中。如果创建了另一个Item对象,它也将具有用于存储值的itemId和itemName字段。

但是,uniqueId静态字段保存的值在所有项对象中都是相同的。如果有100个Item对象,则itemId和itemName字段将有100个实例,但只有一个uniqueId静态字段。

在上面的示例中,uniqueId用于为每个Item对象指定一个唯一的编号。如果创建的每个Item对象都接受uniqueId静态字段中的当前值,然后将其递增1,那么这很容易做到。使用静态字段意味着每个对象不需要知道其他对象就可以获得唯一的id。如果您想知道项对象的创建顺序,这可能很有用。

什么是静态常数(a static constant)?

静态常量与静态字段完全相同,只是其值不能更改。在字段声明中,使用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); } }

关于maxItemNameLength静态常量,需要注意两个重要事项:

  • 它被声明为公共字段。一般来说,在您设计的任何类中公开一个字段都不是一个好主意,但在这种情况下,这并不重要。无法更改常量的值。
  • 静态常量用于类名项,而不是项对象。

静态常量可以在整个JavaAPI中看到。例如,integer包装类有两个用于存储int数据类型可以具有的最大值和最小值:

System.out.println("The max value for int is: " + Integer.MAX_VALUE); System.out.println("The min value for int is: " + Integer.MIN_VALUE); Output: The max value for int is: 2147483647 The min value for int is: -2147483648

  • 发表于 2021-09-12 23:33
  • 阅读 ( 159 )
  • 分类:IT

你可能感兴趣的文章

静止的(static)和java期末考试(final in java)的区别

关键区别——java中的静态与最终版本 每种编程语言都有特定的语法。程序员在编写程序时应该遵循这些语法。程序设计语言的关键字根据任务的不同具有特定的含义。它们由编程语言提供,不能用于用户定义的变量、方法、...

  • 发布于 2020-10-19 07:48
  • 阅读 ( 317 )

静态绑定(static binding)和动态绑定(dynamic binding)的区别

...这些类还有draw()方法和它们自己的实现。因此,超类中的draw()方法被重写。 在main方法中,调用不同的对象。有一个Shape类型的引用变量,它是s。然后,s根据特定的类调用方法。在编译时,编译器将只引用超级类draw方法。...

  • 发布于 2020-10-19 17:49
  • 阅读 ( 416 )

继承(inheritance)和java接口(interface in java)的区别

...是实现抽象类和多重继承。 目录 1. 概述和主要区别 2.Java中的继承是什么 3. Java中的接口是什么 4. Java中继承与接口的相似性 5. 并行比较——继承与Java中的接口的表格形式 6. 摘要 什么是java中的继承(inheritance in java)? 继承可以...

  • 发布于 2020-10-25 00:02
  • 阅读 ( 496 )

入门时应学习的10个核心java概念

...AR文件被提供给Java虚拟机执行,该虚拟机开始执行指定类中的main()程序。 ...

  • 发布于 2021-03-13 05:33
  • 阅读 ( 247 )

抽象类(abstract class)和java接口(interface in java)的区别

...法。好吧,因为Java8,接口也有方法实现,它们可以有Java中的静态和默认方法。让我们详细研究一下两者的区别。 什么是java中的抽象类(an abstract class in java)? Java中的抽象类是一个声明为抽象的类——它可能包含也可能不包含...

  • 发布于 2021-06-25 03:52
  • 阅读 ( 306 )

最终的(final)和静止的(static)的区别

...子(b)一旦设置它们,它们就不会更改其值。变量声明中的静态字显示该变量不属于任何对象。有一个类似的关键字,它说变量值只设置一次,不会改变。这是关键字final。这个关键字不限于静态变量,但可以与实例变量、局部...

  • 发布于 2021-06-25 15:47
  • 阅读 ( 307 )

斯卡拉(scala)和java(java)的区别

...;相反,它有单例对象——一个只有一个实例的类。Scala中的所有东西都是类的实例,而Java中的基本体和静态体都在OO模型之外。此外,实体上的所有操作都是通过Scala中的方法调用进行的,而操作符在Java中的处理方式不同,不...

  • 发布于 2021-06-25 20:43
  • 阅读 ( 377 )

静止的(static)和最终的(final)的区别

...法显示。由于类A的display方法是final,因此不允许重写类B中的该方法。 此外,最后一个类不能如下扩展。 Figure 6: final class Figure 7: Class B 因为类A是最终的,所以它不能被类B扩展或继承。 静止的(static)和最终的(final)的区别 定义 St...

  • 发布于 2021-07-01 02:23
  • 阅读 ( 438 )

包裹(package)和接口(interface)的区别

...和抽象方法的集合。 包和接口是Java等面向对象编程语言中的两个主要概念。包具有一组关联的类和接口。接口有一组字段和抽象方法。 覆盖的关键领域 1.什么是包-定义,功能2.什么是接口-定义,功能3.包和接口之间的关系是什...

  • 发布于 2021-07-01 09:47
  • 阅读 ( 354 )

收集(collection)和收藏(collections)的区别

...可用。Collection是最顶层的接口,而Collection是Java集合框架中的一个类。总的来说,Collection允许将多个对象存储为一个Collection对象。另一方面,集合允许对该对象执行操作。 覆盖的关键领域 1.什么是收藏-定义,功能2.什么是收藏...

  • 发布于 2021-07-01 16:01
  • 阅读 ( 216 )
q367363469
q367363469

0 篇文章

相关推荐