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

时间:2012-09-11 08:29:09

标签: java class methods static protected

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

6 个答案:

答案 0 :(得分:8)

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

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

这个问题有更多细节。 Java inner class and static nested class

答案 1 :(得分:4)

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

答案 2 :(得分:3)

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

class Foo{
    class Bar{
        int x;
    }
}

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

Foo foo = new Foo();
Foo.Bar bar = foo.new Bar();
bar.x = 10;

但是如果您使用了以下

之类的静态关键字
class Foo{
    static class Bar{
        int x;
    }
}

你可以跳过一步

Foo.Bar bar = new Foo.Bar();
bar.x = 10;

如果您在内部类不是静态时直接尝试静态使用Foo.Bar,那么您将收到以下错误 -

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

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

答案 3 :(得分:2)

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

答案 4 :(得分:2)

在Java中没有“静态类”这样的东西(至少不是你似乎理解它的方式)。在C#中有一个“静态类”,它不能被实例化,也不能有非静态成员。这个概念在Java中并不明确存在(但是,通过创建所有构造函数private可以获得相同的效果。)

您所看到的可能是静态嵌套类,如下所示:

class Foo {
  static class Bar {
  }
}

表示Bar实例具有对外Foo实例的引用(如果是Bar没有static修饰符。)

Bar如果是顶级课程,可以拥有任何类型的成员。

答案 5 :(得分:0)

static关键字对于属性/方法和类完全不同。

对于属性和方法,它将告诉编译器只有一个属性或方法的实例,可以在没有类的活动实例的情况下引用它。

static class只能用于内部类,以指示可以在没有封闭类的现有实例的情况下引用该类。因此,对于应该从外部访问的内部枚举非常有用。

但是static class可以从自己的身体中引用它想要的任何东西。

相关问题