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

从语法层面讲,子类覆盖静态方法/静态变量是不可行的. 但有一些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加载.

你可能感兴趣的:(子类覆盖静态(static)方法/静态变量 以及静态代码块的执行顺序)