Col*_*ert 471
只有嵌套类可以是静态的.通过这样做,您可以使用嵌套类,而无需外部类的实例.
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();
}
Run Code Online (Sandbox Code Playgroud)
资料来源:
在同一主题上:
nec*_*cer 37
顶级类默认是静态的.默认情况下,内部类是非静态的.您可以通过明确地将它们标记为静态来更改内部类的默认值.顶级类由于是顶级的,不能具有非静态语义,因为没有父类可以引用.因此,无法更改顶级类的默认值.
Eri*_*ski 33
所以,我来参加聚会,但这是我的两分钱 - 哲学上增加了科林赫伯特的回答.
在较高级别,您的问题处理对象和类型之间的差异.虽然有很多汽车(物体),但只有一种汽车类(类型).将某些内容声明为静态意味着您在"类型"空间中操作.只有一个.顶级类关键字已经在"类型"空间中定义了一个类型.结果"公共静态类汽车"是多余的.
Ser*_*nko 29
具有私有构造函数的类是静态的.
像这样声明你的类:
public class eOAuth {
private eOAuth(){}
public final static int ECodeOauthInvalidGrant = 0x1;
public final static int ECodeOauthUnknown = 0x10;
public static GetSomeStuff(){}
}
Run Code Online (Sandbox Code Playgroud)
你可以不用初始化使用:
if (value == eOAuth.ECodeOauthInvalidGrant)
eOAuth.GetSomeStuff();
...
Run Code Online (Sandbox Code Playgroud)
Mic*_*rdt 13
当然可以,但只有内部嵌套类.在那里,这意味着嵌套类的实例不需要外部类的封闭实例.
但对于顶级课程,语言设计者无法想到对关键字有用的任何内容,因此不允许这样做.
Pet*_*rey 12
您可以通过声明没有实例的枚举类型来创建实用程序类(不能创建实例).即你特别声明没有实例.
public enum MyUtilities {;
public static void myMethod();
}
Run Code Online (Sandbox Code Playgroud)
public class Outer {
public static class Inner {}
}
Run Code Online (Sandbox Code Playgroud)
...它可以声明为static - 只要它是一个成员类.
来自JLS:
成员类可以是静态的,在这种情况下,它们无法访问周围类的实例变量; 或者他们可能是内部阶级(§8.1.3).
和这里:
static关键字可以在非内部类T的主体内修改成员类型C的声明.其效果是声明C不是内部类.正如T的静态方法在其体内没有T的当前实例一样,C也没有T的当前实例,也没有任何词法封闭实例.
静态关键字对于顶级类没有任何意义,只是因为顶级类没有封闭类型.