2014-08-30 106 views
1

我已经阅读了关于静态嵌套类和内部类之间差异的文章。我的问题更多的是一个习惯性的Java。在Java中创建静态嵌套类的实例

我的要求是演示各种概念,如使用Java中的单一代码进行继承。一个单独的类文件,以便它可以研究自上而下和在沙箱像ideone运行验证 - 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

可以创建一个像上面这样的静态嵌套类的实例吗?

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

我应该如何引用和确认Java允许我创建静态类的对象的概念。

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

如果我没有创建一个静态B或C类的,那么我就可以不使用它们 公共静态无效的主要方法中,不得与主入口点执行程序 ,因此我被迫这样做。

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

+0

感谢您的回答。澄清我对这个概念的困惑。 – 2014-08-30 03:22:40

0

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

SOFieldAccessQuestion.B b = new SOFieldAccessQuestion.B(0); 
SOFieldAccessQuestion.C c = new SOFieldAccessQuestion.C(1); 
+0

谢谢。这是当我从SOFieldAccessQuestion以外的类中使用B和C时。我在SOFieldAccessQuestion主入口点内使用它们,因此只想将它们用作“B”和“C”。 – 2014-08-30 03:04:12

+0

这种事情很常见。例如,Map有一个类用于跟踪键和值对,称为Entry。您将该类命名为“Map.Entry”并创建该类。 – markspace 2014-08-30 03:05:56

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

这是行不通的,因为静态嵌套类不能访问包含类的私有成员。

相关问题