Bar*_*end 70
根据定义,所有顶级类都是静态的.
什么static归结为是类的一个实例可以站在自己的.或者,反过来说:没有外部类的实例,非静态内部类(=实例内部类)不可能存在.由于顶级类没有外部类,因此它不能是任何东西static.
因为所有顶级类都是静态的,所以static在顶级类定义中使用关键字是没有意义的.
一些代码可以解决:
public class Foo {
public class Bar {
// Non-static innner class
}
public static class Baz {
// Static inner class
}
}
public class Example {
public static void main(String[] args) {
new Foo(); // this is ok
new Foo.Baz(); // this is ok
new Foo.Bar(); // does not compile!
Foo f = new Foo();
Foo.Bar bar = f.new Bar(); //this works, but don't do this
}
}
Run Code Online (Sandbox Code Playgroud)
我把"但不要这样做"放在那里,因为它真的是丑陋的代码设计.实例内部类不应该在外部类外部可见.它们只能在外层使用.
简而言之,顶级类型声明不能是静态的,因为Java 语言规范(JLS) 并没有说它可以是。JLS明确表示将static关键字作为顶级类的修饰符:
修饰符
static仅适用于成员类(第 8.5.1 节),而不适用于顶级或本地或匿名类。
然而,接受的答案 - 有很多赞成 - 说这是因为顶级类“根据定义”是隐式静态的,所以static修饰符是不必要的。那是错的。
“静态”一词出现在 JLS 中的很多地方,但从未指代顶级类型声明。以下是可以是“静态”的内容的详尽列表:
throws子句中声明的已检查异常是静态抛出的。JLS 中没有使用“静态”一词来指代顶级类型声明;因此,除了不是显式静态之外,根据定义,它们不是(也不能)“隐式”静态。
| 归档时间: |
|
| 查看次数: |
32970 次 |
| 最近记录: |