7

考虑以下代码

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。静态成员只加载一次。但输出与该语句相矛盾。所以静态类的概念肯定与静态数据成员不同。那么静态类的情况是什么意思

4

3 回答 3

11

来自oracle的复制粘贴:

静态嵌套类

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

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

OuterClass.StaticNestedClass

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

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

一个例子:

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

于 2012-11-04T20:29:03.437 回答
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);
    }
}
于 2012-11-04T20:28:15.490 回答
3

对于类,静态意味着它们与其外部类的实例无关:

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

是无效的。因为 B 不是静态的,所以它包含对 A 实例的隐式引用。这意味着您不能在没有 A 实例的情况下创建 B 实例。

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

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

静态类是一个不包含对其封闭类的隐式引用的类。静态类的行为就像一个普通类,只是它的命名空间在另一个类中。

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

于 2012-11-04T20:44:51.223 回答