考虑以下代码
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。 静态成员只加载一次。但是输出与该语句相矛盾。所以静态类的概念肯定与静态数据成员不同。那么静态类的静态意味着什么
答案 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存在的实例的情况下创建。
静态类是一个不包含对其封闭类的隐式引用的类。 静态类的行为就像普通类,但其名称空间位于另一个类中。
非静态内部类包含对其封闭类的隐式引用。封闭类的变量可以直接访问内部类的实例。外部类的单个实例可以具有其内部类的多个实例。