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

Java继承底层原理:子类到底继承了父类的什么?private成员也能继承?

子类能调用父类的private成员变量吗?不能。那private变量到底有没有被继承?很多人会答错。

今天这篇文章,从内存层面把Java继承的底层原理讲清楚,包括不同成员的继承规则、虚方法表机制、内存分配逻辑。

一、继承的核心误区:能调用不等于能继承

很多人用“爸爸的钱儿子能用就是继承”来理解继承,这是错的。

真正的继承是:父类有的,子类也有一份。能调用,只是子类没有时可以使用父类的内容。

正确类比:父亲会武功,儿子也学会(拥有)这份武功,才是继承。

二、不同成员,继承规则不同

成员类型能否被继承能否直接调用说明
构造方法❌ 不能✅ 能(通过super)名称必须同类名
成员变量✅ 能非私有✅ 私有❌private变量也能继承,只是不能直接调用
虚方法✅ 能✅ 能非final、非static、非private的普通方法
final方法❌ 不能✅ 能不能重写
static方法❌ 不能✅ 能属于类
private方法❌ 不能❌ 不能完全隔离

重点:private成员变量也能被子类继承,只是无法直接访问,需要通过父类提供的get/set方法操作。

三、继承结构的内存分配

类加载顺序

创建子类对象时,先加载父类字节码,再加载子类字节码。多级继承从顶级父类(Object)开始逐级加载。

堆内存对象结构

new创建子类对象时,堆中的对象空间会被一分为二

  • 左侧:存储从父类继承过来的成员变量

  • 右侧:存储子类独有的成员变量

所有属性先完成默认初始化,再依次赋值。

示例:

class Person { private String name; private int age; } class Student extends Person { String grade; } // 创建对象 Student stu = new Student(); stu.name = "小丹丹"; // 给父类继承来的name赋值 stu.age = 19; // 给父类继承来的age赋值 stu.grade = "二年级"; // 给子类自己的grade赋值

堆中Student对象包含三块数据:name、age、grade。private修饰的name和age确实在对象里,只是子类不能直接访问。

四、虚方法和虚方法表

虚方法:非final、非static、非private修饰的普通成员方法。日常开发中大部分方法都是虚方法。

虚方法表机制

每个类都维护一张虚方法表,存储本类所有虚方法的内存地址。

继承时,子类会复制父类的虚方法表,然后在表末尾添加自己的虚方法。

重写的本质:子类重写父类虚方法时,替换虚方法表中对应方法的地址。调用时直接查表取地址,不需要遍历继承链。

Object类有几个虚方法?

Object类中共有5个虚方法:clone()equals()hashCode()notify()toString()getClass()wait()等方法被final修饰,不是虚方法。

五、final和static方法的调用原理

final方法

  • 编译期:编译器遍历继承链,确定方法所在类,记录地址

  • 运行期:直接执行编译期确定的方法

static方法

  • 编译期:编译器遍历继承链确定方法所在类后,自动将对象调用转为类名调用

  • 运行期:直接执行

建议:直接用类名.方法名()调用静态方法,避免编译器额外转换,提升效率。

六、虚方法表设计思想:空间换时间

虚方法调用频率极高。如果每次调用都遍历继承链查找,性能会很差。

虚方法表用少量额外内存存储所有虚方法地址,调用时直接查表,大幅提升运行效率。

现代计算机内存充足,牺牲少量空间换运行效率,性价比极高。

七、知识点总结

概念核心要点
继承本质子类拥有父类成员的副本,而非仅能调用
private变量能被继承,但不能直接访问
类加载顺序先父类后子类,多级继承从Object开始
堆对象结构父类属性和子类属性分开存储
虚方法非final、非static、非private的普通方法
虚方法表存储虚方法地址,子类继承后添加自己的虚方法
重写本质替换虚方法表中的方法地址
设计思想空间换时间,牺牲内存换运行效率
http://www.jsqmd.com/news/662109/

相关文章:

  • 主成分怎么做:SPSSAU软件操作步骤与结果解读
  • 伪代码符号命名:从规范到实践,提升论文可读性与严谨性
  • ParsecVDisplay虚拟显示器解决方案:如何为Windows系统添加高性能虚拟显示
  • 基于STM32与LabVIEW的串口通信协议解析与波形显示实战(二)—— 状态机编程精讲
  • 英雄联盟智能助手LeagueAkari:3个核心功能解决游戏痛点
  • [RISC-V][实战]在CH32V407上构建LVGL8.2图形界面:从零开始的移植与优化
  • 2026 年强制执行律师事务所 Top排名及业务实力展示
  • Zotero-OCR插件高级配置与常见问题深度解析
  • GetQzonehistory:一键拯救你消失的QQ空间记忆
  • 3000+科研图标免费下载:Bioicons如何让科学可视化变得简单?
  • 在Windows上直接运行Android应用:APK Installer让你告别模拟器
  • 如何彻底告别AutoCAD字体缺失烦恼?FontCenter终极解决方案完整指南
  • G-Helper深度解析:华硕笔记本轻量级性能控制工具的技术实现与实战指南
  • 阿里妈妈-AI应用算法-暑期实习招聘
  • ImageToSTL:将平面图片转化为可触摸的3D浮雕模型
  • 企业 AI 成本优化为什么要先做任务分层
  • 从分子结构到智能药物发现:RDKit化学信息学实战指南
  • GNSS定位精度提升:从误差源到高精定位技术演进
  • Audacity音频编辑实战:从零基础到专业级创作的完整路径
  • (七)平台规则引擎介绍
  • YgoMaster:构建专属游戏王决斗环境的实战手册
  • Windows Cleaner:彻底解决C盘空间不足的终极指南
  • WebUI页面结构
  • [逆向工程]160个CrackMe入门实战之aLoNg3x.2解析(七)
  • 重新定义企业级PDF处理:Poppler Windows预编译包的技术哲学与架构价值
  • 如何用Path of Building打造完美流放之路角色:离线Build规划终极指南
  • OpenClaw如何部署?2026年4月本地配置Coding Plan零基础指南
  • 题目一: 准备生日礼物 100分
  • Uncle小说桌面阅读器:打造你的私人数字图书馆,掌握全网小说自由
  • fre:ac音频转换器:免费跨平台的终极音频转换指南