【问题标题】:Why and when to use static inner class or instance inner class? [duplicate]为什么以及何时使用静态内部类或实例内部类? [复制]
【发布时间】:2013-05-07 14:58:30
【问题描述】:

我一直在研究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();

    }

}

【问题讨论】:

  • 欢迎来到 Stack Overflow!为了使网站尽可能有用,我们尽量避免多次发布相同的问题。下次您有问题时,如果您搜索 Stack Overflow 以确保其他人还没有问过同样的问题,我们将不胜感激 =) 此外,如果您还没有阅读常见问题解答,您应该会发现它很有帮助: stackoverflow.com/faq

标签: java


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    技术上有区别:

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

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

    【讨论】:

      【解决方案3】:

      当您的内部类被视为“对象”的一部分时,请使用内部类。 实际上,您将能够从您的包装类访问私有、包、保护和公共字段。

      “缺点”是:如果没有实例化包装类,内部类就不能存在,这在逻辑上是由于第一句话。

      否则,如果您考虑:

      • 嵌套(也称为静态内部)类的行为不被外部类视为可重用,因为可能过于具体。
      • 一个类的某些相关字段与您想要创建的相关性如此之高 一个包装它们的类。这将使您的代码更易于理解和更清晰。

      然后选择制作一个静态类。

      此外,由于static(意味着在任何对象的生命周期之外),嵌套类可以在不考虑其包装类/对象的情况下进行实例化。

      【讨论】:

        【解决方案4】:

        通过使嵌套类可以是静态的,您可以使用嵌套类而不需要外部类的实例。

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

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

        见教程here

        【讨论】:

          【解决方案5】:

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

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

          当您只想将内部类与封闭类相关联而不是将其拖到一起时,静态内部类是很好的。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-06-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-02-16
            相关资源
            最近更新 更多