为何方法隐藏属于编译时多态?变量隐藏为何不属于?
关于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
相关产品推荐
相关产品推荐

