面试:static静态方法为什么不能被重写

静态方法为什么不能被重写 - 技术狂-CYL - 博客园

首先我们来测试,猜下下面程序的运行结果:

public class Test1_Static {
    public static void main(String[] args) {
        Father f = new Father();
        f.staticMethod();
        Child c = new Child();
        c.staticMethod();
        Father person = new Child();
        person.staticMethod();
    }
}

class Father {
    public static void staticMethod() {
        System.out.println("fatherMethod");
    }
}

class Child extends Father{
    public static void staticMethod() {
        System.out.println("childMethod");
    }
}

打印结果:

fatherMethod
childMethod
fatherMethod

核心:静态方法是通过类来调用的,不是通过对象来调用的,而非静态方法是通过对象来调用的。

前提(多态):父类(Father)的引用变量 father 指向子类(Son)的实例对象(new Son() )。

所以当父类 Father 的引用变量 father (存在栈中)想要调用子类 Son 重写的非静态方法时,调用的的是Son类在堆中创建的对象(new Son() )中的方法;当父类 Father 的引用 father 想要调用子类Son “重写” 的静态方法时,调用的是 Father 类中的静态方法,不会通过所指向的对象(Son类的对象)来调用,所以static修饰的方法没办法达到重写的目的。

相信前两个打印结果大家都已经猜到了,但是最后一个结果相信有不少小伙伴会产生疑惑,甚至做出错误的判断,其实一个指向子类对象的父类引用变量来调用父子同名的静态方法时,只会调用父类的静态方法。这是因为静态方法只能被继承,不能被重写,如果子类有和父类相同的静态方法,那么父类的静态方法将会被隐藏,对于子类不可见,也就是说,子类和父类中相同的静态方法是没有关系的方法,他们的行为不具有多态性。但是父类的静态方法可以通过父类.方法名调用。

猜你喜欢

转载自blog.csdn.net/cpcpcp123/article/details/128065144