在Java中创建静态嵌套类的实例

时间:2014-08-30 02:53:07

标签: java static-classes

我已阅读有关静态嵌套类和内部类之间差异的帖子。我的问题更多的是一个惯用的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内使用它们,并且可能无法使用主入口点执行程序,因此我不得不这样做。

3 个答案:

答案 0 :(得分:3)

  

是否可以像上面那样创建一个静态嵌套类的实例?

是的,确实如此。例如,查看java.util.Collections中的各种嵌套类。

  

我应该如何参考和承认Java允许我这样做的概念   创建静态类的对象。

static中的class类称为嵌套类。包含的概念称为member class,它(或多或少)与类的任何其他成员一样。作为static成员,嵌套类属于包含类,而不属于其实例。

  

如果我不创建B或C的静态类,那么我就不能使用它们   在public static void main方法中,可能无法执行程序   有一个主要入口点,因此我被迫这样做。

您仍然可以在SOFieldAccessQuestion之外但在同一.java文件中声明您的课程。他们不能public

答案 1 :(得分:0)

啊,我错过了CTOR。这是正确的CTOR:

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
  }
}

它不起作用,因为静态嵌套类无法访问包含类的私有成员。