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

猜你喜欢

转载自www.cnblogs.com/zhengwangzw/p/9120620.html