在第一条军规中说过,重写方法必需添加@Override 注解,如果在不遵守第一条军规的前提下你是可以及时发下静态方法是不可以被重写的;而如果你没有遵守第一条军规时,你试图重写静态方法,此时在编译器是不可能发现该错误的。
假设有这样一个基类
写道
public class Base {
public static void doSomething() {
System.out.println("我是父类的静态方法!Base.doSomething()");
}
public void toOther() {
System.out.println("Base doOther()");
}
public void doSomething(String thing) {
System.out.println("Base.doSomething(String thing)");
}
}
public static void doSomething() {
System.out.println("我是父类的静态方法!Base.doSomething()");
}
public void toOther() {
System.out.println("Base doOther()");
}
public void doSomething(String thing) {
System.out.println("Base.doSomething(String thing)");
}
}
在子类的代码如下:
写道
public class Sub extends Base {
public static void doSomething() {
System.out.println("我是子类的静态方法!Sub.doSomething()");
}
@Override
public void toOther() {
System.out.println("我是子类的非静态方法!");
}
}
public static void doSomething() {
System.out.println("我是子类的静态方法!Sub.doSomething()");
}
@Override
public void toOther() {
System.out.println("我是子类的非静态方法!");
}
}
我们在写一个测试方法
写道
public class Client {
public static void main(String[] args) {
Base base = new Sub();
base.doSomething();
base.toOther();
}
}
public static void main(String[] args) {
Base base = new Sub();
base.doSomething();
base.toOther();
}
}
结果是:
写道
我是父类的静态方法!Base.doSomething()
我是子类的非静态方法!
我是子类的非静态方法!
从结果上我们可以发现静态方法是不可以被重写的。