如何在java中声明静态类? eclipse希望我从声明中删除“静态”。
static public class Constants {
答案 0 :(得分:7)
首先回答你的问题:
只能将嵌套类声明为静态。顶级类不能声明是静态的。
其次,内部类是一个未显式声明为静态的嵌套类。请参阅java language spec。因此,与此处的一些答案相反,内部类不能是静态的
引用规范中的一个例子:
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
}
答案 1 :(得分:1)
如果用“静态”表示'只能有静态成员',那么在Java中就没有这样的东西了。
内部类(只有它们)可以是静态的,但这是一个不同的概念。 Inner static个类仍然可以包含实例成员。
答案 2 :(得分:0)
Eclipse抱怨正确,您的代码将无法编译为顶级类不能声明为静态。
您需要先了解静态类的含义。
静态类:
顶级类不能声明为静态。只有成员和嵌套的顶级类可以定义为静态。
如果要在不使用显式委派的情况下使用包含类的变量和方法,则声明成员类。声明成员类时,只能在声明此成员类的外部类的对象的上下文中实例化该成员类。如果要删除此限制,则将成员类声明为静态类。当使用static修饰符声明成员类时,它将成为嵌套的顶级类,并且可以用作正常的顶级类,如上所述
嵌套的顶级类是具有静态修饰符的成员类。嵌套的顶级类与任何其他顶级类一样,只是它在另一个类或接口中声明。嵌套的顶级类通常用作分组相关类的便捷方式,而无需创建新包。
同时选中when should we go for static class,variables and methods in java
答案 3 :(得分:0)
正如您已从其他评论中获悉的那样,不能将类声明为静态。但是,这个问题还有其他选择。
最简单的方法是在所有成员变量和方法之前加上static修饰符。这基本上可以满足您的需求。
一个稍微复杂一点的选择是使该类成为单身人士。这是一个通过使用私有构造函数和instanceOf()方法或只是Enum的类,您只能拥有该类的一个实例。在语义和语法上,您将该实例视为您正在构建单例的任何特定类的普通实例,但您只能拥有该类的单个实例,您可以通过SomeObject.instanceOf()或Enum实现,SomeObject检索该实例。 .INSTANCE。
您通常会使用Enums来实现此功能,减去扩展另一个类的边缘情况。
有关单身人士的更多完整信息,请访问以下链接。
答案 4 :(得分:0)
在Java中没有与C#静态类相同的直接等价物,但我认为最接近的是一个空的枚举,一开始可能看起来很奇怪,但你想的越多就越有意义。 Java中的枚举(与C#不同)本质上是一组单例实例,它们都实现相同的抽象基类和接口。在Java中制作普通单例的最快和最安全的方法就像这样:
enum Foo {
INSTANCE;
public Bar doSomething(Baz baz) {
return Bar.fromBaz(baz); // yadda yadda
}
}
因此,既然我们正在处理单个集合,那么我们可以有一个空集合是有意义的。空集意味着没有实例。这在概念上与C#中的静态类相同。
enum MyUtilities {
;
static Bar doSomething(Baz baz) {
return Bar.fromBaz(baz); // yadda yadda
}
static final String SOME_CONSTANT = "QUX";
}
这很好,因为你不会因为在最终类中测试私有构造函数而丢失测试覆盖率,并且代码比具有空私有构造函数的final类更清晰。
现在,如果静态类适用于单个接口并且您可以控制该接口,那么您应该在该接口本身上实现静态方法(在C#中无法做到这一点)。
答案 5 :(得分:-2)
所有顶级类都隐含static
,这意味着每个人都可以访问它们。因此,只有使内部类可选static
。