当前位置:  开发笔记 > 编程语言 > 正文

为什么你不能在Java中将类声明为静态?

如何解决《为什么你不能在Java中将类声明为静态?》经验,为你挑选了8个好方法。

为什么你不能在Java中将类声明为静态?



1> Colin Hebert..:

只有嵌套类可以是静态的.通过这样做,您可以使用嵌套类,而无需外部类的实例.

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内部类和静态嵌套类


你肯定是对的; 但我不知道这是如何回答这个问题的
这是真的,但是当你开始问自己什么是"静态类"时,你正在思考的问题通常会解决.在java中,静态元素意味着您可以在没有封闭类的实例的情况下访问/调用它; 如果将关键字应用于类本身,这可能意味着什么?你的意图是什么?你会期待什么?既然你已经知道它可能是什么,我很确定它将"不是真的有意义",或者它将是"遥不可及"(它会有意义,但它最终它只是一个选择已被制作).
尽管第一个短语并不准确,但仍为+1.正如教程所述,"非静态嵌套类称为内部类".(JLS:"内部类是一个未显式或隐式声明为静态的嵌套类.")
@Carlos Heuberger,你说得对,我更新了帖子.@Joeri Hendrickx,问题是,"为什么一个班级不能被宣布为静态......?",他们可以,[在这里阅读我的帖子].这是关于静态类的使用以及为什么它们必须是嵌套类的解释.

2> necromancer..:

顶级类默认是静态的.默认情况下,内部类是非静态的.您可以通过明确地将它们标记为静态来更改内部类的默认值.顶级类由于是顶级的,不能具有非静态语义,因为没有父类可以引用.因此,无法更改顶级类的默认值.


»默认情况下,顶级课程是静态的.«这是最好的答案.它们是静态的,因为您不需要任何任何实例来引用它们.它们可以从任何地方引用.它们位于*静态存储*中(如在C存储类中). - 正如其他人已经注意到的那样(Iain Elder对另一个答案的评论),语言设计者可以允许顶级类的`static`关键字表示并强制它可能只包含静态成员,而不是实例化; 然而,这可能会让人感到困惑,因为`static`对嵌套类有不同的含义.

3> Eric Jankows..:

所以,我来参加聚会,但这是我的两分钱 - 哲学上增加了科林赫伯特的回答.

在较高级别,您的问题处理对象和类型之间的差异.虽然有很多汽车(物体),但只有一种汽车类(类型).将某些内容声明为静态意味着您在"类型"空间中操作.只有一个.顶级类关键字已经在"类型"空间中定义了一个类型.结果"公共静态类汽车"是多余的.



4> Sergey Vakul..:

具有私有构造函数的类是静态的.

像这样声明你的类:

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();
...


如果有人想知道这里发生了什么,这与"静态类"的C#定义相匹配 - http://msdn.microsoft.com/en-us/library/79b3xss3%28v=vs.90%29.aspx .鉴于Java定义的"静态类",所有非内部类都是静态的(参见兄弟答案).
它不是静态的,但包含静态属性.如果你写公共final int ECodeOauthUnknown = 0x10; 它不再是静止的.

5> Michael Borg..:

当然可以,但只有内部嵌套类.在那里,这意味着嵌套类的实例不需要外部类的封闭实例.

但对于顶级课程,语言设计者无法想到对关键字有用的任何内容,因此不允许这样做.


尽管顶级类不能声明为"静态",但有时候能够有意义.例如,一个只包含静态辅助方法的类没有任何意义可以实例化,但Java语言并不能阻止你这样做.您可以通过声明默认构造函数`private`来使类不可实例化(实际上是'静态')到其他类,它禁止实例化,因为没有构造函数可见.

6> Peter Lawrey..:

您可以通过声明没有实例的枚举类型来创建实用程序类(不能创建实例).即你特别声明没有实例.

public enum MyUtilities {;
   public static void myMethod();
}


作为类型的枚举是特定的期望:它是枚举的项集.将它用作"实用程序类",当你可能只有一个带有私有构造函数的类时,在语义上是混乱的.
@VisionarySoftwareSolutions对我来说,这种特殊性说明没有这个类的实例,而不是间接地让它无法创建类的实例.

7> Andreas_D..:
public class Outer {
   public static class Inner {}
}

...它可以声明为static - 只要它是一个成员类.

来自JLS:

成员类可以是静态的,在这种情况下,它们无法访问周围类的实例变量; 或者他们可能是内部阶级(§8.1.3).

和这里:

static关键字可以在非内部类T的主体内修改成员类型C的声明.其效果是声明C不是内部类.正如T的静态方法在其体内没有T的当前实例一样,C也没有T的当前实例,也没有任何词法封闭实例.

静态关键字对于顶级类没有任何意义,只是因为顶级类没有封闭类型.



8> S.Jones..:

如上所述,除非Class是另一个Class的成员,否则Class不能是静态的.

如果您正在设计一个"不能有多个实例"的类,您可能需要查看"Singleton"设计模式.

初学者单身人士信息在这里.

警告:

如果您正在考虑使用单身模式,请尽力抵抗.它是最容易理解的DesignPatterns之一,可能是最受欢迎的,也是最受滥用的. (来源:上面链接的JavaRanch)

推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有