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方法。

posted @ 2018-06-01 10:48  安琪拉的博客(公众号)  阅读(287)  评论(0编辑  收藏  举报