跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

Java多态中成员变量是否具有动态绑定特性

成员变量不具有动态绑定特性,其访问基于引用变量的声明类型而非实际对象类型。例如,当父类和子类存在同名成员变量时,通过父类引用访问该变量将获取父类中的值,即使实际对象是子类实例。这体现了静态绑定,即在编译期确定访问的变量。相比之下,实例方法支持动态绑定(后期绑定),在运行时根据对象的实际类型决定调用哪个实现。因此,Java多态仅适用于方法,不适用于成员变量,设计时需注意避免依赖成员变量的多态行为。 在Java多态中, 成员变量不具有动态绑定特性 。也就是说,成员变量的访问是静态绑定的,它取决于引用变量的声明类型,而不是实际对象的运行时类型。 什么是动态绑定 动态绑定(也叫后期绑定)是指在程序运行时根据对象的实际类型来决定调用哪个方法或属性。Java中的 实例方法 支持动态绑定,但 成员变量 不支持。 成员变量是静态绑定的 当通过父类引用指向子类对象时,如果父类和子类有同名的成员变量,访问的是父类中的变量,而不是子类中重定义的那个。 例如: 立即学习 “ Java免费学习笔记(深入) ”;
class Parent { int value = 10; } class Child extends Parent { int value = 20; // 与父类同名的成员变量 } public class Test { public static void main(String[] args) { Parent p = new Child(); System.out.println(p.value); // 输出:10,不是20 } }
虽然p指向的是Child对象,但p的声明类型是Parent,所以访问的是Parent类中的value变量。 Eclipse导入Android或其他的JAVA项目的正确方法 WORD版 本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看 下载 方法支持动态绑定,变量不支持 对比来看,如果把变量换成方法:
class Parent { int getValue() { return 10; } } class Child extends Parent { @Override int getValue() { return 20; } } public class Test { public static void main(String[] args) { Parent p = new Child(); System.out.println(p.getValue()); // 输出:20 } }
这里调用的是Child类的getValue()方法,体现了方法的动态绑定。 总结来说,Java的多态只适用于方法,不适用于成员变量。成员变量的访问在编译期就确定了,基于引用类型,不会因为实际对象类型而改变。 基本上就这些,别指望成员变量有多态行为,设计时要注意这点。

相关文章