0

0

Java中子类实例化时父类构造器的执行过程_Java继承链

P粉602998670

P粉602998670

发布时间:2026-03-06 13:40:01

|

325人浏览过

|

来源于php中文网

原创

是的,子类new时父类构造器一定被调用;jvm强制插入super()调用,若父类无无参构造器则需显式调用super(...),且super()必须位于第一行。

java中子类实例化时父类构造器的执行过程_java继承链

子类 new 时父类构造器一定被调用吗

是的,只要父类有可访问的构造器(哪怕没显式写 super()),JVM 就会强制插入对父类构造器的调用。这不是“建议”,是字节码层面的硬性规则——javac 编译时自动补全,不补就编译失败。

常见错误现象:Implicit super constructor XXX() is undefined. Must explicitly invoke another constructor。这说明父类没有无参构造器,而子类又没写 super(...),编译器找不到能插的默认调用点。

  • 父类只有带参构造器 → 子类构造器第一行必须显式写 super(…)
  • 父类有无参构造器(哪怕 private)→ 编译器自动插 super(),但若为 private,运行时抛 IllegalAccessError
  • 父类构造器抛异常 → 整个子类实例化失败,不会执行子类构造器后续代码

super() 必须放在第一行的原因

这是 JVM 校验规则:对象内存布局在调用任何构造器前已分配(但未初始化),必须由最顶层父类构造器开始逐层“激活”字段和逻辑。如果允许 super() 在中间,意味着子类代码可能读取未初始化的父类字段,破坏内存安全。

使用场景:想在调用父类构造器前做参数预处理?不行。但可以封装成静态方法,再传给 super()

立即学习Java免费学习笔记(深入)”;

class Child extends Parent {
    Child(String raw) {
        super(process(raw)); // ✅ 允许:process() 是静态方法,不依赖 this
    }
    private static String process(String s) { return s.trim(); }
}

容易踩的坑:this.xxxinstanceof、非静态方法调用都不能出现在 super() 前——此时 this 还未完成父类初始化,JVM 直接拒绝。

通义灵码
通义灵码

阿里云出品的一款基于通义大模型的智能编码辅助工具,提供代码智能生成、研发智能问答能力

下载

多层继承中构造器的调用顺序

从 Object 开始,按继承链自顶向下执行:Object → 父类 → 子类。每层只调自己那一级的构造器体,不跳过、不合并、不优化。

性能影响:深度继承链会增加构造开销,尤其当某层构造器做了重操作(如 I/O、反射)。但一般不影响正确性。

  • 构造器链是线性的,不是树形:即使子类有多个构造器,每个都只触发一条向上的链
  • 字段初始化时机:父类字段在对应父类构造器执行期间赋值;子类字段在子类构造器执行期间赋值(哪怕字段声明在类开头)
  • 如果某层构造器被 final 修饰,不影响调用顺序,只禁止子类覆盖

父类构造器里调用被子类重写的方法会怎样

会调到子类的重写版本,但此时子类字段还是默认值(null0false)。这是最危险的陷阱之一,常导致 NPE 或逻辑错乱。

示例:

class Parent {
    String name = "parent";
    Parent() {
        printName(); // 实际调 Child.printName()
    }
    void printName() { System.out.println(name); }
}
class Child extends Parent {
    String name = "child"; // ✅ 字段已声明,但尚未赋值
    Child() { super(); }
    @Override void printName() { System.out.println(name); } // 输出 null
}

根本原因:方法调用是动态绑定的,而字段赋值是静态顺序执行的。父类构造器运行时,子类字段还没走到自己的赋值语句。

容易被忽略的地方:这个行为和语言无关(Java/C#/Kotlin 都如此),也不是 bug,是面向对象模型的固有特性。修复方式只有两个:把方法设为 final,或把逻辑移到构造完成后的初始化方法里。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Kotlin协程编程与Spring Boot集成实践
Kotlin协程编程与Spring Boot集成实践

本专题围绕 Kotlin 协程机制展开,深入讲解挂起函数、协程作用域、结构化并发与异常处理机制,并结合 Spring Boot 展示协程在后端开发中的实际应用。内容涵盖异步接口设计、数据库调用优化、线程资源管理以及性能调优策略,帮助开发者构建更加简洁高效的 Kotlin 后端服务架构。

121

2026.02.12

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

252

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1029

2024.03.01

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

58

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

63

2025.11.27

undefined是什么
undefined是什么

undefined是代表一个值或变量不存在或未定义的状态。它可以作为默认值来判断一个变量是否已经被赋值,也可以用于设置默认参数值。尽管在不同的编程语言中,undefined可能具有不同的含义和用法,但理解undefined的概念可以帮助我们更好地理解和编写程序。本专题为大家提供undefined相关的各种文章、以及下载和课程。

6157

2023.07.31

网页undefined是什么意思
网页undefined是什么意思

网页undefined是指页面出现了未知错误的意思,提示undefined一般是在开发网站的时候定义不正确或是转换不正确,或是找不到定义才会提示undefined未定义这个错误。想了解更多的相关内容,可以阅读本专题下面的文章。

3307

2024.08.14

网页undefined啥意思
网页undefined啥意思

本专题整合了undefined相关内容,阅读下面的文章了解更多详细内容。后续继续更新。

1571

2025.12.25

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

1

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.2万人学习

C# 教程
C# 教程

共94课时 | 10.8万人学习

Java 教程
Java 教程

共578课时 | 77.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号