关于子类能不能重写父类静态方法

答案:不能

解释:

(先看代码)

父类 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();
    }
}
复制代码

输出结果:

image.png

分析

上面子类看似重写了父类的static方法,但其实是各自都开辟了一个空间,各自有各自的方法体(前面博客有说到,静态的东西都是属于类的,一个类只有一个空间专门放静态的东西),所以输出的结果不同。

但是子类不"重写"父类static方法时会继承,验证过了,在主程序类中可以用子类对象直接调用父类的静态变量和方法,打印的就是父类写的内容。

总结

所以子类可以继承父类的静态方法,但不能重写,之所以显示不同结果,是因为子类也开辟了一个空间去放自己的静态变量和方法,此时相当于写了一个子类独有的方法,只是它是用static修饰的。

关于这一点的证明:在子类中,在"重写"的static方法前面加注解 @Override,此时会直接编译报错:

image.png

翻译为“方法不重写其超类中的方法”,大意就是该方法没有从父类方法中重写。 所以说明这个方法不是在重写,而是子类自己的,独有的,只是跟父类那个static方法(test)同名了而已。

猜你喜欢

转载自juejin.im/post/7042303003910488094