静态和非静态字段

时间:2013-09-30 15:45:38

标签: java

只是为了澄清我正在考虑这个权利,在java中,静态字段是整个类使用的变量/字段,还是可以被引用该类的所有对象使用?非静态字段是由对象定义的变量?引用与对象1相同的类的第二个对象可以与对象1的静态字段具有不同的值?

6 个答案:

答案 0 :(得分:3)

在创建该类的实例之前,可以访问类中的静态字段或静态类变量,这与实例变量不同。在运行时创建该类的实例时,将创建类中的实例变量(非静态变量)。因此,在创建该类的实例之前,无法访问非静态变量。然而,在创建或实例化类之前,可以访问静态类成员

该类的所有实例都可以访问相同的静态变量。另一方面,实例变量是单独/封装到类的每个实例。

答案 1 :(得分:1)

  • 所有对象共享和使用的静态字段,并在加载类时加载
  • 非静态字段是每个对象的单独副本,并在创建对象时加载
  

非静态字段是由对象定义的变量吗?

每当你创建一个新对象时,每个对象都有自己的实例副本,即非静态字段

  

引用与对象1相同的类的第二个对象可以与对象1的静态字段具有不同的值?

没有真正得到你的问题,但是

  • 如果object1和object2是一个类的instnaces,那么如果object1修改了类的静态字段,那么object2将获得更新的值

答案 2 :(得分:1)

实例属性是特定于实例的属性,并且其值不会在同一个类的其他实例之间共享。

另一方面,(或静态)属性是所有类实例共有的属性,因为它属于类,而不是特别是一个实例。

因此,您必须小心静态属性,因为其中的更改将反映在使用它的所有代码上,有时会导致意外结果。在实践中,我倾向于避免静态属性,除了它们具有常量,不可变值的情况。

类似的考虑适用于实例方法和静态方法:实例方法可以“看到”实例和静态方法和属性,而静态方法只能引用类的静态方法和属性,而不能“看到” “实例方法和属性(除非它实例化一个对象并使用它来访问其实例成员)。

答案 3 :(得分:0)

有点......静态对象在类的实例之间共享,而非静态对象是特定于实例的。方法也是如此。

答案 4 :(得分:0)

As said in the reference :

  

如果一个字段被声明为静态,那么它只有一个化身   该字段,无论该类有多少个实例(可能为零)   最终可能会创建。静态字段,有时称为类   变量,在类初始化时体现(第12.4节)。

答案 5 :(得分:0)

请参阅JLS §8.3.1.1

  

如果一个字段被声明为static,那么无论该类最终可以创建多少个实例(可能为零),都只存在该字段的一个化身。初始化类(§12.4)时,会生成静态字段(有时称为类变量)。

相比之下,类的每个实例都包含非静态字段的唯一值。当类实例化

时,非静态字段会显示
  

未声明为static的字段(有时称为非static字段)称为实例变量。每当创建一个新的类实例(§12.5)时,就会为该类或其任何超类中声明的每个实例变量创建一个与该实例关联的新变量。