我有个需求是:继承自同一个父类的多个子类要继承父类的一个静态属性。(就比如说父类为人,有静态属性名字,子类男人,女人都要继承名字这个静态属性)
在实际编码中,我发现有趣的现象,多个子类其实是共享父类的静态属性的。具体是什么意思,请看下面我举的一个例子。
首先是类图,父类是AbstractClass,他有两个子类分别是ConcreteClass1,ConcreteClass2。
父类有一个静态属性是Form类型的变量。
两个子类分别对这个继承自父类的静态属性赋值。
ConcreteClass1赋值如下:10 小祝
public class ConcreteClass1 extends AbstractClass{
public ConcreteClass1() {
this.form = new Form(10, "小祝");
}
}
ConcreteClass2 赋值如下: 2 小王
public class ConcreteClass2 extends AbstractClass{
public ConcreteClass2() {
this.form = new Form(2, "小王");
}
}
然后为了验证这两个子类是不是共享父类的这个属性,我们做如下的测试
public class Client {
public static void main(String[] args) {
//创建一个ConcreteClass1子类对象 "小祝",10元
AbstractClass ac1 = new ConcreteClass1();
System.out.println(ac1.getFormName()+":"+ac1.getFormMoney());
//创建一个ConcreteClass2子类对象 "小王",2元
AbstractClass ac2 = new ConcreteClass2();
System.out.println(ac2.getFormName()+":"+ac2.getFormMoney());
System.out.println();
//此时如果他们不共享的话,应该是 "小祝",10元
System.out.println(ac1.getFormName()+":"+ac1.getFormMoney());
}
}
可以看出,如果两个子类不是共享同一个父类的属性,那么输出将会是:
但是实际输出是:
这说明其实两个子类共有一个静态属性,当一个子类对这个属性进行更改后,另一个子类的该属性也随之更改。
那么如果我的需求是两个子类要有独自不受别的子类影响的继承自父类的属性怎么办?
那就要把父类中的这个属性不能作为静态属性(即去掉static)
之后再一次测试
发现两个子类互不影响。