美文网首页
子类覆盖静态方法/静态变量 以及静态代码块的执行顺序

子类覆盖静态方法/静态变量 以及静态代码块的执行顺序

作者: hjm1fb | 来源:发表于2018-08-03 15:50 被阅读40次

咳咳,从语法层面讲,子类覆盖静态方法/静态变量是不可行的. 但有一些trick可以达到类似的效果.
class级别hide的方式:
不写override注解就可以
例子:Is it possible to override a static method in derived class?里的class Bar extends Foo的例子.这种方式不是override,是class级别的hide.注意点是调用此静态方法时,需要通过具体的子类class静态的调用,而不是运行时实例化的调用,详细请看文章里答主的解释.
hide静态变量 也是同理
另一篇提到hide的参考文章

我们一个比较常见的调用静态方法的场景是getInstance()获取单例.
其实只要我们定义几个public的静态INSTANCE, 调用的时候直接引用我们需要的INSTANCE就可以.相当于通过引用公开的INSTANCE变量替换了getInstance()代码.一种比较好的实现单例的方式是enum.
例子:

public enum Color {

    Green {

        @Override
        protected void init(Context context) {
            colorName = "green"
        }

    },

    Red {

        @Override
        protected void init(Context context) {
            colorName = "red"
        }

    };

    Color(){
        init(MyAPP.getInstance());
    }

   protected void init(Context context){

   }

    public String colorName;

   public String getColorName(){
   return colorName;
   }

}

//调用: Color.Red.getColorName()  Color.Red.colorName

在上面的例子中我们发现, 不管是调用方法getColorName还是直接引用变量colorName,
虽然实质上是通过实例(单例)调用,但使用方式上和静态方法无异,而且也有了动态运行时.

顺便学习一下静态代码块的执行顺序:
Java和Android中,代码块、static静态代码块的执行顺序
android中的类加载和静态成员变量的初始化
补充一点:如果调用代码是

SubClass.staticMethodA();

这个静态方法staticMethodA只在BaseClass里声明和实现了, 那么因为此时不需要加载SubClass类即可执行staticMethodA的代码,所以JVM并没有加载SubClass, 所以此时Subclass的静态代码块并不会执行,直到下次Subclass被需要,被JVM加载.

相关文章

  • Java和Kotlin类的初始化顺序

    Java Java程序初始化的顺序:父类静态变量 -> 父类静态代码块 -> 子类静态变量 -> 子类静态代码块 ...

  • Java父子类加载顺序

    加载顺序 先上桌结论: 父类静态属性(成员变量) > 父类静态代码块 > 子类静态属性 > 子类静态代码块 > 父...

  • 类加载-初始化阶段

    加载顺序总结 父类的静态字段——>父类静态代码块——>子类静态字段——>子类静态代码块——>父类成员变量(非静态字...

  • 子类覆盖静态方法/静态变量 以及静态代码块的执行顺序

    咳咳,从语法层面讲,子类覆盖静态方法/静态变量是不可行的. 但有一些trick可以达到类似的效果.class级别h...

  • java相关零碎知识

    java初始化,加载顺序: 父类的静态成员变量,父类静态代码块,子类的静态成员变量,子类的静态代码块,父类非静态成...

  • java 代码块顺序

    java 代码块的执行顺序: 静态变量 > 非静态变量静态变量 > 静态代码块 > 非静态代码块父构造 > 子构...

  • 静态变量、代码块、和静态方法的执行顺序

    转载自 静态变量、代码块、和静态方法的执行顺序以备学习 代码 执行结果 结论 静态变量是全局变量 静态方法在类加载...

  • 初始化执行顺序

    Java初始化的顺序如下: 父类的静态变量 父类的静态代码块 子类的静态变量 子类的静态代码块 父类的非静态变量...

  • java初始化过程

    初始化顺序:父类的静态变量-->父类的静态代码块-->子类的静态变量-->子类的静态代码快-->父类的非静态变量(...

  • 静态内部类实现懒加载单例模式

    代码 为什么 Java程序的初始化顺序依次是:父类静态变量-->父类静态代码块-->子类静态变量-->子类静态代码...

网友评论

      本文标题:子类覆盖静态方法/静态变量 以及静态代码块的执行顺序

      本文链接:https://www.haomeiwen.com/subject/lroyvftx.html