0

0

Java继承(Inheritance)怎么写_extends关键字与代码复用

P粉602998670

P粉602998670

发布时间:2026-03-12 11:06:12

|

915人浏览过

|

来源于php中文网

原创

java中extends实现单继承,需注意构造器调用顺序、访问控制、private不可继承等规则,滥用会导致高耦合;应基于“is-a”关系审慎设计。

java继承(inheritance)怎么写_extends关键字与代码复用

Java里用extends写继承,不是加个关键字就完事

Java中extends确实是最直接的继承语法,但写错位置、忽略访问控制或搞混构造器调用顺序,代码立刻编译失败或行为异常。最常见的是子类忘了显式调用父类构造器,或者把private成员当成了可继承资源。

  • extends只能跟在类名后、类体前,且一个类最多extends一个父类(Java不支持多继承)
  • 父类的private字段和方法不会被继承——子类里看不到,也不能用super.xxx访问
  • 如果父类只有带参构造器,子类必须在第一行写super(...),否则编译报错:Constructor Xxx() is undefined
  • 子类重写方法时,不能降低访问权限(比如父类是protected,子类不能改成private

什么时候该用继承,而不是组合或接口

继承本质是“is-a”关系,不是“has-a”或“can-do”。滥用extends会让类耦合变紧,改父类就容易牵一发而动全身。

  • 适合继承:比如DogAnimal的一种,共享生命周期、行为框架;ArrayListAbstractList的具体实现
  • 不适合继承:比如CarEngine,该用字段组合,而不是让Car extends Engine——这明显违背常识
  • 优先考虑interface + 默认方法:需要多行为扩展时(如RunnableComparable),比单继承更灵活

super不是万能转发器,用错会触发空指针或逻辑错乱

super只在子类中有效,且仅用于访问父类中被子类覆盖或隐藏的成员。它不等于“父类实例”,也不是运行时动态绑定的代理对象。

智简简历
智简简历

免费AI简历制作工具,智能生成、可视化编辑、多格式导出。

下载
  • 在子类构造器中,super()必须是第一行语句;否则编译报错:Call to super() must be first statement in constructor
  • super.toString()调用的是父类版本,但如果父类toString()依赖了未初始化的字段,可能返回null或默认值
  • 不能在static上下文中用super——super属于实例,而static属于类
  • 如果父类方法被final修饰,super.xxx()可以调用,但子类无法重写它

继承链过深会让instanceof和类型转换变得脆弱

三层以上继承(比如A → B → C → D)会让类型判断和向下转型越来越难维护。JVM虽然支持,但人脑容易漏掉中间层约束。

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

  • instanceof检查的是实际运行时类型,不是声明类型;但若父类引用指向子类实例,instanceof仍返回true
  • 强制转型前务必先instanceof检查,否则抛ClassCastException
  • 泛型擦除后,List<string></string>List<integer></integer>在运行时都是List,继承关系无法靠泛型体现
  • 工具类如Objects.equals()内部用了instanceof,但自己写等价逻辑时容易忽略子类字段是否参与比较
继承本身很简单,难的是判断“这里到底该不该继承”。很多人卡在编译错误上,其实问题早出现在设计阶段——是不是把“能用”当成了“该用”。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
string转int
string转int

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

1010

2023.08.02

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

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

254

2023.09.22

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

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

1089

2024.03.01

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

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

254

2023.09.22

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

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

1089

2024.03.01

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

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

254

2023.09.22

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

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

1089

2024.03.01

java多继承如何实现
java多继承如何实现

本专题整合了java多继承相关内容以及教程,阅读专题下面的文章了解更多详细内容。

34

2025.10.28

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

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

精品课程

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

共23课时 | 4.3万人学习

C# 教程
C# 教程

共94课时 | 11.2万人学习

Java 教程
Java 教程

共578课时 | 81万人学习

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

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