父类引用指向子类对象时,成员变量与方法访问结果为何不同?
为什么父类引用指向子类对象时,成员变量与方法的表现不一致?
问题场景代码
父类与子类定义
class Parent { int A = 0; void say() { System.out.println("Parent method"); } } class Child extends Parent { int A = 1; int B = 3; void say() { System.out.println(A+B); } }
测试执行代码
Parent obj = new Child(); System.out.println(obj.A); // 输出 0 obj.say(); // 输出 4
原因解析
Java对成员变量和成员方法的调用遵循完全不同的绑定规则:
成员变量:编译期静态绑定
编译阶段,编译器只会根据变量的声明类型(此处obj的声明类型是Parent)确定要访问的成员变量,和对象实际指向的子类实例无关。所以obj.A直接访问的是Parent类中定义的A,值为0。
这里子类的int A = 1并不是覆盖父类的变量,而是隐藏了父类的同名变量——两者是两个独立的变量,只是名称相同。成员方法:运行期动态绑定
对于非静态方法,Java采用动态绑定机制:运行时会根据对象的实际类型(此处obj实际指向Child实例)来调用对应的方法。因此obj.say()会执行Child中重写的say()方法,方法里的A是子类自身定义的变量(值为1),加上B=3,最终输出4。
内容的提问来源于stack exchange,提问作者user3084686
相关产品推荐
相关产品推荐

