无法在任何地方找到满意的答案。
答案 0 :(得分:68)
根据定义,所有顶级类都是静态的。
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
}
}
我在那里放了“但不要这样做”因为它是真的丑陋的代码设计。实例内部类不应该在外部类外部可见。它们只能在外层使用。
答案 1 :(得分:4)
简而言之,顶级类型声明不能是静态的,因为Java Language Specification(JLS)并未声明可以是静态的。有关static
关键字的JLS says this explicitly作为顶级类的修饰符:
修饰符
static
仅适用于成员类(第8.5.1节),不适用于顶级或本地或匿名类。
但是,被接受的答案(有很多投票)说,这是因为顶级类“根据定义”是隐式静态的,因此不需要static
修饰符。那是错误的。
“静态”一词出现在JLS的很多地方,但从不引用顶级类型声明。以下是可以是“静态”的事物的详尽列表:
throws
子句中声明的检查异常为statically thrown。JLS中没有使用“静态”一词来引用顶级类型声明;因此,根据定义,它们不是(也不能是)“隐式”静态的。
答案 2 :(得分:2)
static
可以添加接口的嵌套类,即使这是默认值。
我认为static
无法添加到顶级类,因为最初没有嵌套类,您无法向任何类添加静态。
后来添加了嵌套类,并且可以将静态添加到嵌套类中,但是有一种趋势是不会更改语法,因此它不会添加到顶级类。 (因为没有必要/好处)
答案 3 :(得分:0)
嗯,如果您希望看到一个静态的"外部类中的关键字。
简而言之,您如何在外层使用静态功能?
public class Outer
{
public static int x = 0 ;
}
现在你要做Outer.x来访问静态变量。这意味着x在Outer的所有对象之间共享一个值。
现在我们已经知道了,Outer类中的static关键字会产生什么后果? 。
答案 4 :(得分:0)
我们不能将外层(顶层)类声明为静态,因为static关键字用于提供内存和执行逻辑而不创建对象,类没有直接的值逻辑,所以不允许使用static关键字外层。
答案 5 :(得分:0)
将外部类定义为静态类会否为非静态类提供其他目的?
每个类都已经对它的所有对象通用,因此无需使其变为静态就可以对所有对象使用。
我们需要一个类名称来访问其静态成员,因为这些成员是类的一部分,而外部类是包的一部分。我们只需编写package_name.class_name(类似于class_name.static_field_name)即可直接访问该类。同样,默认情况下,无需做已有的事情。
如果可见,我们不需要任何对象来访问类。我们只需编写package_name.class_name即可访问它。顾名思义,类是其对象的蓝图,我们创建了一个类以从中创建对象(尽管总是会出现异常,如java.lang.Math)。同样,无需将外部类定义为静态。 从以上几点,我们可以说Java的创建者不允许外部类是静态的,因为没有必要使它成为静态。允许将外部类设为静态只会增加复杂性,歧义性和重复性。
请参阅此链接以获取更多详细信息- https://dzone.com/articles/why-an-outer-class-cant-be-static
答案 6 :(得分:-1)
2。我们应该将成员定义为静态的 对于该类的所有对象应该是通用的。 因为,每个类都已经对其所有对象都通用,因此无需进行 它静态变为可用于其所有对象。