静态和非静态字段

63lcw9qa  于 2021-07-06  发布在  Java
关注(0)|答案(6)|浏览(274)

为了澄清我的想法,在java中,静态字段是一个变量/字段,它被整个类使用,或者可以被引用该类的所有对象使用?非静态字段是由对象定义的变量?第二个对象引用与对象1相同的类,它对对象1的静态字段有不同的值?

trnvg8h3

trnvg8h31#

参考jls§8.3.1.1:
如果声明了字段 static ,则不管最终可能创建多少个类示例(可能为零),字段只存在一个化身。静态字段(有时称为类变量)在初始化类时具体化(§12.4).
相比之下,类的每个示例都包含自己的非静态字段的唯一值。示例化类时,非静态字段将具体化:
未声明的字段 static (有时称为非- static 字段)称为示例变量。每当创建类的新示例时(§12.5),为该类或其任何超类中声明的每个示例变量创建与该示例关联的新变量。

oxcyiej7

oxcyiej72#

与示例变量不同,在创建类的示例之前,可以访问类中的静态字段或静态类变量。类中的示例变量(非静态变量)是在运行时创建该类的示例时创建的。因此,在创建该类的示例之前,不能访问非静态变量。然而,静态类成员可以在创建或示例化该类之前进行访问。
该类的所有示例都可以访问相同的静态变量。另一方面,示例变量是单独的/封装到类的每个示例中的。

pcww981p

pcww981p3#

示例属性是特定于示例的属性,其值不会在同一类的其他示例之间共享。
另一方面,类(或静态)属性是所有类示例的公共属性,因为它属于类,而不是特定的示例。
所以必须小心使用静态属性,因为其中一个属性的更改将反映在使用它的所有代码上,有时会导致意外的结果。在实践中,我倾向于避免使用静态属性,除非它们具有恒定的、不可变的值。
类似的考虑也适用于示例方法和静态方法:示例方法可以“看到”示例和静态方法以及属性,而静态方法只能引用类的静态方法和属性,并且不能“看到”示例方法和属性(也就是说,除非它示例化一个对象并使用它访问其示例成员)。

w8biq8rn

w8biq8rn4#

如参考文献所述:
如果一个字段被声明为静态的,那么不管最终创建了多少个类示例(可能为零),该字段只存在一个化身。静态字段(有时称为类变量)在初始化类时具体化(§12.4).

yyhrrdl8

yyhrrdl85#

静态字段由所有对象共享和使用,并在加载类时加载
非静态字段是每个对象的单独副本,在创建对象时加载
非静态字段是由对象定义的变量?
每当您创建一个新对象时,每个对象都有自己的示例副本,即非静态字段
第二个对象引用与对象1相同的类,它对对象1的静态字段有不同的值?
我没听清你的问题,但是
如果object1和object2是类的指令,那么如果object1修改了类的静态字段,那么object2将获得更新的值

webghufk

webghufk6#

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

相关问题