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相互独立互不影响,因此其输出结果为:

1
2

若将类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());
	}

}

则输出结果变为:

2
2

这是由于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,继承关系如下:

JAVA实验室——static会将对象属性上升到类层级来管理_第1张图片
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());
	}

}

则输出结果为:

1
2

同样若将A的属性p添加static关键字后:
JAVA实验室——static会将对象属性上升到类层级来管理_第2张图片输出结果变为:

2
2

这个问题场景也许算是static生存周期理解的一种具体表达形式吧。

你可能感兴趣的:(java,后端,spring,经验分享,其他)