use*_*431 24 java static nested instantiation
从Oracle的Java 教程中我发现了这个文本:
与类方法和变量一样,静态嵌套类与其外部类相关联.和静态类方法一样,静态嵌套类不能直接引用其封闭类中定义的实例变量或方法 - 它只能通过对象引用来使用它们.
注意:静态嵌套类与其外部类(和其他类)的实例成员交互,就像任何其他顶级类一样.实际上,静态嵌套类在行为上是一个顶级类,它已嵌套在另一个顶级类中以方便打包.
使用封闭的类名访问静态嵌套类:
OuterClass.StaticNestedClass
例如,要为静态嵌套类创建对象,请使用以下语法:
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
我认为不可能实例化一个静态类,所以我并不真正理解粗体句子.
你知道这意味着什么吗?
Jas*_*n C 41
你不是混乱static与abstract作为kihero说,或者你是得过且过与具有一个类的概念static方法(这只是碰巧有静态方法的类).
静态嵌套类只是一个嵌套类,不需要其封闭类的实例.如果您熟悉C++,那么 C++中的所有类都是"静态"类.在Java中,默认情况下嵌套类不是静态的(这种非静态变体也称为"内部类"),这意味着它们需要一个外部类的实例,它们在隐藏字段的后台跟踪 - 但是这允许内部类引用其相关封闭类的字段.
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
}
}
Run Code Online (Sandbox Code Playgroud)
如何在静态方法中实例化非静态内部类的许多其他示例
我实际上默认声明所有嵌套类都是静态的,除非我特别需要访问封闭类的字段.
小智 16
静态嵌套类本身并不是静态的.在java中,没有类是静态的.静态嵌套类中的静态关键字意味着它是外部类的另一个静态成员.但这只是另一个原始阶层.这就是为什么我们可以实例化这个类
我猜你对静态类有一点误解。确实,每个抽象类和接口都无法实例化,但您可以实例化静态类。您应该注意的一件事是每个静态类都是嵌套静态类。你不能只创建一个静态类,如你所见: 尝试在 eclipse 中创建一个新类
静态类总是属于包含它的“父类”,静态类和非静态类之间的区别是:您可以像引用“父类”的静态属性一样引用子静态类:
ParentClass.NestedStaticClass nestedstatic = new ParentClass.NestedStaticClass();
Run Code Online (Sandbox Code Playgroud)
但只能通过实例化父类来引用非静态嵌套类,如下所示:
ParentClass parent = new ParentClass();
ParentClass.NestedClass nested = parent.new NestedClass();
Run Code Online (Sandbox Code Playgroud)
区别就像静态字段和非静态字段之间的区别一样。
| 归档时间: |
|
| 查看次数: |
24184 次 |
| 最近记录: |