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

时间:2013-05-13 14:20:58

标签: java

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

    }

}

5 个答案:

答案 0 :(得分:3)

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

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

当你只想将内部类与封闭类相关联而不是为了骑行而拖动它时,静态内部类很好。

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

答案 1 :(得分: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使用,那么将其设置为内部是很好的,因为一个包中的某些类可能希望具有相同名称的实用程序类。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

当您的内部类被视为“对象”的一部分时,请使用内部类。 实际上,您可以从包装类访问private,package,protected和public字段。

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

否则,如果您考虑:

  • 您的嵌套(也称为静态内部)类的行为不被外部类视为可重用,因为可能过于具体。
  • 一个类的一些相关领域,因为你想要做的很多相关 包装它们的类。这将使您的代码更易于理解和清晰。

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

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

答案 4 :(得分:0)

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

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

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

请参阅教程here