zoukankan      html  css  js  c++  java
  • 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流水账公众号
  • 相关阅读:
    PHP中几种加密形式
    PHP 常用的header头部定义汇总
    php二维数组排序方法(array_multisort,usort)
    js刷新当前页面的几种方法
    chosen.jquery插件的使用
    [NOI2006] 网络收费
    [NOI2002] 贪吃的九头蛇
    [NOI2013] 向量内积
    [TJOI2019] 甲苯先生的线段树
    [CF750G] New Year and Binary Tree Paths
  • 原文地址:https://www.cnblogs.com/guofu-angela/p/9120620.html
Copyright © 2011-2022 走看看