静态类在java中只包含静态方法吗?

use*_*818 10 java methods static class protected

我找到了静态类包含未声明为静态的方法的代码.编译器不显示任何警告.这看起来很混乱,不是吗?

Nan*_*ale 8

java中没有静态类的概念(甚至不是静态内部类).如果你看到class是静态的并且它处于工作状态,那么它必须是内部类(也称为嵌套类),它被声明为static.静态内部类中只有静态方法没有限制.

声明内部类静态的意义在于能够创建嵌套类的实例,而不依赖于嵌套类的类.如果未提及static,则嵌套类的每个实例都将与嵌套它的类的实例相关联.

这个问题有更多细节. Java内部类和静态嵌套类

  • 那么,有一个静态类的概念,不是吗? (2认同)

noo*_*oob 6

这里的答案很好,但我想我应该添加一个例子。考虑以下类定义

class Foo{
    class Bar{
        int x;
    }
}
Run Code Online (Sandbox Code Playgroud)

要使用 Bar 类,您必须首先创建 Foo 类的实例。

Foo foo = new Foo();
Foo.Bar bar = foo.new Bar();
bar.x = 10;
Run Code Online (Sandbox Code Playgroud)

但是,如果您使用了如下所示的 static 关键字

class Foo{
    static class Bar{
        int x;
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以跳过一步

Foo.Bar bar = new Foo.Bar();
bar.x = 10;
Run Code Online (Sandbox Code Playgroud)

如果你尝试在内部类不是静态的时候直接静态地使用 Foo.Bar,那么你会得到以下错误——

error: an enclosing instance that contains Foo.Bar is required
        Foo.Bar bar = new Foo.Bar();
                      ^
1 error
Run Code Online (Sandbox Code Playgroud)

我认为这个例子应该清楚它。


Pet*_*rey 5

静态类是一个嵌套类,它没有对外部类的隐式引用。静态类可以具有静态方法或实例方法。注意:内部类不能有静态方法。

  • 来自 JLS 8.1.3“内部类是未显式或隐式声明为静态的嵌套类。” http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html (2认同)

Mat*_*arz 2

只能声明内部类static。静态类没有指向其外部类的指针,因此只能引用外部类的静态字段和方法。然而,静态类本身可以包含非静态方法。