Java实验室——static会将对象属性上升到类层级来管理
假设类A有属性p,当构建两个不同的A类对象a1和a2时:
class A {
int p;
A(int x) {
p = x;
}
int getValue() {
return p;
}
}
public class index {
public static void main(String[] args) {
A a1 = new A(1);
A a2 = new A(2);
System.out.println(a1.getValue());
System.out.println(a2.getValue());
}
}
正常情况下两个new出来的对象a1,a2相互独立互不影响,因此其输出结果为:
12
若将类A中的属性p按如下添加static关键字:
class A {
static int p;
A(int x) {
p = x;
}
int getValue() {
return p;
}
}
public class index {
public static void main(String[] args) {
A a1 = new A(1);
A a2 = new A(2);
System.out.println(a1.getValue());
System.out.println(a2.getValue());
}
}
则输出结果变为:
22
这是由于static关键字将属性p由对象上升为由类A来接管,每次定义新的类A对象时若对p有改动,所有定义的A类对象的p值都会受影响。另外对于有static关键字的变量p,在其调用上也会有变化。由于其已经被上升到类来管理,其调用语法应该为:
System.out.println(A.p);
而不是
A a1 = new A(1);
System.out.println(a1.p);
后一种是在未加static关键字时的正确用法。然而平时在定义类的时候,类属性一般不使用static字段,都希望它能够服务于对象并成为对象的内部属性,而不是服务于所有同类对象的共享属性。这种问题场景同样适用于抽象类。假设类B和C都继承了抽象类A,继承关系如下:

main函数如下:
public class index {
public static void main(String[] args) {
B b = new B(1);
C c = new C(2);
System.out.println(b.getValue());
System.out.println(c.getValue());
}
}
则输出结果为:
12
同样若将A的属性p添加static关键字后:
输出结果变为:
22
这个问题场景也许算是static生存周期理解的一种具体表达形式吧。

浙公网安备 33010602011771号