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

为何方法隐藏属于编译时多态?变量隐藏为何不属于?

关于Java方法隐藏与编译时多态的两个问题

问题1:方法隐藏未重写,为何属于编译时多态?

编译时多态的核心是调用的目标在编译阶段就已确定,和运行时对象的实际类型无关。

Java里静态方法属于类而非对象,不存在重写的概念——子类的静态方法只是“隐藏”了父类的同名静态方法。当你通过引用调用静态方法时,编译器只会依据引用的编译时类型来绑定方法:

  • 比如代码里A a = new B();,a的编译时类型是A,所以编译阶段就确定调用A类的print(),完全不管运行时实际是B对象;
  • 而B b = new B();的编译时类型是B,就绑定到B类的print()。

这种编译期就锁定调用目标的机制,正好符合编译时多态的定义,所以方法隐藏属于编译时多态的示例。

对应的代码示例:

class A{
    public static void print(){
        System.out.println("class A");
    }
}
public class B extends A{
    public static void print(){
        System.out.println("class B");
    }

    public static void main(String[] args){
        A a = new B();
        a.print();     // 输出class A(编译时绑定A的静态方法)
        B b = new B();
        b.print();    // 输出class B(编译时绑定B的静态方法)
    }
}

问题2:变量隐藏为何不属于编译时多态?

首先要明确:多态的核心是同一行为作用于不同对象时,表现出不同结果,它的讨论范畴是**方法(行为)**的调用逻辑。

变量隐藏只是子类定义了和父类同名的变量,本质是两个完全独立的变量——子类变量只是遮蔽了父类的同名变量。虽然通过引用访问变量时,也是根据编译时类型确定访问哪个变量,但变量本身只是存储数据的容器,没有“行为”“执行逻辑”可言。

编译时多态针对的是方法的绑定规则,而变量的访问规则并不涉及“行为的不同表现”,自然不属于多态范畴。

内容的提问来源于stack exchange,提问作者từ nguyệt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 19:05:36