4

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

    }

}
4

5 回答 5

11

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

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

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

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

于 2013-05-13T14:33:03.603 回答
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,最好将其设为内部,因为一个包中的某些类可能希望具有同名的实用程序类。

于 2013-05-13T14:23:47.960 回答
0

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

于 2013-05-13T14:23:05.133 回答
0

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

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

否则,如果您考虑:

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

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

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

于 2013-05-13T14:25:21.723 回答
0

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

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

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

看这里的教程

于 2013-05-13T14:27:20.653 回答