当前位置: 首页 > article >正文

【多态】理解 Java 继承中成员变量与成员方法的访问特点

在 Java 的面向对象编程中,继承是一种核心机制,通过它可以实现代码复用和扩展。然而,在继承中,成员变量成员方法的访问规则却有所不同。本文将详细分析这些规则,并探讨为什么 Java 选择了这样的设计。


一、成员变量的访问特点

1. 规则

成员变量的访问依赖于编译时类型,即 等号左边的类型(声明的类型)。无论对象实际是哪个类型,访问的变量始终是由编译时类型决定的。

2. 示例代码

class Parent {
    int num = 10; // 父类中的成员变量
}

class Child extends Parent {
    int num = 20; // 子类中的成员变量
}

public class Demo {
    public static void main(String[] args) {
        Parent p = new Child(); // 向上转型
        System.out.println(p.num); // 输出什么?
    }
}

输出结果10

原因

  • p的编译时类型是 Parent,所以访问的是父类中的 num 变量,值为 10
  • 成员变量的访问由编译时类型决定,不支持运行时绑定。

二、成员方法的访问特点

1. 规则

成员方法的访问依赖于运行时类型,即 new 的对象类型。方法调用支持动态绑定,优先调用实际对象类型中的方法。

2. 示例代码

class Parent {
    void show() {
        System.out.println("Parent show");
    }
}

class Child extends Parent {
    @Override
    void show() {
        System.out.println("Child show");
    }
}

public class Demo {
    public static void main(String[] args) {
        Parent p = new Child(); // 向上转型
        p.show(); // 输出什么?
    }
}

输出结果Child show

原因

  • 虽然 p 的编译时类型是 Parent,但实际创建的对象是 Child
  • 方法调用支持动态绑定,因此运行时会调用子类 Child 中覆盖的 show() 方法。

三、综合对比:成员变量与成员方法的访问特点

特点成员变量成员方法
访问依据编译时类型(等号左边)运行时类型(new 的对象)
动态绑定不支持动态绑定支持动态绑定
多态作用无多态效果支持多态

四、设计背后的原因

1. 成员变量为何由编译时类型决定?

成员变量的访问不支持动态绑定,主要出于以下原因:

  • 性能考虑:成员变量是对象的直接存储空间,访问时不涉及复杂的运行时绑定。编译器在编译阶段即可确定变量的存储位置,优化访问效率。

  • 避免二义性:如果成员变量支持动态绑定,会引入访问上的歧义。例如:

    class Parent {
        int num = 10;
    }
    
    class Child extends Parent {
        int num = 20;
    }
    
    Parent p = new Child(); // 如果运行时绑定变量,这里访问哪个 num?
    

    固定规则(编译时类型决定)让变量访问更加明确。

  • 静态绑定的实现:编译器直接将变量绑定到声明类型对应的类的地址上。这种静态绑定方式简化了实现逻辑。


2. 成员方法为何由运行时类型决定?

成员方法支持动态绑定(运行时绑定),是为了实现 Java 的多态性。其背后原因如下:

  • 支持多态:方法是对象的行为,动态绑定允许子类覆盖父类的方法,父类引用调用子类的实际方法。

    Parent p = new Child();
    p.show(); // 调用子类的方法
    

    动态绑定让代码更加灵活,符合面向对象编程的核心思想“父类引用指向子类对象”。

  • 行为与对象一致:方法是描述对象行为的,需要与实际对象类型保持一致,才能体现正确的功能。

  • 动态绑定的实现:Java 在运行时通过**方法表(Method Table)**实现动态绑定。方法表记录类中所有方法的地址。当子类覆盖父类方法时,子类的方法地址会覆盖父类的方法地址。运行时,Java 根据实际对象的类型查找方法表,从而调用正确的方法。


五、总结

Java 中成员变量和成员方法的访问规则体现了语言设计的平衡性:

特性成员变量成员方法
设计目标提高访问效率、避免歧义支持多态、增强灵活性
访问决定时机编译时固定运行时动态绑定
绑定方式静态绑定(Compile-time Binding)动态绑定(Run-time Binding)

这种设计既保证了性能(变量静态绑定),又实现了灵活性(方法动态绑定),充分体现了 Java 的设计合理性。


http://www.kler.cn/a/487534.html

相关文章:

  • vue el-table 数据变化后,高度渲染问题
  • 优化提示词改善答疑机器人回答质量
  • BoltzGnu Boltztrap数据绘图脚本
  • 用户界面的UML建模11
  • 微服务组件——利用SpringCloudGateway网关实现统一拦截服务请求,避免绕过网关请求服务
  • STM32——系统滴答定时器(SysTick寄存器详解)
  • Delaunay三角刨分算法理解及c#过程实现
  • vue相关的框架和库
  • Vue前端工程化准备--NodeJS安装、Vue-cli安装与框架介绍
  • LeetCode 2185. Counting Words With a Given Prefix
  • HTTP/HTTPS ②-Cookie || Session || HTTP报头
  • Python机器学习笔记(十八、交互特征与多项式特征)
  • 2025新年源码免费送
  • 【第04阶段-机器学习深度学习篇-1-深度学习基础-深度学习介绍】
  • Angular 最新版本和 Vue 对比完整指南
  • 【C语言】_函数指针变量
  • mac 窗口工具Teleport和Rectangle
  • 微信小程序——创建滑动颜色条
  • thinkphp6.0常用设计模式实例
  • 基于滑动窗口的限流方案
  • cv2.imwrite保存的图像是全黑的
  • React PureComponent使用场景
  • 基于SpringBoot的时间管理系统设计与实现
  • Spring Boot + MyBatis Plus 存储 JSON 或 List 列表全攻略
  • matlab离线安装硬件支持包
  • WPF连接USB相机,拍照,视频 示例