关于类:Java中的静态类有什么用?

What good are static classes in Java?

我读过,我可以定义一个类为static,但我不明白为什么我需要这样做。静态类有什么好处?我什么时候需要使用它们?我会欣赏例子。


类的static关键字只允许用于嵌套类,在另一个类内。

非静态嵌套类(也称为内部类)和静态嵌套类之间的区别在于,第一个类的对象总是有一个对应的"外部"对象,而后一个类的对象则没有(它们只有私有级别的访问权限,并且在命名空间中)。

这里有一个例子:

1
2
3
4
class Outer {
    static class StaticNested {}
    class Inner {}
}

现在我们可以创建如下对象:

1
2
3
Outer o = new Outer();
Outer.StaticNested sn = new Outer.StaticNested();
Outer.Inner i = o.new Inner();

oi的对应外部对象,而sn没有这样的元素。(通常您将从外部对象的方法创建内部类的对象,在那里您可以简单地编写new Inner(),它将this作为外部对象。)

Inner的外部,我们无法得到相应的外部物体,但在内部,我们可以写Outer.this来引用外部物体。如果需要,这可以在多个级别上工作。


您可以这样将内部类定义为静态类(为了彻底了解,该类将成为静态嵌套类):

1
2
3
class A {
    public static class Inner { }
}

这意味着类Inner在某种程度上与A有关,但不附属于特定的实例。这主要是在两者之间建立某种关系的一种方式。

如果你是一个Java初学者,我建议你不要浪费太多的时间去寻找一些有用的应用程序。请记住,这种可能性存在,并且当您将更好地理解面向对象编程一般和Java,特别是,您将再次出现在这里。

需要注意的是,只有内部类可以被定义为静态类,而"普通"类不能。


来自Sun认证程序员的Java 6学习指南:

A static nested class is simply a class that's a static member of the enclosing class.... The class itself isn't really"static"; there's no such thing as a static class. The static modifier in this case says that the nested class is a static member of the outer class. That means it can be accessed, as with other static members, without having an instance of the outer class.

显而易见的下一个问题是"static是什么意思?"它的意思是,每个类有一个,而不是每个对象有一个。换句话说,有一个版本是每个人共享的,不与任何特定实例绑定,而不是类的每个实例一个)。这一点听起来很明显,但是在希望使用静态成员并且还希望使用类的情况下,应该使用静态类。静态类有时也可以作为小型助手方法的容器,因为它们可以访问封闭类的私有成员。

以下是我在学校时记得的一个例子:

1
2
3
4
5
6
7
8
public class Shapes {
    List<Shape> shapes;

    private static class ShapeSorter implements Comparator {
        ...
    }

...

请注意,不能有顶级静态类;它没有可作为成员的封闭类。由于范围问题,也不能在方法内部声明静态类。

关于Java中静态的意思,堆栈溢出有几百个其他问题。以下是一些可以让你去的地方:

  • 什么是"静态"?
  • 为什么你不能在Java中声明一个类作为静态?
  • JAVA:静态类?
  • Java中的静态嵌套类,为什么?