JAVA: 子类通过static块“覆盖”父类的成员变量风险
上一篇文章介绍了怎么通过子类覆盖父类的成员变量,这里说明在实际应用中通过static代码块覆盖父类成员变量的风险。
public class Base { public static String a = "base"; static { a = "change base a"; } protected void test(){ System.out.println(a); } } class Derived extends Base { static { a = "derived"; System.out.println("change derived a"); } } public class Test{ public static void main(String[] args) { System.out.println(Base.a); System.out.println(Derived.a); new Derived(); System.out.println(Base.a); System.out.println(Derived.a); } }
输出:
change base a
change base a
change derived a
derived
derived
因为static代码块独立于对象实例化,static代码块是在类初始化时执行(下次深度分析类加载机制,初始化时间),因此一旦父类静态代码块执行或子类修改类成员变量,子类和父类所持有的类成员变量都变成一样的,当父类和子类需要处理不同的类变量时,就会有问题,实际项目中就遇到子类和父类需要处理不同的用户请求,请求需要用到不同的类变量,这里就不合适了。更合适的方法是创建一个getStaticVariable方法。
欢迎关注Java流水账公众号