为什么你不能在Java中将类声明为静态?
只有嵌套类可以是静态的.通过这样做,您可以使用嵌套类,而无需外部类的实例.
class OuterClass{ public static class StaticNestedClass{ } public class InnerClass{ } public InnerClass getAnInnerClass(){ return new InnerClass(); } //This method doesn't work public static InnerClass getAnInnerClassStatically(){ return new InnerClass(); } } class OtherClass{ //Use of a static nested class: private OuterClass.StaticNestedClass staticNestedClass = new OuterClass.StaticNestedClass(); //Doesn't work private OuterClass.InnerClass innerClass = new OuterClass.InnerClass(); //Use of an inner class: private OuterClass outerclass= new OuterClass(); private OuterClass.InnerClass innerClass2 = outerclass.getAnInnerClass(); private OuterClass.InnerClass innerClass3 = outerclass.new InnerClass(); }
资料来源:
有关嵌套类的Oracle教程
在同一主题上:
Java:静态与非静态内部类
Java内部类和静态嵌套类
顶级类默认是静态的.默认情况下,内部类是非静态的.您可以通过明确地将它们标记为静态来更改内部类的默认值.顶级类由于是顶级的,不能具有非静态语义,因为没有父类可以引用.因此,无法更改顶级类的默认值.
所以,我来参加聚会,但这是我的两分钱 - 哲学上增加了科林赫伯特的回答.
在较高级别,您的问题处理对象和类型之间的差异.虽然有很多汽车(物体),但只有一种汽车类(类型).将某些内容声明为静态意味着您在"类型"空间中操作.只有一个.顶级类关键字已经在"类型"空间中定义了一个类型.结果"公共静态类汽车"是多余的.
具有私有构造函数的类是静态的.
像这样声明你的类:
public class eOAuth { private eOAuth(){} public final static int ECodeOauthInvalidGrant = 0x1; public final static int ECodeOauthUnknown = 0x10; public static GetSomeStuff(){} }
你可以不用初始化使用:
if (value == eOAuth.ECodeOauthInvalidGrant) eOAuth.GetSomeStuff(); ...
当然可以,但只有内部嵌套类.在那里,这意味着嵌套类的实例不需要外部类的封闭实例.
但对于顶级课程,语言设计者无法想到对关键字有用的任何内容,因此不允许这样做.
您可以通过声明没有实例的枚举类型来创建实用程序类(不能创建实例).即你特别声明没有实例.
public enum MyUtilities {; public static void myMethod(); }
public class Outer { public static class Inner {} }
...它可以声明为static - 只要它是一个成员类.
来自JLS:
成员类可以是静态的,在这种情况下,它们无法访问周围类的实例变量; 或者他们可能是内部阶级(§8.1.3).
和这里:
static关键字可以在非内部类T的主体内修改成员类型C的声明.其效果是声明C不是内部类.正如T的静态方法在其体内没有T的当前实例一样,C也没有T的当前实例,也没有任何词法封闭实例.
静态关键字对于顶级类没有任何意义,只是因为顶级类没有封闭类型.
如上所述,除非Class是另一个Class的成员,否则Class不能是静态的.
如果您正在设计一个"不能有多个实例"的类,您可能需要查看"Singleton"设计模式.
初学者单身人士信息在这里.
警告:
如果您正在考虑使用单身模式,请尽力抵抗.它是最容易理解的DesignPatterns之一,可能是最受欢迎的,也是最受滥用的. (来源:上面链接的JavaRanch)