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

为什么this与super不能出现在同一构造器的原因

在 Java 中,this()super() 不能同时出现在同一个构造器中,因为它们都必须作为构造器的第一条语句,而一个构造器的第一条语句只能有一个。以下是详细解释和示例:


⚠️ 核心规则

  1. 只能二选一
    每个构造器的第一条语句必须是 this()(调用本类其他构造器)或 super()(调用父类构造器),不能同时存在。
  2. 默认的 super()
    如果构造器中既没有显式写 this() 也没有 super(),编译器会默认插入 super()(调用父类的无参构造器)。

📝 正确示例

class Animal {public Animal(String name) {System.out.println("Animal构造器: " + name);}
}class Dog extends Animal {// 主构造器(显式调用父类构造器)public Dog(String name) {super(name); // 必须放在第一行System.out.println("Dog构造器");}// 无参构造器 → 调用本类的有参构造器public Dog() {this("默认狗名"); // 调用本类的 Dog(String name)}
}

错误示例

class Cat extends Animal {public Cat() {super("猫"); // 正确:调用父类构造器this("小黑"); // 错误!this() 必须在第一行,且不能与 super() 共存}public Cat(String name) {// 错误!既没有 this() 也没有 super(),编译器会默认插入 super(),// 但父类 Animal 没有无参构造器,导致编译错误!}
}

🔍 关键点总结

  1. 初始化顺序

    • 如果构造器中用 this() 调用本类其他构造器,被调用的构造器最终必须调用 super()(直接或间接)。
    • 父类构造器的逻辑总是先于子类构造器执行。
  2. 父类无默认构造器的陷阱

    • 如果父类没有无参构造器,子类构造器必须显式调用有参的 super(参数),否则会编译错误。
  3. 代码复用

    • 通过 this() 集中初始化逻辑,避免重复代码。
    • 通过 super() 确保父类正确初始化。

🌰 进阶示例

class Parent {public Parent(int x) {System.out.println("Parent构造器: x=" + x);}
}class Child extends Parent {public Child() {this(10); // 调用本类的 Child(int x)}public Child(int x) {super(x); // 调用父类的 Parent(int x)System.out.println("Child构造器: x=" + x);}
}
  • 执行 new Child() 的输出
    Parent构造器: x=10
    Child构造器: x=10
    

总结

  • this()super() 是互斥的,只能选其一作为构造器的第一条语句。
  • 合理使用 this()super() 可以优化代码结构,确保对象初始化的正确性。
http://www.xdnf.cn/news/620.html

相关文章:

  • 计算机视觉与深度学习 | Transformer原理,公式,代码,应用
  • 深度解析算法之前缀和
  • 【中间件】nginx将请求负载均衡转发给网关,网关再将请求转发给对应服务
  • 26考研 | 王道 | 数据结构 | 第六章 图
  • 重构之去除多余的if-else
  • AWS Linux快速指南:5分钟搭建多用户图形界面
  • Unity游戏开发实战:从PlayerPrefs到JSON,精通游戏存档与加载机制
  • 软件测试的页面交互标准:怎样有效提高易用性
  • [ 春秋云镜 ] — Time 仿真场景
  • 第1期:Python基础语法入门
  • 前端面试的话术集锦第 25 篇博文——CSS面试题上
  • 在 Windows 8/10/11 上运行Windows7的经典游戏(扫雷 蜘蛛纸牌等)
  • (eNSP)Super Vlan配置
  • PKI 公钥基础设施
  • NHANES指标推荐:WWI
  • WSL 升级报错
  • BR_频谱20dB 带宽(RF/TRM/CA/BV-05-C [TX Output Spectrum – 20 dB Bandwidth])
  • 机械设计【】技术要求(实际使用)
  • 测试第四课---------性能测试
  • Gnome修改windows titlebar的主题
  • js day3
  • linux操作系统学习之---进程优先级和进程切换与调度
  • 【Harmony】文本公共接口EditMenuOptions的使用
  • ProfibusDP转ModbusRTU网关如何连接流量计?
  • SQL注入简述
  • Rabbitmq集群重启操作
  • 01.01、判定字符是否唯一
  • HFSS3(limy)——建模学习记录
  • 解决echarts饼图label显示不全的问题
  • C++基础概念补充3—分离式编译