我已阅读有关静态嵌套类和内部类之间差异的帖子。我的问题更多的是一个惯用的java。
我的要求是使用Java中的单段代码演示各种概念,例如继承。一个单独的类文件,因此可以通过像沙龙一样在沙箱中运行来自上而下进行验证 - http://ideone.com/jsHePB
class SOFieldAccessQuestion {
static class B {
int vf;
static int sf;
B(int i) {
vf = i;
sf = i + 1;
}
}
static class C extends B {
int vf;
static int sf;
C(int i) {
super(i+20);
vf = i;
sf = i + 2;
}
}
public static void main(String[] args) {
// Is it Okay to create an instance of static nested class?
C c1 = new C(100);
B b1 = c1;
System.out.println("B.sf = " + B.sf + ", b1.sf = " + b1.sf);
System.out.println("C.sf = " + C.sf + ", c1.sf = " + c1.sf);
System.out.println("b1.vf = " + b1.vf);
System.out.println("c1.vf = " + c1.vf);
}
}
我的问题是,是否可以像上面那样创建一个静态嵌套类的实例?我担心我在这里忽略了“静态”的含义。我应该如何引用和承认Java允许我创建静态类对象的概念。
如果我不创建B或C的静态类,那么我不能在public static void main method
内使用它们,并且可能无法使用主入口点执行程序,因此我不得不这样做。
答案 0 :(得分:3)
是否可以像上面那样创建一个静态嵌套类的实例?
是的,确实如此。例如,查看java.util.Collections
中的各种嵌套类。
我应该如何参考和承认Java允许我这样做的概念 创建静态类的对象。
static
中的class
类称为嵌套类。包含的概念称为member class,它(或多或少)与类的任何其他成员一样。作为static
成员,嵌套类属于包含类,而不属于其实例。
如果我不创建B或C的静态类,那么我就不能使用它们 在public static void main方法中,可能无法执行程序 有一个主要入口点,因此我被迫这样做。
您仍然可以在SOFieldAccessQuestion
之外但在同一.java
文件中声明您的课程。他们不能public
。
答案 1 :(得分:0)
SOFieldAccessQuestion.B b = new SOFieldAccessQuestion.B( 0 );
SOFieldAccessQuestion.C c = new SOFieldAccessQuestion.C( 1 );
答案 2 :(得分:0)
是的,没关系。
来自:http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
与类方法和变量一样,静态嵌套类与其外部类相关联。和静态类方法一样,静态嵌套类不能直接引用其封闭类中定义的实例变量或方法:它只能通过对象引用来使用它们。 注意:静态嵌套类与其外部类(和其他类)的实例成员交互,就像任何其他顶级类一样。实际上,静态嵌套类在行为上是一个顶级类,它已嵌套在另一个顶级类中以方便打包。
使用封闭的类名访问静态嵌套类:
OuterClass.StaticNestedClass
例如,要为静态嵌套类创建对象,请使用以下语法:
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
这意味着class
在相对于包含类的static
上下文中声明。如果你有一个类声明如下:
class Container {
private int x;
public static class Inner {
private int y = x; // Invalid, member not in scope
}
}
它不起作用,因为静态嵌套类无法访问包含类的私有成员。