答案:不能
解释:
(先看代码)
父类 Father.java:
public class Father {
public static String test = "父类static变量";
public static void test(){
System.out.println("这是父类 public static void方法");
}
}
复制代码
子类 Son.java 继承父类
public class Son extends Father {
public static String test = "子类static变量";
public static void test(){
System.out.println("子类static方法");
}
}
复制代码
二儿子 Son2.java 也继承父类
public class Son2 extends Father {
public static String test = "二儿子static变量";
public static void test() {
System.out.println("二儿子static方法");
}
}
复制代码
主程序类 Application.java:
public class Application {
public static void main(String[] args) {
Father father = new Father();
Son son = new Son();
Son2 son2 = new Son2();
System.out.println(father.test);
System.out.println(son.test);
System.out.println(son2.test);
System.out.println("------------------------------");
father.test();
son.test();
son2.test();
Father.test();
}
}
复制代码
输出结果:
分析
上面子类看似重写了父类的static方法,但其实是各自都开辟了一个空间,各自有各自的方法体(前面博客有说到,静态的东西都是属于类的,一个类只有一个空间专门放静态的东西),所以输出的结果不同。
但是子类不"重写"父类static方法时会继承,验证过了,在主程序类中可以用子类对象直接调用父类的静态变量和方法,打印的就是父类写的内容。
总结
所以子类可以继承父类的静态方法,但不能重写,之所以显示不同结果,是因为子类也开辟了一个空间去放自己的静态变量和方法,此时相当于写了一个子类独有的方法,只是它是用static修饰的。
关于这一点的证明:在子类中,在"重写"的static方法前面加注解 @Override
,此时会直接编译报错:
翻译为“方法不重写其超类中的方法”,大意就是该方法没有从父类方法中重写。 所以说明这个方法不是在重写,而是子类自己的,独有的,只是跟父类那个static方法(test)同名了而已。