多态中的成员访问特点之成员变量

多态中的成员访问特点之成员变量

class Demo2_Polymorphic{
    public static void main(String[] args){
        Father f = new Son();
        System.out.println(f.num);
        Son s = new Son();
        System.out.println(s.num);
    }

}

/*
成员变量
编译看左边(父类),运行看左边(父类)
*/
class Father{
    int num = 10;
}

class Son extends Father{
    int num = 20;
}

输出结果:10;20
内存图解

### 多态成员访问特点总结 #### 成员变量多态的情况下,成员变量访问依赖于 **编译时类型**(即声明变量时使用的类型)。无论实际运行时的对象是什么类型,成员变量始终按照声明类型的定义进行访问。这是因为成员变量不存在重写机制,其值仅取决于声明时的类型。 例如,在 `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
发出的红包

打赏作者

左绍骏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值