2013-09-30 145 views
2

只是为了阐明我在思考这个问题,在java中,静态字段是一个变量/字段,它被整个类使用,或者可以被所有引用该类的对象使用?非静态字段是由对象定义的变量吗?而引用与对象1相同的类的第二个对象可以具有与对象1的静态字段不同的值?静态和非静态字段

回答

2

在创建该类的实例之前,可以访问类中的静态字段或静态类变量,而不像实例变量。当在运行时创建该类的实例时,会创建类中的实例变量(非静态变量)。因此,只有在创建该类的实例时才能访问非静态变量。而静态类成员可以在之前被访问该类被创建或实例化。

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

+0

困扰,有道理。换句话说,如果我声明一个静态字段,它可以被该类的所有实例使用? –

+0

是的,该类的所有实例都共享该静态变量的值。 – blackpanther

+0

@ChrisLondon,可以在类的所有实例中使用静态字段 –

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

而一个一个对象加载非静态字段是由对象定义的变量吗?

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

和第二对象指的同一类对象1可以有不同的价值对象1的静态字段?

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

  • 如果object1和对象2是一类instnaces,那么如果object1修改类的静态字段,然后将Object2的获取更新的价值
0

类型...静态对象在类的实例之间共享,而非静态对象是特定于实例的类。方法也一样。

+0

一个静态变量或字段。并非所有字段都是对象 – Cruncher

1

实例属性是特定于实例的属性,其值不会在同一类的其他实例中共享。

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

所以你必须小心使用静态属性,因为一个变化会反映在所有使用它的代码上,有时会导致意外的结果。在实践中,我倾向于避免静态属性,除了它们具有不变的,不可变的值的情况。

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

0

As said in the reference :

如果字段声明为静态,存在的 只有一个化身领域,不管有多少类 的情况下(可能是零)最终可能会被创建。一个静态字段,有时称为类 变量,在类被初始化(§12.4)时体现出来。

0

参考JLS §8.3.1.1

如果某个字段声明static,存在的领域,只有一个化身,不管有多少实例(可能是零)之类的可能最终被创建。一个静态字段,有时称为类变量,在类初始化时体现出来(§12.4)。

与此相反,一个类的每个实例包含非静态字段自己的独特值。

未声明static甲场(有时称为非static场)称为实例变量:当类是实例非静态字段体现。无论何时创建类的新实例(§12.5),都会为该类或其任何超类中声明的每个实例变量创建与该实例关联的新变量。