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

news/2025/1/11 1:17:52/

在 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 {@Overridevoid 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.ppmy.cn/news/1562109.html

相关文章

C语言——文件IO 【文件IO和标准IO区别,操作文件IO】open,write,read,dup2,access,stat

1.思维导图 2.练习 1:使用C语言编写一个简易的界面,界面如下 1:标准输出流 2:标准错误流 3:文件流 要求:按1的时候,通过printf输出数据,按2的时候,通过p…

CAN总线入门指南:从原理到实践

1 CAN通信基础概述 CAN(Controller Area Network)是一种串行通信协议,由德国BOSCH公司于1986年专门为汽车分布式控制系统开发。它最初的目标是减少汽车中的线束数量,降低整车重量和成本。经过30多年的发展,CAN已经成为…

【Maui】导航栏样式调整

前言 .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML 创建本机移动和桌面应用。 使用 .NET MAUI,可从单个共享代码库开发可在 Android、iOS、macOS 和 Windows 上运行的应用。 .NET MAUI 是一款开放源代码应用,是 X…

五个不同类型的数据库安装

一在线YUM仓库 1.打开MySQL官方首页,在该页面中找到【DOWNOADS】选项卡,点击进入下载页面。 2.在下载页面中,我们可以看到不同版本的下载链接,我们这里选择【MySQL Community(GPL) Downloads】链接进入社区版下载页面 3.点击【My…

CES 2025|美格智能高算力AI模组助力“通天晓”人形机器人震撼发布

当地时间1月7日,2025年国际消费电子展(CES 2025)在美国拉斯维加斯正式开幕。美格智能合作伙伴阿加犀联合高通在展会上面向全球重磅发布人形机器人原型机——通天晓(Ultra Magnus)。该人形机器人内置美格智能基于高通QC…

江科大STM32入门——UART通信笔记总结

wx:嵌入式工程师成长日记 1、简介 简单双向串口通信有两根通信线(发送端TX和接收端RX)TX与RX要交叉连接当只需单向的数据传输时,可以只接一根通信线当电平标准不一致时,需要加电平转换芯片 传输模式:全双工;时钟&…

计算机网络之---网络层的基本功能

网络层简述 网络层(Network Layer)是OSI(开放系统互联)模型的第三层,主要负责将数据包从源主机传输到目的主机,处理数据传输过程中的路由选择、寻址和分段等任务。网络层的主要目的是确保数据能够从源设备准…

【集成学习】Boosting算法详解

文章目录 1. 集成学习概述2. Boosting算法详解3. Gradient Boosting算法详解3.1 基本思想3.2 公式推导 4. Python实现 1. 集成学习概述 集成学习(Ensemble Learning)是一种通过结合多个模型的预测结果来提高整体预测性能的技术。相比于单个模型&#xf…