Java中静态类背后的概念

时间:2012-11-04 20:25:11

标签: java static static-classes

考虑以下代码

class A {
    static class B{
        int a = 0;
    }
    public static void main(String argc[]) {
        B var1 = new B();
        B var2 = new B();
        var1.a = 5;
        var2.a = 6;
        System.out.println(var1.a+" and "+var2.a);
    }
}

输出5和6。 静态成员只加载一次。但是输出与该语句相矛盾。所以静态类的概念肯定与静态数据成员不同。那么静态类的静态意味着什么

3 个答案:

答案 0 :(得分:10)

来自oracle的复制粘贴:

静态嵌套类

与类方法和变量一样,静态嵌套类与其外部类相关联。和静态类方法一样,静态嵌套类不能直接引用其封闭类中定义的实例变量或方法 - 它只能通过对象引用来使用它们。

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

OuterClass.StaticNestedClass

例如,要为静态嵌套类创建对象,请使用以下语法:

OuterClass.StaticNestedClass nestedObject =
     new OuterClass.StaticNestedClass();

一个例子:

LinkedList.Entry或Map.Entry不需要是顶级类,因为它仅由LinkedList aka Map使用。而且由于它们不需要访问外部类成员,因此它是静态的 - 它是一种更清晰的方法。

答案 1 :(得分:3)

你误解了这个概念。 B是一个具有int a属性的静态类。在您的代码中,您创建了B类的两个实例,每个实例都有自己的a属性,其值分别为5和6。不要将静态类与类的静态属性/方法混淆。

如果您将static修饰符添加到a类的B属性,则可以完成您尝试获取的行为。否则,你的代码是这样的:

class B{
    int a = 0;
}

class A {
    public static void main(String argc[]) {
        B var1 = new B();
        B var2 = new B();
        var1.a = 5;
        var2.a = 6;
        System.out.println(var1.a+" and "+var2.a);
    }
}

答案 2 :(得分:3)

静态,在类的情况下,意味着它们与外部类的实例无关:

class A{
  class B{
    ...
  }
}
...
new A.B(); //error

无效。因为B不是静态的,所以它保存对A实例的隐式引用。这意味着如果没有A的实例,则无法创建B的实例。

class A{
  static class B{
    ...
  }
}
...
new A.B();

完全有效。由于B是静态的,因此它不包含对A的引用,并且可以在没有A存在的实例的情况下创建。

静态类是一个不包含对其封闭类的隐式引用的类。 静态类的行为就像普通类,但其名称空间位于另一个类中。

非静态内部类包含对其封闭类的隐式引用。封闭类的变量可以直接访问内部类的实例。外部类的单个实例可以具有其内部类的多个实例。