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