Java中静态类的概念

9
考虑以下代码:
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
不要将静态类与类的实例混淆。类B只有一个,但您可以拥有无限数量的B实例。 - Hovercraft Full Of Eels
3个回答

11

以下是从oracle复制粘贴的内容:

静态嵌套类

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

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

OuterClass.StaticNestedClass
例如,要创建一个静态嵌套类的对象,请使用以下语法:
OuterClass.StaticNestedClass nestedObject =
     new OuterClass.StaticNestedClass();

一个例子:

LinkedList.Entry或Map.Entry没有必要成为顶级类,因为它们仅由LinkedList和Map使用。并且由于它们不需要访问外部类成员,因此将其设置为静态的是有意义的 - 这是一种更清晰的方法。


你能否添加一个静态嵌套类有用的示例? - Kirill Kulakov
2
@KirillKulakov Map.Entry<K,v> 是一个很好的例子。 - Luiggi Mendoza
个人在实现构建器模式时使用它们,可以查看Joshua Bloch的《Effective Java》一书。 - Frank

3
你误解了这个概念。B 是一个静态类,有一个 int a 属性。在你的代码中,你创建了两个 B 类的实例,每个实例都有自己的 a 属性,并且分别设置为 5 和 6。不要混淆静态类和类的静态属性/方法。
如果你在 B 类的 a 属性上添加 static 修饰符,就可以实现你想要的行为。否则,你的代码就像这样:
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);
    }
}

1
据我所知,这回答了问题。B是一个静态类,但其行为不像一个static属性。 - Luiggi Mendoza
1
问题是“什么是静态类”,而不是“如何实现预期输出”。 - John Dvorak
1
一个回答“在静态类的情况下,静态是什么意思”的问题,怎么可能以“你错了”开头呢? - Dan Rosenstark
2
@JanDvorak也许这不是一个直接的答案,但解释了OP关于静态类与静态属性的误解。 - Luiggi Mendoza
1
@Yar 好的,已经修改了回答的开头。而且,这应该是一个回答,而不是一个评论。顺便说一下,我认为我的回答和评论并没有冒犯任何人,但如果我有任何不当之处,请及时指出以便我纠正 :)。 - Luiggi Mendoza
显示剩余9条评论

3

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

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

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

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

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

静态类是一种不隐式持有其封装类引用的类。 静态类的行为就像普通类,只是其命名空间在另一个类中。

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


变得更加清晰了!谢谢回答。所以这只是一种打包类的方式。 - Jinu Joseph Daniel
1
@downvoter。至少解释一下为什么要踩(这真的很气人,就像扔石头藏手一样)。你的回答澄清了Frank所解释的内容,加上一个例子会更好。 - Luiggi Mendoza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接