讲师中心 微信公众号
AI工具推荐 视频效率加速

Java类设计与继承结构的最佳实践

雨伟小哥_5965

雨伟小哥_5965

发布时间:2026-01-12 16:34:03

|

791人浏览过

|

来源于php中文网

原创

子类不该覆盖父类的public方法,除非明确设计为可重写;应优先用组合代替继承,避免构造器中调用可重写方法,并根据是否需共享状态选择接口或抽象类。

java类设计与继承结构的最佳实践

子类不该覆盖父类的 public 方法,除非明确设计为可重写

Java 中 public 方法默认是“开放扩展点”,但多数业务类并非为继承而设计。如果父类没用 @Override 注解标记、也没在 Javadoc 里写明“此方法可被子类重写”,那它大概率不是契约的一部分。

常见错误现象:NullPointerException 出现在子类重写的 toString() 里,只因父类构造器中调用了该方法(此时子类字段尚未初始化);或重写 hashCode() 却没同步改 equals(),导致 HashSet 行为异常。

  • 判断依据:看父类是否声明了 final,或是否在构造器中调用该方法
  • 安全做法:把可重写的方法显式标为 protected,或加 @Override + 完整 Javadoc 说明契约
  • IDE 提示不等于安全——IntelliJ 默认允许重写 public 方法,但 javac 不校验语义合理性

用组合代替继承,尤其当“is-a”关系不稳固时

比如 Employee 类继承 Person 看似合理,但一旦业务要求“兼职学生员工”同时有 Student 和 Employee 属性,单继承立刻失效。这时 Employee 应持有 Person 实例,而非继承它。

使用场景:需要复用逻辑但又不想暴露父类接口、需运行时切换行为(如策略模式)、或父类来自第三方 SDK(无法修改)。

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

  • 组合的关键是把依赖声明为 private final Person person;,而非 extends Person
  • 不要为了“少写几行代码”而选继承——多写几个委托方法(getName() { return person.getName(); })换来的是长期可维护性
  • 注意 Liskov 替换原则失效的信号:子类必须重写父类某个方法才能让逻辑正确,这往往意味着继承关系建模错误

抽象类 vs 接口:优先选接口,除非需要共享状态或默认实现逻辑

Java 8+ 允许接口含 default 方法,但接口仍不能定义实例字段。如果多个子类必须共用一个 private int retryCount; 或缓存 Map,抽象类更合适;否则一律用接口。

参数差异:interface 支持多实现,abstract class 只能单继承;接口方法默认 public abstract,抽象类方法可设 protected 或包私有。

  • 性能影响极小,但接口更利于 mock 测试(无需构造抽象类实例)
  • 避免在接口里塞太多 default 方法——它容易演变成“伪抽象类”,破坏接口的契约纯粹性
  • 如果已有抽象类且新增功能只需默认实现,别急着改成接口:迁移成本(所有实现类要改 implements → extends)可能远超收益

构造器中禁止调用可被重写的方法

这是 Java 继承中最隐蔽的陷阱。父类构造器执行时,子类字段还未初始化,此时若调用被子类重写的方法,会访问到未初始化的字段,结果是 null 或 0,且无编译警告。

public class Parent {
    public Parent() {
        init(); // 危险!子类可能重写了 init()
    }
    public void init() { /* do something */ }
}
<p>public class Child extends Parent {
private String data = "ready";
@Override
public void init() {
System.out.println(data.length()); // NullPointerException!
}
}
  • 修复方式:把 init() 改成 private 或 final,或拆出静态工厂方法分两步构造
  • IDEA 能检测此类问题(提示 “Call to possibly-overridden method in constructor”),但 Eclipse 默认不启用
  • Spring 的 @PostConstruct 就是为绕过这个限制而生——它在对象完全构造后才回调,但仅适用于受容器管理的 Bean

真正难的不是写出能跑的继承结构,而是每次加一个 extends 前,能意识到自己正在给未来埋下多少不可测的耦合点。

热门AI工具

更多
二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

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

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

2631

2025.08.06

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

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

477

2026.01.26

eclipse教程
eclipse教程

php中文网为大家带来eclipse教程合集,eclipse是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。php中文网还为大家带来eclipse的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

670

2023.06.14

eclipse怎么设置中文
eclipse怎么设置中文

eclipse设置中文的方法:除了设置界面为中文外,你还可以为Eclipse添加中文插件,以便更好地支持中文编程。例如,你可以安装EBNF插件来支持中文变量名,或安装Chinese Helper来提供中文帮助文档。本专题为大家提供eclipse设置中文相关的各种文章、以及下载和课程。

5566

2023.07.24

c语言编程软件有哪些
c语言编程软件有哪些

c语言编程软件有GCC、Clang、Microsoft Visual Studio、Eclipse、NetBeans、Dev-C++、Code::Blocks、KDevelop、Sublime Text和Atom。更多关于c语言编程软件的问题详情请看本专题的文章。php中文网欢迎大家前来学习。

8579

2023.11.02

Eclipse版本号有哪些区别
Eclipse版本号有哪些区别

区别:1、Eclipse 3.x系列:Eclipse的早期版本,包括3.0、3.1、3.2等;2、Eclipse 4.x系列:Eclipse的最新版本,包括4.0、4.1、4.2等;3、Eclipse IDE for Java Developers等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2804

2024.02.23

eclipse和idea有什么区别
eclipse和idea有什么区别

eclipse和idea的区别:1、平台支持;2、内存占用;3、插件系统;4、智能代码提示;5、界面设计;6、调试功能;7、学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

642

2024.02.23

eclipse设置中文全教程
eclipse设置中文全教程

本专题整合了eclipse设置中文相关教程,阅读专题下面的文章了解更多详细操作。

3586

2025.10.10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn