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生存周期理解的一种具体表达形式吧。

 

posted @ 2022-08-19 19:17  天才俱乐部  阅读(70)  评论(0)    收藏  举报