static修饰符用于声明静态字段或类变量。
它们与类相关联,而不是与任何对象相关联。类的每个实例共享一个类变量,该变量位于内存中的一个固定位置。任何对象都可以更改类变量的值,但也可以在不创建类实例的情况下操作类变量。
来源:“了解实例和类成员”
另请注意,Java 支持静态变量和方法。因此,这样一来,您的第一个类将正确编译,而其他两个将失败。
举个例子:
class A{
public static int STATIC_VALUE = 1; // is a valid static variable
public static void method1(){
//is a valid static method
}
/**
* Is a valid static inner class
*/
static class innerClassB{
}
}
但是你为什么要声明静态类呢?
有一些原因可以说明为什么要这样做。例如,来自这个Java 教程:
静态嵌套类与其外部类(和其他类)的实例成员交互,就像任何其他顶级类一样。实际上,静态嵌套类在行为上是一个顶级类,为了方便打包,它已经嵌套在另一个顶级类中。
这方面的一个很好的例子是static class Entry<K,V> implements Map.Entry<K,V>
在像HashMap类这样的地方使用。
Entry 类的存在与 HashMap 如何存储/检索存储为其内容的键/值对的功能密切相关。如您所见,Entry 类仅向 HashMap 实现提供功能,即使它在行为上等同于顶级类。因此,将其打包为 HashMap 定义本身的一部分是有意义的。
private static class Entry<E>
您可以在 LinkedList 实现中 找到类似的用法。
我能想到的另一个原因是白盒测试的一种方式。由于内部静态类可以访问外部类的私有和受保护静态变量/方法,因此您可以很好地使用它来测试外部类的内部状态。有些人可能会认为这很脏,但有时它可能很有用
在我看来,静态内部类主要是为了方便,并且通常基于您的设计原则。