You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:48:57