0

0

在Java里构造方法是否参与多态_Java对象创建机制说明

P粉602998670

P粉602998670

发布时间:2026-01-29 13:48:09

|

308人浏览过

|

来源于php中文网

原创

构造方法不参与多态,因其无法被重写且调用由编译期静态决定;JVM根据new后的类名直接绑定构造器,不经过虚方法分派,全程无动态绑定。

在java里构造方法是否参与多态_java对象创建机制说明

构造方法不参与多态,因为根本没机会被重写或动态绑定

Java 中的构造方法 public MyClass()MyClass(String s) 等,从语法上就不支持 override:它没有返回类型(连 void 都不能写),也不能加 @Override 注解。JVM 在对象实例化时,会根据 new 后面的字面类名(如 new SubClass())**静态决定调用哪个构造器**,而不是看引用类型或运行时实际类型。所以谈不上“多态”——压根没进入虚方法分派流程。

常见错误现象:
– 试图在子类中用 @Override 标记构造方法 → 编译报错 Method does not override method from its superclass
– 以为 Parent p = new Child(); 会触发父类构造器的“多态调用” → 实际是先调 Child(),再隐式或显式调 super(),全程静态解析

构造器链本质是编译期确定的静态调用序列

每个构造方法第一行(除非显式写了 this(...)super(...))都会自动插入 super()。这个 super() 调用的目标构造器,在编译时就锁死了——比如 Child() 里调的 super(),永远指向 Parent(),哪怕后续 Parent 类被修改或存在多个重载版本,只要签名匹配,就是它。

  • 参数差异直接影响能否编译通过:若 Parent 只有 Parent(int),而 Child() 默认插 super() 就会报错 Constructor Parent() is undefined
  • 如果手动写 super("abc"),则绑定到 Parent(String);写 this(42) 则跳转到本类另一个构造器 —— 这些全是编译期决策,和运行时对象无关
  • 性能上无虚调用开销,但代价是灵活性归零:无法像普通方法那样靠子类重写改变行为

真正影响对象创建结果的是构造器执行顺序,不是多态

对象创建过程严格遵循“由父到子、由上到下”的初始化顺序:
1. 分配内存(此时字段为默认值:0 / null / false)
2. 调用父类构造器(递归向上直到 Object()
3. 执行当前类字段初始化语句(如 int x = 5;
4. 执行当前构造器剩余代码块

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

Tago AI
Tago AI

AI生成带货视频,专为电商卖货而生

下载

这导致一个关键陷阱:
– 若父类构造器中调用了可被子类重写的方法(如 init()),该调用会走到子类实现,但此时子类字段尚未初始化(仍为默认值)→ 常见于 Spring Bean 初始化或自定义控件构建场景
– 示例:Parent() { init(); } + Child() { super(); int value = 10; } + Child.init() { System.out.println(value); } → 输出 0,而非 10

想实现类似“构造多态”的效果,得绕过构造器本身

如果业务需要根据参数/配置动态选择初始化逻辑,不要硬塞进构造器。更合理的方式是:

  • 用静态工厂方法:public static MyService createForEnv(String env) { return "prod".equals(env) ? new ProdService() : new MockService(); }
  • 用 Builder 模式:把复杂判断放在 build() 内部,构造器保持精简、无逻辑
  • 依赖注入容器(如 Spring)接管实例化:通过 @Profile@Conditional 控制 Bean 创建路径,而非靠 Java 语言机制

强行在构造器里做分支判断(如 if (type == A) {...} else {...})会让类职责混乱,也掩盖了对象状态不一致的风险 —— 构造器唯一该干的事,是确保对象进入“可用”状态,而不是做策略分发。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

115

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

30

2026.01.26

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

463

2023.08.02

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

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

236

2023.09.22

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

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

458

2024.03.01

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

778

2023.08.22

java多态详细介绍
java多态详细介绍

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

15

2025.11.27

java多态详细介绍
java多态详细介绍

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

15

2025.11.27

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

1

2026.01.29

热门下载

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

精品课程

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

共23课时 | 3万人学习

C# 教程
C# 教程

共94课时 | 7.9万人学习

Java 教程
Java 教程

共578课时 | 52.8万人学习

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

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