【发布时间】:2012-09-04 03:29:36
【问题描述】:
我发现静态类包含未声明为静态的方法的代码。 编译器不显示任何警告。看起来很混乱,不是吗?
【问题讨论】:
-
你的问题应该是Does static internal class... ?
-
@PriyankDoshi 内部类根据定义是非静态的。
标签: java class methods static protected
我发现静态类包含未声明为静态的方法的代码。 编译器不显示任何警告。看起来很混乱,不是吗?
【问题讨论】:
标签: java class methods static protected
java中没有静态类的概念(甚至没有静态内部类)。如果您看到类是静态的并且处于工作状态,那么它必须是声明为静态的内部类(也称为嵌套类)。并且没有限制在静态内部类中只有静态方法。
声明一个内部类静态的意义在于能够创建独立于它所嵌套的类的嵌套类的实例。如果未提及静态,则嵌套类的每个实例都将与其嵌套的类的实例相关联。
这个问题有更多细节。 Java inner class and static nested class
【讨论】:
这里的答案很好,但我想我应该添加一个示例。考虑以下类定义
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
我认为这个例子应该清楚了。
【讨论】:
静态类是一个嵌套类,它没有对外部类的隐式引用。静态类可以有静态方法或实例方法。注意:内部类不能有静态方法。
【讨论】:
只有内部类可以声明为static。静态类没有指向其外部类的指针,因此只能引用外部类的静态字段和方法。然而,静态类本身可能包含非静态方法。
【讨论】:
Java 中没有“静态类”之类的东西(至少不是您似乎理解的那样)。在 C# 中有一个“静态类”,它不能被实例化并且不能有非静态成员。这个概念在 Java 中并不明确存在(但是,您可以通过将所有构造函数设为 private 来获得相同的效果)。
你看到的可能是一个像这样的静态嵌套类:
class Foo {
static class Bar {
}
}
这个only意味着Bar实例确实不有一个外部Foo实例的引用(如果Bar有没有static 修饰符)。
Bar 可以拥有任何类型的成员,如果它是顶级类的话。
【讨论】:
static 关键字对于属性/方法和类是完全不同的。
对于属性和方法,它会告诉编译器只有一个属性或方法的实例可以在没有类的活实例的情况下被引用。
static class 只能用于内部类,表示可以在没有封闭类的现有实例的情况下引用该类。因此,它对于应该从外部访问的内部枚举很有用。
但是static class 可以从它自己的身体中引用它想要的任何东西。
【讨论】: