Java静态方法调用疑问:子类引用为何调用父类static method2()?
为什么子类引用下,父类的静态method2()仍被调用?
首先咱们先补全RefDemo里的main方法,让调用场景更清晰:
public class RefDemo { public static void main(String[] args) { SuperClass obj = new SubClass(); obj.method1(); } }
运行这段代码,输出会是:
subclass method1 superclass method1 superclass method2
你疑惑的点在于:明明obj实际是子类对象,为什么父类method1里调用的method2是父类的版本?核心原因有这几点:
静态方法属于类,而非对象,不支持多态
静态方法是和类绑定的,在编译阶段就已经确定了要调用哪个类的静态方法,完全不涉及运行时的对象类型判断(多态的核心是运行时动态绑定,这一特性只针对实例方法)。父类method1里的
this.method2()本质是类调用
虽然你写的是this.method2(),但因为method2是静态方法,编译器会自动把它转换成SuperClass.method2()。这里的this只是个“幌子”,静态方法调用根本不关心this指向的实际对象是什么,只看当前代码所在的类(也就是SuperClass)。子类的method2不是重写,是“隐藏”
你在子类里写的public static void method2(),其实并没有重写父类的method2——静态方法不能被重写,只能被隐藏。@Override注解在这里其实是无效的(有些编译器会给出警告)。父类的代码里调用method2时,只会认自己类里的静态方法,和子类隐藏的版本没有关系。
简单来说:静态方法的调用规则是“编译时看类,运行时不看对象”,所以不管你用父类还是子类的引用,只要是在父类的方法里调用静态method2,就只会调用父类的版本。
内容的提问来源于stack exchange,提问作者mayank batra
相关产品推荐
相关产品推荐

