有人可以解释以下情况之间的区别以及我们在哪里使用它们?谢谢大家
class A{
static public void methodA()
}
static class B{
static public void methodB()
}
static class C{
public void methodC()
}
Run Code Online (Sandbox Code Playgroud)
编辑:大家好,谢谢你的回答.我也许还不够清楚.我知道除非它们是内部类,否则不能将类B和C声明为静态.我在你的答案中,请假设他们是内部阶级.我想知道何时将它们声明为静态,甚至何时声明它们的方法是静态的.我知道非静态类中的静态方法意味着您可以从任何地方调用它,并且通常执行非特定于对象的常规操作.但是你为什么要声明静态类呢?在您重新阅读我的编辑并接受最具说明性的答案后,我会再次检查您的答案
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{
}
}
Run Code Online (Sandbox Code Playgroud)
但为什么要声明静态类呢?
人们想要这样做有一些原因。例如,来自此Java 教程:
静态嵌套类与其外部类(和其他类)的实例成员进行交互,就像任何其他顶级类一样。实际上,静态嵌套类在行为上是一个顶级类,为了打包方便而嵌套在另一个顶级类中。
一个很好的例子是在HashMapstatic class Entry<K,V> implements Map.Entry<K,V>类等地方使用。
Entry 类的存在与 HashMap 如何存储/检索作为其内容存储的键/值对的功能密切相关。正如您所看到的,Entry 类只为 HashMap 实现提供功能,尽管它在行为上等同于顶级类。因此将其打包为 HashMap 定义本身的一部分确实有意义。
private static class Entry<E>您可以在 LinkedList 实现中 找到类似的用法。
我能想到的另一个原因是白盒测试的一种方式。由于内部静态类可以访问外部类的私有和受保护的静态变量/方法,因此您可以很好地使用它来测试外部类的内部状态。有些人可能认为这很脏,但有时它可能很有用
在我看来,静态内部类大多是为了方便,一般都是根据你的设计原则来的。