2010-09-09 64 views
2

如何在java中声明静态类?日食希望我从声明中移除“静态”。java中的静态类

static public class Constants { 

回答

1

如果用'static'表示'只能有静态成员',那么Java中就没有这种东西。

内部类(只有它们)可以是静态的,但这是一个不同的概念。 Inner static类仍然可以有实例成员。

+0

只有内部类可以是静态的。 – Thilo 2010-09-09 03:49:21

+2

@Thilo,当你说内心时,我希望你的意思是“嵌套”。因为“Inner”在规范中有不同的含义。只有“嵌套”类可以是静态的。不是静态的嵌套类被称为内部类 – naikus 2010-09-09 04:17:05

+0

请参阅我对Thilo的评论。内部类是非*声明为静态的嵌套类。因此,如果声明为静态,则不能将其称为内部类:) – naikus 2010-09-09 04:18:51

-2

所有顶级类别隐含地为static,这意味着每个人都可以访问它们。所以只有内部类可选static才有意义。

+2

这一切都不正确。静态并不意味着“每个人都可以访问”,并不是所有的顶级类都可以被每个人访问。结论并不是从前提出发的。 – EJP 2010-09-10 00:04:03

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 
} 
+4

+1不会让内部类与嵌套类混淆。我的巨大的偷情。 :-) – 2010-09-09 04:20:15

+0

如果我理解正确,嵌套类可以是静态的或不是。嵌套接口,枚举和注释都是隐式静态的。 – emory 2010-09-09 04:34:21

+0

@emory:是的。 – 2010-09-09 04:56:12

0

Eclipse中正确地抱怨,你的代码将无法编译为顶层类可以”不被宣布为静态。

您需要先了解静态类的含义。

静态类

顶层类不能被声明为静态的。只有成员和嵌套的顶级类可以定义为静态。

如果您希望在没有明确委派的情况下使用包含类的变量和方法,则声明成员类。当你声明一个成员类时,你只能在声明这个成员类的外部类的对象的上下文中实例化该成员类。如果你想删除这个限制,你可以声明成员类是一个静态类。当你用一个静态修饰符声明一个成员类时,它将成为一个嵌套的顶级类,并且可以像上面解释的那样用作一个普通的顶级类。

嵌套的顶级类是带有静态修饰符的成员类。嵌套的顶级类与其他任何顶级类相似,只不过它在另一个类或接口中声明。通常将嵌套的顶级类用作组合相关类的便捷方式,而不创建新的包。

还要检查when should we go for static class,variables and methods in java

0

正如你已经从其他意见告知,类不能被声明为静态的。但是,这个问题有其他选择。

最简单的方法是在所有成员变量和方法之前加上static修饰符。这基本上是你想要的。

一个稍微更复杂的选择是让这个类变成单例。这是一个通过使用私有构造函数和instanceOf()方法的类,或者只是一个Enum类,您只能拥有该类的一个实例。在语义上和语法上,您将该实例视为您正在创建单例的任何特定类的普通实例,但您只能拥有该类的单个实例,该实例可通过SomeObject.instanceOf()或Enum实现中的SomeObject .INSTANCE。

您通常会使用Enums来实现这一点,减去扩展另一个类的边缘情况。

欲了解更多关于单身人士的完整信息,请访问下面的链接。

Design Patterns in Java - Singleton

0

有C#的静态类Java中没有直接等价的,但在我看来,最接近的是一个空的枚举,这初看起来似乎不可思议,但有道理你越去想它。 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#中你不能这样做)。