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

Java 为什么以及何时使用静态内部类或实例内部类?,java,Java,我一直在研究java中的静态内部类。但我不清楚使用静态内部类或内部类有什么意义 class A{ static class B{ } public static void main(String[] args) { B b=new B(); } } 或 结果是一样的,但如果B是a使用的一个小类,那么将其放入a中就更有意义了。有技术上的区别: class A { private static int x = 42; //the

我一直在研究java中的静态内部类。但我不清楚使用静态内部类或内部类有什么意义

class A{

    static class B{

    }

    public static void main(String[] args) {

        B b=new B();

    }

}


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

有技术上的区别:

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

}

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

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

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

否则,如果您考虑:

  • 嵌套(也称为静态内部)类的行为不被外部类认为是可重用的,因为可能太具体了
  • 一个类的一些相关字段是如此的相关,以至于您希望 一个班级正在包装它们。这将使您的代码更容易理解和更清晰
然后选择创建一个静态类


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

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

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

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


请参见教程

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

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

当您只想将内部类与封闭类相关联而不需要拖动它时,静态内部类是很好的


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

欢迎使用堆栈溢出!为了让网站尽可能有用,我们尽量避免同一个问题被多次发布。下次您有问题时,如果您搜索Stack Overflow以确保其他人没有问过同样的问题,我们将不胜感激。此外,如果您还没有阅读FAQ,您应该会发现FAQ很有用:谢谢您的评论。
class A {
    private static int x = 42;  //the answer
    public static class B {
        int showX() {
            return x; // only static class can it
        }
    } 

}