Java:静态vs内部类[重复]

问题

这个问题在这里已有答案:

  • Java内部类和静态嵌套类23答案

静态和非静态内部类有什么区别?


#1 热门回答(494 赞)

内部类by definition不能是静态的,所以我要重新提出你的问题:"静态和非静态嵌套类之间的区别是什么?"

非静态嵌套类具有对其嵌套的类的成员的完全访问权。静态嵌套类没有对嵌套实例的引用,因此静态嵌套类不能调用非静态方法或访问嵌套实例的类的实例的非静态字段。


#2 热门回答(112 赞)

让我们看一下这些问题的智慧之源:Joshua Bloch的Effective Java

从技术上讲,没有静态的内部类。根据Effective Java,正确的术语是a静态嵌套类.非静态嵌套类确实是内部类,以及匿名类和本地类。

现在引用:

非静态[嵌套]类的每个实例都与其包含类的封闭实例隐式关联...可以在封闭实例上调用方法。

静态嵌套类无权访问封闭实例。它也占用更少的空间。


#3 热门回答(53 赞)

静态内部类和非静态内部类之间存在两个差异。

  • 在声明成员字段和方法的情况下,非静态内部类不能具有静态字段和方法。但是,在静态内部类的情况下,可以有静态和非静态字段和方法。
  • 非静态内部类的实例是使用外部类的对象的引用创建的,在其中定义了它,这意味着它具有封闭实例。但是静态内部类的实例是在没有外部类引用的情况下创建的,这意味着它没有封闭实例。

看这个例子

class A
{
    class B
    {
        // static int x; not allowed here
    }

    static class C
    {
        static int x; // allowed here
    }
}

class Test
{
    public static void main(String… str)
    {
        A a = new A();

        // Non-Static Inner Class
        // Requires enclosing instance
        A.B obj1 = a.new B(); 

        // Static Inner Class
        // No need for reference of object to the outer class
        A.C obj2 = new A.C(); 
    }
}