代码之家  ›  专栏  ›  技术社区  ›  eddyP23

java中扩展抽象外部类的静态内部类[重复]

  •  -2
  • eddyP23  · 技术社区  · 7 年前

    我今天看到了这种模式,这让我很困惑:

    abstract class A {
        // does something
    
        static class B extends A {
            // does something as well
        }
    }
    

    我发现了两件奇怪的事:

    • 静态类可以使用初始化 new A.B() .
    • 静态类在应用程序中不是唯一的(因此,不是真正静态的),因为每次初始化都会创建一个新对象。

    我仍然不明白为什么要使用这种模式?确实如此 static class 在这种情况下,意味着您可以静态访问其构造函数,而无需创建 A ,但它在应用程序中是否真的是独一无二的?

    编辑:

    好的,我认为我对静态类的理解来自C。我现在已经清楚java类的静态性了。但是 (其中内部静态类扩展了外部抽象类) 为什么

    1 回复  |  直到 7 年前
        1
  •  1
  •   Marcos Vasconcelos    7 年前

    静态类没有访问外部类方法和变量的权限,它们在某种程度上意味着它是一个分离的类。

    class Out {
         int i; void x(){}
         static class In() {
           i++; x(); // not valid instructions
         }
         class In2() {
           i++; x(); // valid instructions
         }
    }
    

    要实例化静态内部类,只需创建其对象:

      Out.In obj = new Out.In();
    

    非静态需要外部类的实例来实例化:

      Out o = new Out();
      Out.In2 obj = new o.In2();
    

    (如果将In2从内到外实例化,这是隐式的)