【问题标题】:What are final inner classes?什么是最终内部类?
【发布时间】:2012-06-14 05:39:38
【问题描述】:

将非静态内部类声明为final是什么意思?

我也在 google 和 stackoverflow.com 上尝试了许多链接,但它们似乎都在处理内部类访问最终成员而不是最终内部类本身。 我在 google 上找到了 this 链接,但即使它也没有解释。

提前谢谢!

【问题讨论】:

  • 为什么你会认为它的含义与制作顶级类决赛有什么不同?
  • 好吧,因为内部类是一个类,但它也是外部类的成员。那么它是不可继承的还是会因为 final 而出现其他一些行为?
  • 决赛是决赛。它只意味着一件事:类不能扩展。
  • 非技术说明:回复 cmets 时应使用@whoever,否则收件人不会收到您的评论的通知。

标签: java inner-classes


【解决方案1】:

创建顶级类final 和创建内部类final 在语义上没有区别:它告诉编译器您不能从该类继承。标记类final 有时是为了让编译器跳过虚拟表查找,但这通常被认为是过早的微优化。

【讨论】:

    【解决方案2】:

    它与被声明为 final 的外部类具有相同的语义:该类不能扩展。

    考虑这个例子:

    public class MyClass {
      public class A {
      }
      public class B extends A {
      }
    }
    

    如果将 final 修饰符添加到 A 会产生编译错误。

    【讨论】:

    • 谢谢!另外我将如何从外部类外部扩展非最终内部类? TestClass extends MyOuter.MyInner??
    • TestClass 需要一个带有 MyOuter 的构造函数。然后调用 MyOuter 的超级方法。
    • @SurenderThakran 我认为这只有在您尝试扩展的内部类是静态的情况下才有可能。看到这个inheritance matrix
    【解决方案3】:

    好吧,在这种情况下,内部类与外部类没有任何不同。所以下面的代码是完全有效的。

    class Outer {
     int some_member;
    
     class Inner {
     void method();
     }
    }
    
    class OuterExtendsInner extends Outer.Inner{
    
    }
    

    众所周知,声明类 final 的目的是防止任何外部入侵者继承该类并利用其设施,就像我们在内部类中可以做的那样。

    【讨论】:

      猜你喜欢
      • 2013-06-09
      • 1970-01-01
      • 1970-01-01
      • 2012-03-20
      • 1970-01-01
      • 2011-04-24
      • 2017-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多