Java多态中父类引用为何调用父类静态方法而非子类重写方法?
问题原因解析
核心问题在于:Java的静态方法不参与多态机制,它的调用逻辑和实例方法完全不同。
- 静态方法属于类而非对象,调用时由引用变量的编译时类型决定,和运行时实际指向的对象类型无关。你的代码里
gen的编译时类型是Generator,所以编译阶段就已经确定要调用Generator类的acceptPending()方法,和它实际指向GeneratorNeo对象没有关系。 - 子类中的
static acceptPending()不是对父类方法的“重写”,而是隐藏了父类的同名静态方法。重写只针对实例方法,如果你尝试给子类的静态方法加上@Override注解,编译器会直接报错,这也能证明两者不是重写关系。 - 如果想调用子类的静态方法,要么直接通过子类名调用:
GeneratorNeo.acceptPending(),要么把引用变量声明为子类类型:GeneratorNeo gen = new GeneratorNeo();,此时调用gen.acceptPending()才会执行子类的版本。
内容的提问来源于stack exchange,提问作者Austin
相关产品推荐
相关产品推荐

