static public class Constants {
首先回答你的问题:
只有嵌套类可以声明为静态。顶级类不能声明为静态。
其次,内部类是一种未显式声明为静态的嵌套类。请参见Java语言规范。因此,与此处某些答案相反,内部类不能是静态的。
引用规范中的一个例子:
class HasStatic{
static int j = 100;
}
class Outer{
class Inner extends HasStatic{
static final int x = 3; // ok - compile-time constant
static int y = 4; // compile-time error, an inner class
}
static class NestedButNotInner{
static int z = 5; // ok, not an inner class
}
interface NeverInner{} // interfaces are never inner
}
正如其他评论中已经告诉你的一样,类不能被声明为静态的。然而,对于这个问题有一些替代方案。
最简单的一个是在所有成员变量和方法前加上static修饰符。这基本上实现了你想要的效果。
稍微复杂一点的替代方案是将类设计为单例模式。通过使用私有构造函数和instanceOf()方法(或者只是一个枚举),你可以只有一个该类的实例。在语义和语法上,你将该实例视为特定类的普通实例,但你只能拥有一个该类的实例,通过SomeObject.instanceOf()方法或者在枚举实现中使用SomeObject.INSTANCE进行检索。
通常情况下,我们使用枚举来实现这个功能,除非你需要扩展另一个类。
关于单例模式的更详细信息,请访问下面的链接。
Eclipse正确地报错了,你的代码无法编译,因为顶层类不能声明为静态。
你需要先理解什么是静态类。
静态类:
只有成员类和嵌套顶层类可以被定义为静态,顶层类不能声明为静态。
当你想要在不显式委托的情况下使用包含类的变量和方法时,你声明成员类。当你声明一个成员类时,你只能在声明该成员类的外部类对象的上下文中实例化该成员类。如果你想要移除这个限制,你可以将成员类声明为静态类。当你用static修饰符声明一个成员类时,它就成为了一个嵌套顶层类,并且可以像上面解释的普通顶层类一样使用。
嵌套顶层类是带有static修饰符的成员类。嵌套顶层类与任何其他顶层类一样,只是它在另一个类或接口内声明。嵌套顶层类通常用作一种方便的方式来组织相关的类,而不创建新的包。
在Java中,没有直接等价于C#的静态类,但我认为最接近的是一个空枚举。一开始可能觉得很奇怪,但仔细思考后就会明白其中的道理。在Java中,枚举(与C#不同)本质上是一组实现相同抽象基类和接口的单例实例。在Java中创建普通的单例对象的最快、最安全的方法如下:
enum Foo {
INSTANCE;
public Bar doSomething(Baz baz) {
return Bar.fromBaz(baz); // yadda yadda
}
}
enum MyUtilities {
;
static Bar doSomething(Baz baz) {
return Bar.fromBaz(baz); // yadda yadda
}
static final String SOME_CONSTANT = "QUX";
}
this
。 - Tom Hawtin - tackline