在Java里如何实现继承机制_Java继承关系与应用说明
发布时间 - 2026-01-24 00:00:00 点击率:次Java继承通过extends实现单继承,子类获得父类非私有成员但不继承构造器;private成员不可访问,需getter/setter;Object是隐式父类,重写equals/hashCode/toString需遵守契约;非is-a关系应优先组合而非继承。
Java 中的继承通过 extends 关键字实现,子类自动获得父类的非私有成员(字段、方法),但不能继承构造器;这是单继承结构,一个类只能直接继承一个父类。
如何正确声明继承关系:extends 与访问修饰符的影响
子类声明必须用 extends 显式指定父类,且父类不能是 final 类。父类中 private 成员不可被继承访问,protected 和包内默认(package-private)成员在满足包/继承条件下可被子类使用。
常见错误现象:子类中调用父类 private 方法或字段时编译报错 cannot be accessed from outside its declaring class。
- 父类构造器不会被继承,但子类构造器默认会通过
super()调用父类无参构造器;若父类无无参构造器,子类必须显式写super(...) - 子类重写父类方法时,访问权限不能比父类更严格(例如父类是
protected,子类不能改为private) - 接口不能用
extends继承类,只能用implements实现;类也不能extends接口
为什么子类无法访问父类 private 成员,但能调用父类 public/protected 方法
Java 的继承是“代码复用 + 行为扩展”,不是“内存共享”。private 是编译期限制,仅限于声明该成员的类内部可见;而 public 和 protected 成员在子类编译单元中属于可访问范围。
实际场景:父类 Person 定义 private String idCard 和 protected void verify(),子类 Student 可以调用 verify(),但不能直接读写 idCard —— 若需暴露,应提供 public getter/setter。
容易踩的坑:误以为“继承 = 所有字段都可用”,结果在子类中直接引用父类 private 字段导致编译失败。
Object 是所有类的隐式父类,toString() / equals() / hashCode() 的重写要点
每个 Java 类都默认继承自 java.lang.Object,因此天然拥有 toString()、equals(Object)、hashCode() 等方法。但它们的默认实现往往不满足业务语义,必须按需重写。
关键约束:
-
equals()必须满足自反性、对称性、传递性、一致性,且对null返回false -
hashCode()与equals()必须保持契约:相等的对象必须有相同哈希值 - 重写
toString()时建议包含关键业务字段,便于调试和日志输出
public class User {
private String name;
private int age;
@Override
public boolean equals(Object o) {

if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return age == user.age && Objects.equals(name, user.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public String toString() {
return "User{name='" + name + "', age=" + age + "}";
}
}
继承 vs 组合:什么情况下不该用 extends
当子类和父类之间不是“is-a”关系(比如 “Car is-a Engine” 明显错误),或需要复用多个来源的行为时,继承就不再合适。Java 不支持多继承,强行用 extends 会导致设计僵化。
典型反模式:
- 为复用工具方法而继承
ArrayList(应组合持有List字段) - 用继承表达“具有某种能力”,如
Flyable应定义为接口,而非让Bird和Drone都继承同一个抽象类 - 父类频繁变更,导致所有子类被迫修改(违反开闭原则)
真正需要继承的信号是:子类能完全替代父类出现在任何上下文中(里氏替换原则),且语义清晰。否则优先考虑组合 + 接口实现。
# java
# access
# 工具
# 代码复用
# 为什么
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何快速重置建站主机并恢复默认配置?
使用C语言编写圣诞表白程序
Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程
网站制作价目表怎么做,珍爱网婚介费用多少?
Laravel如何升级到最新版本?(升级指南和步骤)
iOS验证手机号的正则表达式
如何快速登录WAP自助建站平台?
Laravel怎么判断请求类型_Laravel Request isMethod用法
网站制作大概多少钱一个,做一个平台网站大概多少钱?
敲碗10年!Mac系列传将迎来「触控与联网」双革新
如何在腾讯云服务器快速搭建个人网站?
Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践
高端云建站费用究竟需要多少预算?
利用JavaScript实现拖拽改变元素大小
Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践
PythonWeb开发入门教程_Flask快速构建Web应用
jQuery 常见小例汇总
Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能
Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件
如何用花生壳三步快速搭建专属网站?
如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】
Laravel如何保护应用免受CSRF攻击?(原理和示例)
如何快速搭建高效可靠的建站解决方案?
Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】
Laravel中的Facade(门面)到底是什么原理
Laravel如何实现API速率限制?(Rate Limiting教程)
网站制作企业,网站的banner和导航栏是指什么?
如何在IIS管理器中快速创建并配置网站?
网站制作免费,什么网站能看正片电影?
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程
Laravel如何使用Collections进行数据处理?(实用方法示例)
Laravel如何与Docker(Sail)协同开发?(环境搭建教程)
如何确保西部建站助手FTP传输的安全性?
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
如何将凡科建站内容保存为本地文件?
Laravel如何使用Eloquent进行子查询
Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】
Laravel如何实现API版本控制_Laravel版本化API设计方案
Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例
Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南
Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧
如何制作一个表白网站视频,关于勇敢表白的小标题?
百度浏览器如何管理插件 百度浏览器插件管理方法
Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理
北京的网站制作公司有哪些,哪个视频网站最好?
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
canvas 画布在主流浏览器中的尺寸限制详细介绍
IOS倒计时设置UIButton标题title的抖动问题


