java中的静态类

时间:2010-09-09 03:46:28

标签: java static

如何在java中声明静态类? eclipse希望我从声明中删除“静态”。

static public class Constants {

6 个答案:

答案 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来实现此功能,减去扩展另一个类的边缘情况。

有关单身人士的更多完整信息,请访问以下链接。

Design Patterns in Java - Singleton

答案 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

才有意义