Java:静态vs内部类

时间:2009-08-30 07:12:22

标签: java static inner-classes

静态和非静态嵌套类有什么区别?

8 个答案:

答案 0 :(得分:535)

内部类by definition不能是静态的,所以我要将你的问题改写为“静态和非静态嵌套类之间有什么区别?”

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

答案 1 :(得分:124)

让我们看看这些问题的智慧之源: Joshua Bloch的有效Java

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

现在引用:

  

非静态嵌套类的每个实例都是隐式关联的   使用其包含类的封闭实例 ...这是可能的   调用封闭实例上的方法。

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

答案 2 :(得分:63)

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

  1. 如果声明成员字段和方法,则为非静态 内部类不能有静态字段和方法。 但是,在静态内部类的情况下,可以有静态和非静态字段 和方法。

  2. 使用引用创建非静态内部类的实例 外部类的对象,它所定义的,这意味着它具有 封闭实例。但静态内部类的实例是 在没有外类引用的情况下创建,这意味着它 没有封闭的实例。

  3. 参见此示例

    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(); 
        }
    }
    

答案 3 :(得分:12)

  1. 静态内部类无法访问封闭类的非静态成员。它可以直接访问封闭类的静态成员(实例字段和方法),就像获取值的程序样式一样,而不创建对象。

  2. 静态内部类可以声明静态和非静态成员。静态方法可以访问主类的静态成员。但是,它无法访问非静态内部类成员。要访问非静态内部类的成员,必须创建非静态内部类的对象。

  3. 非静态内部类不能声明静态字段和静态方法。它必须以静态或顶级类型声明。这样做会出现这样的错误:“静态字段只能在静态或顶级类型中声明”。

  4. 非静态内部类可以以获取值的过程风格访问封闭类的静态和非静态成员,但是它不能访问静态内部类的成员。

  5. 封闭类在创建内部类的对象之前无法访问内部类的成员。 IF主类在访问非静态类的成员时,可以创建非静态内部类的对象。

  6. 如果主类在访问静态内部类的成员时有两种情况:

    • 案例1:对于静态成员,它可以使用静态内部类的类名称
    • 案例2:对于非静态成员,它可以创建静态内部类的实例。

答案 4 :(得分:10)

讨论嵌套类......

不同之处在于,静态的嵌套类声明可以在封闭类之外实例化。

如果您有一个非静态的嵌套类声明,Java将不允许您通过封闭类实例化它。从内部类创建的对象链接到从外部类创建的对象,因此内部类可以引用外部类的字段。

但是如果它是 static ,那么链接就不存在了,外部字段不能被访问(除了通过像任何其他对象那样的普通引用),因此你可以自己实例化嵌套类。

答案 5 :(得分:3)

静态内部类:可以声明静态&非静态成员,但只能访问其父类的静态成员。

非静态内部类:只能声明非静态成员,但可以访问其父类的静态和非静态成员。

答案 6 :(得分:3)

内部类不能是静态的,所以我要将你的问题改写为“静态和非静态嵌套类之间有什么区别?”。

正如你所说的内部类不能是静态的...我发现下面的代码是静态的....原因?或哪个是正确的....

是的,静态嵌套类型的语义中没有任何内容可以阻止您这样做。这个片段运行正常。

    public class MultipleInner {
        static class Inner {
        }   
    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            new Inner();
        }
    }
}

这是本网站发布的代码......

问题---&gt;静态嵌套类可以多次实例化吗?

答案是---&gt;

现在,嵌套类型当然可以执行自己的实例控制(例如私有构造函数,单例模式等),但这与嵌套类型无关。另外,如果嵌套类型是静态枚举,当然你根本无法实例化它。

但总的来说,是的,静态嵌套类型可以多次实例化。

请注意,从技术上讲,静态嵌套类型不是“内部”类型。

答案 7 :(得分:2)

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