为什么Java没有静态类

4
我是新手Java。当我查看语言规范时,发现不能声明静态类,但我们可以有静态内部类。我有点困惑为什么不能有顶级静态类。如果我想创建仅包含实用程序方法的类,我可以选择静态类。为什么Java开发者限制了这个功能呢?

1
如果这是可能的,你认为它意味着什么?这不是一个真正的问题。 - user207421
你应该问自己,你的电脑是否会有多个实例? - Frederik.L
1
@Frederik,除非您暗示“static”在外层级别上具有某种意义,否则您的评论完全没有意义,而它并没有这样的含义。 - user207421
@EJP 您是正确的,我只是提出一个无意义的情况来说明 OP 的功能没有意义。 - Frederik.L
5个回答

8

这不是一种限制,你不需要使用static class来定义一个实用工具类,只需要使用static methods即可。例如,在Java中,Math类充满了静态方法,但该类本身并非静态的。

当你定义一个内部类并希望在不创建封闭类实例的情况下使用它时(在Java中是允许的),可能只需要静态类。

你可以按照以下方式定义实用程序类:

class Util {
  public static void method(){
     // your utility method
  }
}

7

顶级类已经是顶级的,因此声明其为静态是没有意义的;这样做是错误的。

静态类声明


4

static是一个相对的概念。

static表示“独立于包含该实例的实例”。因此,静态字段具有相同的值,与类的实例无关。静态内部类对父类的每个实例都有效。

但是,static顶级类将“独立于包含该实例的实例”指的是什么呢?顶级类没有包含实例。这就是为什么它不能是static的原因(或者说它总是static,这取决于您的观点 - 但在任何情况下,都不需要指定它)。

在实现上,非static内部类包含对包含外部类的引用。显然,对于顶级类来说,这种区别也是不可能的。


1
因为它没有添加任何意义。当应用于嵌套类时,“static”具有含义。但是,在外部类上它没有意义。因此,您不能指定它。

0
据我所知,如果允许将顶层类声明为静态类,则它将始终在堆内存中保留引用即使您不使用它。这就是所谓的内存泄漏。因此,这就是为什么被限制这样做的原因。

2
答案毫无意义。这并不完全是你的错,因为问题本身也是毫无意义的,但是为一个不存在的功能发明不存在的语义并不是真正的答案。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接