只是为了澄清我正在考虑这一点,在java中,静态字段是一个变量/字段,由整个类使用,或者可以由引用该类的所有对象使用?非静态字段是由对象定义的变量吗?与对象 1 引用同一类的第二个对象可以与对象 1 的静态字段具有不同的值吗?
6 回答
与实例变量不同,在创建该类的实例之前可以访问类中的静态字段或静态类变量。类中的实例变量(非静态变量)是在运行时创建该类的实例时创建的。因此,在创建该类的实例之前,不能访问非静态变量。然而,可以在创建或实例化该类之前访问静态类成员。
该类的所有实例都可以访问同一个静态变量。另一方面,实例变量是单独的/封装到类的每个实例中。
- 所有对象共享和使用的静态字段,并在加载类时加载
- 非静态字段是每个对象的单独副本,并在创建对象时加载
非静态字段是由对象定义的变量吗?
每当您创建新对象时,每个对象都将拥有自己的实例副本,即非静态字段
与对象 1 引用同一类的第二个对象可以与对象 1 的静态字段具有不同的值吗?
没有真正得到你的问题,但是
- 如果object1和object2是一个类的实例,那么如果object1修改类的静态字段,那么object2会得到更新后的值
实例属性是特定于实例的属性,其值不与同一类的其他实例共享。
另一方面,类(或静态)属性是类的所有实例共有的属性,因为它属于类,而不是特定的实例。
所以你必须小心静态属性,因为一个变化会反映在所有使用它的代码上,有时会导致意想不到的结果。在实践中,我倾向于避免使用静态属性,除非它们具有恒定的、不可变的值。
类似的考虑适用于实例方法和静态方法:实例方法可以“看到”实例和静态方法和属性,而静态方法只能引用类的静态方法和属性,而不能“看到”实例方法和属性(除非它实例化一个对象并使用它来访问其实例成员)。
有点......静态对象在类的实例之间共享,非静态对象特定于实例。方法也是如此。
如果一个字段被声明为静态的,那么无论最终创建多少个类的实例(可能为零),都只存在该字段的一个化身。静态字段,有时称为类变量,在类初始化时体现(第 12.4 节)。
请参阅JLS §8.3.1.1:
如果声明
static
了一个字段,则无论最终可能创建多少个类的实例(可能为零),都只存在该字段的一个化身。静态字段,有时称为类变量,在类初始化时体现(第 12.4 节)。
相比之下,类的每个实例都包含其自己的非静态字段的唯一值。实例化类时会体现非静态字段:
未声明的字段
static
(有时称为非static
字段)称为实例变量。每当创建一个类的新实例(第 12.5 节)时,都会为该类或其任何超类中声明的每个实例变量创建一个与该实例关联的新变量。