参考链接: 可以在Java中重载或重写静态方法吗
Java中的静态方法不能被子类重写
特点:静态方法属于类的方法,也属于对象的方法,但是静态方法随类的存在。
结论:Java中的静态方法不能被子类重写,实际上,子类的静态方法隐藏了父类的静态方法,因此父类的子类的静态方法同时存在,只不过父类通过类名(或对象名)调用的是父类的静态方法,子类通过类名(或对象名)调用的是子类的静态方法。
(1)代码如下:
public class Test {
public static void main(String[] args) {
Father f1 = new Son();
f1.methon(); // static(静态)方法的调用,不支持多态,所以此处调用的父类的静态方法
f1.doWork(); // 非static(静态)方法的调用,支持多态
System.out.println("---------------");
Son s1 =new Son();
s1.methon();
s1.doWork();
}
}
class Father {
public static void methon(){
System.out.println("Father static methon()");
}
public void doWork(){
System.out.println("Father doWork()");
}
}
class Son extends Father {
public static void methon(){
System.out.println("Son static methon()");
}
public void doWork(){
System.out.println("Son doWork()");
}
}
打印结果:
Father static methon()
Son doWork()
---------------
Son static methon()
Son doWork()
结论:
(1)静态方法不支持多态。(final,private 方法也如此)
(2)静态方法可通过类名直接调用,也可通过类的实例化对象调用,因此Father 的实例化对象f1调用的是父类(不是子类)的静态方法。
(3)静态方法的绑定时期为代码的编译器期,也叫前期绑定。非静态的方法属于程序的执行期绑定,也就运行期绑定。
对于结论(3)举个极端的例子
public class Test {
public static void main(String[] args) {
Father f1 = new Son();
f1.methon(); // static(静态)方法的调用,不支持多态,所以此处调用的父类的静态方法
f1.doWork(); // 非static(静态)方法的调用,支持多态
System.out.println("---------------");
Son s1 =new Son();
s1.methon();
s1.doWork();
System.out.println("---------------");
Father f2= null; // 创建一个父类变量的空引用
f2.methon(); // 调用父类的静态方法,此处竟然不出错,表明了静态方法的特殊性
}
}
class Father {
public static void methon(){
System.out.println("Father static methon()");
}
public void doWork(){
System.out.println("Father doWork()");
}
}
class Son extends Father {
public static void methon(){
System.out.println("Son static methon()");
}
public void doWork(){
System.out.println("Son doWork()");
}
}打印结果:
Father static methon()
Son doWork()
---------------
Son static methon()
Son doWork()
---------------
Father static methon()