静态嵌套类可以在Java中实例化吗?

静态嵌套类可以在Java中实例化吗?,java,static,nested,instantiation,Java,Static,Nested,Instantiation,从Oracle的Java中,我发现了以下文本: 与类方法和变量一样,静态嵌套类与其外部类相关联。和静态类方法一样,静态嵌套类不能直接引用在其封闭类中定义的实例变量或方法-它只能通过对象引用来使用它们 注意:静态嵌套类与其外部类(和其他类)的实例成员进行交互,就像任何其他顶级类一样。实际上,静态嵌套类在行为上是一个顶级类,为了便于打包而嵌套在另一个顶级类中 使用封闭类名访问静态嵌套类: OuterClass.StaticNestedClass 例如,要为静态嵌套类创建对象,请使用以下语法: Out

从Oracle的Java中,我发现了以下文本:

与类方法和变量一样,静态嵌套类与其外部类相关联。和静态类方法一样,静态嵌套类不能直接引用在其封闭类中定义的实例变量或方法-它只能通过对象引用来使用它们

注意:静态嵌套类与其外部类(和其他类)的实例成员进行交互,就像任何其他顶级类一样。实际上,静态嵌套类在行为上是一个顶级类,为了便于打包而嵌套在另一个顶级类中

使用封闭类名访问静态嵌套类:

OuterClass.StaticNestedClass

例如,要为静态嵌套类创建对象,请使用以下语法:

OuterClass.StaticNestedClass嵌套对象= 新的OuterClass.StaticNestedClass()

我认为不可能实例化一个静态类,所以我不太理解粗体的句子


你知道它是什么意思吗?

你把
静态的
抽象的
混淆了。无法实例化抽象类
static
不是顶级类的有效限定符,但内部类的含义是您引用的。

您要么像kihero所说的那样将
static
abstract
混淆,要么将概念与具有
static
方法的类混淆(这只是一个碰巧有静态方法的类)

静态嵌套类只是嵌套类,不需要其封闭类的实例。如果您熟悉C++,C++中的所有类都是“静态”类。在爪哇中,嵌套类在默认情况下不是静态的(非静态变体也称为“内部类”)。,这意味着它们需要外部类的一个实例,它们在隐藏字段中跟踪外部类,但这允许内部类引用其关联封闭类的字段

public class Outer {

    public class Inner { }

    public static class StaticNested { }

    public void method () {
        // non-static methods can instantiate static and non-static nested classes
        Inner i = new Inner(); // 'this' is the implied enclosing instance
        StaticNested s = new StaticNested();
    }

    public static void staticMethod () {
        Inner i = new Inner(); // <-- ERROR! there's no enclosing instance, so cant do this
        StaticNested s = new StaticNested(); // ok: no enclosing instance needed

        // but we can create an Inner if we have an Outer: 
        Outer o = new Outer();
        Inner oi = o.new Inner(); // ok: 'o' is the enclosing instance
    }

}
公共类外部{
公共类内部{}
公共静态类StaticNested{}
公共作废法(){
//非静态方法可以实例化静态和非静态嵌套类
Inner i=new Inner();/“this”是隐含的封闭实例
staticnesteds=新的StaticNested();
}
公共静态void staticMethod(){

内部i=新内部();//静态嵌套类本身根本不是静态的。在java中,没有任何类是静态的。静态嵌套类中的Static关键字意味着它是外部类的另一个静态成员。但它只是另一个原始类。这就是为什么我们可以实例化这个类的原因。

我想你对静态类有点误解了。 的确,每个抽象类和接口都不能实例化,但您可以实例化一个静态类。 您应该注意的一点是,每个静态类都是嵌套的静态类。 您不能只创建静态类,如您所见:

静态类始终属于包围它的“父类”,静态类和非静态类之间的区别是: 您可以像“父类”的静态属性一样引用子静态类:

但您只能通过实例化父类来引用非静态嵌套类,如下所示:

ParentClass parent = new ParentClass();
ParentClass.NestedClass nested = parent.new NestedClass();

区别就像静态和非静态字段之间的区别一样。

是的,这是可能的。您可能会想到一个非静态的内部类,在这种情况下,您只能通过已创建的外部类实例来实例化它。此外,如果您熟悉C#,则无法用该语言实例化静态类。此状态Mint澄清了这一点:“实际上,静态嵌套类在行为上是一个顶级类,为了便于打包,它嵌套在另一个顶级类中。”我的问题不是在tomcat中重新加载应用程序!它需要用更新的内部类作为静态类重新加载类文件。不足以仅替换服务器文件-必须重新加载应用程序:)他可能还混淆了静态方法和静态类。谢谢,这回答了我的问题!只是为了澄清术语。Java有嵌套类-静态类和非静态类。非静态嵌套类称为内部类。没有什么比静态内部类更好。@Swapnil感谢您抓住了这个问题。“静态嵌套类”,正式用于
static
变体。@JasonC是否有任何方法可以从反射实例化私有嵌套内部类,我需要在我的一个单元测试中实现它。噢,哇,那
o.new internal()
pattern从未出现在我的脑海中。我永远不会认为这是一个有效的表达式。太远了,伙计。对不起,这个答案太令人困惑了。很好的答案!这是到目前为止唯一真正回答这个问题的答案。嵌套的静态类就像父类的静态属性。所有的静态属性都可以通过h类名称。如Someclass.someStaticProperty或Someclass.someStaticMethod。这里我们不使用新关键字从父类访问静态属性或静态方法。那么为什么需要在这里使用新关键字。“ParentClass.NestedStaticClass nestedstatic=new ParentClass.NestedStaticClass()”
ParentClass parent = new ParentClass();
ParentClass.NestedClass nested = parent.new NestedClass();