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

Java静态变量在方法重写中的疑问:预期与实际输出不符

为什么静态变量的输出和预期不一致?

嘿,我来帮你揪出这个问题的核心原因!你这里的误区在于对Java静态成员的特性理解错啦——静态变量是属于类的,完全不参与多态机制,和对象引用的类型半毛钱关系都没有。

先拆解你的代码逻辑:
你写了A b = new B();,以为因为引用类型是A,访问静态变量a就会用A的,但实际上静态成员的访问规则根本不是这样的。

咱们看你的B类里的test()方法(虽然你没写完,但应该是打印a对吧?),当你在B的方法里直接写a的时候,编译器在编译阶段就已经把它绑定到B.a了——因为这个方法是定义在B类里的,静态成员的解析是编译期确定的,看的是代码所在的类,而不是调用方法的引用类型。

举个实际的例子,如果你的B类是这样的:

class B extends A{
    static String a = "subclass";
    @Override
    void test() {
        System.out.println(a);
    }
}

那不管你用A b = new B()还是B b = new B()调用b.test(),输出都是subclass,因为这里的a就是B类的静态变量。

如果想要输出superclass,你得显式指定访问A类的静态变量,把test()改成这样:

@Override
void test() {
    System.out.println(A.a);
}

这样不管怎么调用,都会输出A类里的superclass。

最后给你划几个重点:

  • 静态成员(变量、方法)是类的属性,不是对象的,不存在“基于引用访问”的逻辑,引用类型不影响静态成员的选择。
  • 静态成员的绑定是编译期静态绑定,实例成员才是运行时动态绑定(也就是多态的核心)。
  • 永远不要通过对象引用访问静态成员,直接用类名.静态成员的方式,这样代码更清晰,也不会产生误解。

内容的提问来源于stack exchange,提问作者Handmadegifts co

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:33:43