为什么以及何时使用静态内部类或实例内部类



我一直在学习java中的静态内部类。但是我不清楚使用静态内部类或内部类的意义。

class A{
    static class B{
    }
    public static void main(String[] args) {
        B b=new B();
    }
}

class B{}
class A{
    public static void main(String[] args) {
        B b=new B();
    }
}

非静态内部类具有对其封闭类的自动引用。静态内部类与它的封闭类的惟一关系是,你必须通过封闭类的名称来引用它:EnclosingClass.StaticInnerClass .

当你想从父类中引用一些数据时,非静态内部类是很好的。

当您只想将内部类与外围类关联起来,而不想拖拽它时,静态内部类是很好的选择。

换句话说,非静态内部类可以防止封闭类被垃圾收集,因为它有那个引用,而静态内部类永远不会这样做。

有技术差异:

class A {
    private static int x = 42;  //the answer
    public static class B {
        int showX() {
            return x; // only static class can it
        }
    } 
}

但这不是重点。如果类B仅由类A使用,则最好将其设置为内部,因为一个包中的某些类可能希望具有相同名称的实用程序类。

当你的内部类被认为是"对象"的一部分时,使用内部类。实际上,你可以从包装类中访问private、package、protected和public字段。

"缺点"是:一个内部类如果没有包装类的实例化就不可能存在,这在逻辑上是由第一句话引起的。

否则,如果考虑:

  • 你的嵌套(也称为静态内部)类的行为不被外部类认为是可重用的,因为可能太具体了。
  • 一个类的一些相关字段,因为它们非常相关,所以您想要创建包装它们的类。这将使你的代码更容易理解和干净。

然后选择创建一个静态类。

此外,由于static(意思是在任何对象的生命周期之外),嵌套类可以实例化而不考虑其包装类/对象。

结果是一样的,但是如果B是a使用的一个小类,那么将它放在a中更有意义。

通过使嵌套类可以是静态的,您可以在没有外部类实例的情况下使用嵌套类。

嵌套类是其外围类的成员。非静态嵌套类(内部类)可以访问封闭类的其他成员,即使它们被声明为私有。静态嵌套类不能访问封闭类的其他成员。…

注意:静态嵌套类与其外部类(和其他类)的实例成员进行交互,就像任何其他顶级类一样。实际上,静态嵌套类在行为上是一个顶级类,为了便于打包,它被嵌套在另一个顶级类中。

查看教程

最新更新