Java中静态方法重写疑问:为何如下代码输出"In static A"?
为什么这段Java代码输出"In static A"?
哈哈这个问题刚好戳中了Java静态方法的一个关键特性!先把你的代码整理成更易读的格式:
class A { static public void printMe() { System.out.println("In static A"); } } class B extends A { static public void printMe() { System.out.println("in static B"); } } public class Test { public static void main(String[] args) { A a = new B(); a.printMe(); } }
接下来给你拆解核心原因:
- 静态方法属于类,而非实例:Java里的静态方法是绑定在类本身的,和对象实例没有直接关联。它不支持运行时多态(也就是我们常说的方法重写),编译器在编译阶段就会确定要调用哪个静态方法。
- 编译期绑定引用类型:你代码里的
A a = new B();,变量a的声明类型是A,哪怕它实际指向的是B的对象,调用静态方法时,编译器只会看a的声明类型,直接绑定到A类的printMe()方法,完全不会去管实际对象的类型。 - 和非静态方法的本质区别:如果是普通的非静态方法,那才会触发运行时多态,调用子类B的实现,但静态方法从设计上就不走这套逻辑——甚至严格来说,子类B的
printMe()都不叫“重写”,只是和父类同名的静态方法而已。
简单总结就是:静态方法看引用的声明类型,非静态方法看实际对象的类型,这就是你看到输出"In static A"的根本原因!
内容的提问来源于stack exchange,提问作者robin
相关产品推荐
相关产品推荐

