Java编译时与运行时多态:方法调用的编译期绑定疑问
问题解答
编译阶段y.m()会绑定到接口Y的m()方法。
Java是静态类型语言,编译期只关注变量的静态声明类型,不会考虑它实际指向的对象类型。这里变量y被声明为Y类型,所以编译器会基于Y接口去查找m()方法,确认该方法存在后就完成编译时的绑定。
至于运行时,因为实际对象是B类的实例,而B重写了m()方法,所以会执行B类的实现,这就是你看到输出Class B m的原因。
你的代码整理:
接口X
package test; public interface X { public void m(); }
接口Y
package test; public interface Y { public void m(); }
抽象类A
package test; public abstract class A implements X{ public void m(){ System.out.println("Class A: m"); } abstract void m2(); }
类B
package test; public class B extends A implements Y{ public void m2(){ System.out.println("Class B m2"); } public void m(){ System.out.println("Class B m"); } }
测试类test
package test; public class test { public static void main(String[] args) { Y y = new B(); y.m(); } }
内容的提问来源于stack exchange,提问作者Park Bo
相关产品推荐
相关产品推荐

