静态嵌套类可以在Java中实例化吗?
从Oracle的Java中,我发现了以下文本: 与类方法和变量一样,静态嵌套类与其外部类相关联。和静态类方法一样,静态嵌套类不能直接引用在其封闭类中定义的实例变量或方法-它只能通过对象引用来使用它们 注意:静态嵌套类与其外部类(和其他类)的实例成员进行交互,就像任何其他顶级类一样。实际上,静态嵌套类在行为上是一个顶级类,为了便于打包而嵌套在另一个顶级类中 使用封闭类名访问静态嵌套类: OuterClass.StaticNestedClass 例如,要为静态嵌套类创建对象,请使用以下语法: OuterClass.StaticNestedClass嵌套对象= 新的OuterClass.StaticNestedClass()强> 我认为不可能实例化一个静态类,所以我不太理解粗体的句子静态嵌套类可以在Java中实例化吗?,java,static,nested,instantiation,Java,Static,Nested,Instantiation,从Oracle的Java中,我发现了以下文本: 与类方法和变量一样,静态嵌套类与其外部类相关联。和静态类方法一样,静态嵌套类不能直接引用在其封闭类中定义的实例变量或方法-它只能通过对象引用来使用它们 注意:静态嵌套类与其外部类(和其他类)的实例成员进行交互,就像任何其他顶级类一样。实际上,静态嵌套类在行为上是一个顶级类,为了便于打包而嵌套在另一个顶级类中 使用封闭类名访问静态嵌套类: OuterClass.StaticNestedClass 例如,要为静态嵌套类创建对象,请使用以下语法: Out
你知道它是什么意思吗?你把
静态的和抽象的混淆了。无法实例化抽象类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();