为什么顶级类在Java中不能是静态的?

时间:2011-09-10 09:22:26

标签: java class static

无法在任何地方找到满意的答案。

7 个答案:

答案 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的很多地方,但从不引用顶级类型声明。以下是可以是“静态”的事物的详尽列表:

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)

将外部类定义为静态类会否为非静态类提供其他目的?

  1. 每个类都已经对它的所有对象通用,因此无需使其变为静态就可以对所有对象使用。

  2. 我们需要一个类名称来访问其静态成员,因为这些成员是类的一部分,而外部类是包的一部分。我们只需编写package_name.class_name(类似于class_name.static_field_name)即可直接访问该类。同样,默认情况下,无需做已有的事情。

  3. 如果可见,我们不需要任何对象来访问类。我们只需编写package_name.class_name即可访问它。顾名思义,类是其对象的蓝图,我们创建了一个类以从中创建对象(尽管总是会出现异常,如java.lang.Math)。同样,无需将外部类定义为静态。 从以上几点,我们可以说Java的创建者不允许外部类是静态的,因为没有必要使它成为静态。允许将外部类设为静态只会增加复杂性,歧义性和重复性。

请参阅此链接以获取更多详细信息- https://dzone.com/articles/why-an-outer-class-cant-be-static

答案 6 :(得分:-1)

  1. 无论何时我们运行类JVM都会创建一个对象。所有静态对象都在 静态内存而不在堆内存中。意思是,我们对所有对象都有相同的副本集。 因此,如果顶级类是静态的并且您运行pgm,它将创建一个静态对象并继续 骑在相同的静态内存上。这是错误的。

2。我们应该将成员定义为静态的   对于该类的所有对象应该是通用的。   因为,每个类都已经对其所有对象都通用,因此无需进行   它静态变为可用于其所有对象。