JAVA 多态中的成员访问特点

本文详细解析了面向对象编程中成员变量和成员函数的绑定机制,包括编译期和运行期的不同行为,以及静态函数的特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

成员变量:
      当子父类中出现同名的成员变量时。
      编译时期:参考的是引用型变量所属的类中是否有被调用的成员变量。没有,编译失败。
      运行时期:也是调用引用型变量所属的类中的成员变量。
      简单记:编译和运行都参考等号的左边。
成员函数:
     编译时期:参考左边,如果没有,编译失败。
     运行时期:参考右边的对象所属的类。
     编译看左边,运行看右边。
     对于成员函数是动态绑定到对象上。
静态函数。
    静态函数是静态的绑定到类上。
    编译和运行都参考左边。
【结论】
        对于成员变量和静态函数,编译和运行都看左边。
        对于成员函数,编译看左边,运行看右边。
### 多态成员访问特点总结 #### 成员变量 在多态的情况下,成员变量的访问依赖于 **编译时类型**(即声明变量时使用的类型)。无论实际运行时的对象是什么类型,成员变量始终按照声明类型的定义进行访问。这是因为成员变量不存在重写机制,其值仅取决于声明时的类型。 例如,在 `Parent` 和 `Child` 类的关系中,如果父类有一个成员变量 `int value` 并被子类重新定义,则通过父类引用访问该变量时,返回的是父类版本的值[^2]。 ```java class Parent { int value = 10; } class Child extends Parent { int value = 20; } public class Main { public static void main(String[] args) { Parent obj = new Child(); System.out.println(obj.value); // 输出 10 } } ``` #### 构造方法 子类的构造过程中会隐式调用父类的无参构造函数(如果没有显式指定其他构造器),这是为了确保子类对象能够正确初始化并继承父类的状态。这种行为与多态无关,而是面向对象编程的基础特性之一[^3]。 #### 静态方法 静态方法属于类本身而非具体实例,因此它们不受多态影响。即使通过子类对象调用了某个静态方法,实际上执行的仍然是声明类型所对应的类的方法。换句话说,静态方法的行为完全基于编译时类型决定。 ```java class Parent { static void display() { System.out.println("Parent"); } } class Child extends Parent { static void display() { System.out.println("Child"); } } public class Main { public static void main(String[] args) { Parent obj = new Child(); obj.display(); // 输出 "Parent" } } ``` #### 成员方法 对于成员方法而言,多态的核心体现就在于动态绑定——也称为后期绑定或运行时绑定。这意味着当一个方法被重写时,最终调用哪个版本的方法是由运行时的实际对象类型决定的,而不是由声明类型决定[^4]。 继续以上述例子为例: ```java class Parent { void show() { System.out.println("Parent Show"); } } class Child extends Parent { @Override void show() { System.out.println("Child Show"); } } public class Main { public static void main(String[] args) { Parent obj = new Child(); obj.show(); // 输出 "Child Show" } } ``` 这里的关键在于,尽管 `obj` 是以 `Parent` 类型声明的,但由于其实例是一个 `Child` 对象,所以在调用 `show()` 方法时选择了子类中的实现。 --- ### 总结表:多态下各部分的访问特点 | 访问目标 | 编译依据 | 运行依据 | 是否支持动态绑定 | |---------------|------------------|--------------------|-------------------| | 成员变量 | 左边(声明类型) | 左边 | 否 | | 构造方法 | 不适用 | 父类到子类链路自动触发 | 不适用 | | 静态方法 | 左边 | 左边 | 否 | | 成员方法 | 左边 | 右边(实际对象类型) | 是 | --- ### 注意事项 - 如果未发生方法重写,则即便处于多态环境中,仍只会调用父类原始定义的方法。 - 使用强制类型转换 (`instanceof`) 可以绕过多态限制,从而直接操作特定子类的功能[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值