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

在Java里final修饰符在继承中如何使用_Java类与方法不可继承解析

千雪吖_7200

千雪吖_7200

发布时间:2026-02-17 12:26:03

|

756人浏览过

|

来源于php中文网

原创

final类不能被继承,因为JVM在加载时直接禁止子类符号引用解析,编译阶段即报错“cannot inherit from final class”,属字节码层面设计约束,非运行时限制。

在java里final修饰符在继承中如何使用_java类与方法不可继承解析

final类为什么不能被继承

因为JVM在加载final类时会直接禁止子类符号引用的解析,编译阶段就会报错java: cannot inherit from final class。这不是运行时限制,而是字节码层面的设计约束。

常见误操作:想用final类做基类再抽一个抽象父类出来——不行,final类连继承链起点都不能当。

  • 适用场景:工具类(如java.lang.String)、安全敏感类、明确不希望行为被修改的实体类
  • 注意:final类里的private成员仍可被自身方法访问,但子类根本不存在,所以“隐藏”和“覆盖”都无从谈起
  • 如果后续需要扩展,只能组合(has-a)而非继承(is-a)

final方法在子类中能否重写

不能。即使子类没声明final,只要父类方法是final,子类里写同签名方法会被编译器拒绝,错误信息是java: override not allowed for final method。

典型例子:Object.clone()不是final,但很多标准类(如LocalDateTime)把它声明为final来禁用克隆。

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

  • 常用于模板方法模式中的钩子方法锁定,比如AbstractList里set()是final,强制子类只实现get()和size()
  • 和@Override注解不冲突,但加了也没用——编译器根本不给你重写的机会
  • 性能上,JVM可能对final方法做内联优化,但这不是主要设计目的

final字段在继承中的初始化陷阱

子类构造过程中,父类final字段必须在父类构造器结束前完成赋值,否则编译报错java: variable xxx might not have been initialized。

容易踩坑的是:在父类构造器里调用子类重写的方法(哪怕该方法不是final),此时子类字段还未初始化,而父类final字段又依赖这个调用结果——会导致读到默认值或null。

  • final字段可以是编译期常量(static final int X = 1;),也可以是实例级(必须在构造器/初始化块中赋值)
  • 子类无法给父类final字段赋新值,哪怕用反射强行修改,也会破坏final语义,且高版本JDK会抛IllegalAccessException
  • 如果父类final字段类型是可变对象(如final List),子类仍可通过引用修改其内容——final只锁引用,不锁状态

接口里能用final修饰方法吗

不能。Java 8+ 接口允许default和static方法,但不允许final——语法直接报错java: modifier final not allowed here。

原因很实在:接口定义契约,不提供实现;而final意味着“不可覆盖”,这和接口要求实现类自由提供具体逻辑的设计哲学冲突。

  • 如果想约束实现,用抽象类替代接口,再把关键方法标final
  • 接口中的变量默认就是public static final,显式写final多余,但不报错
  • Java 17+ 密封类(sealed)提供了比final更细粒度的继承控制,适合替代部分final类的使用场景
真正难处理的不是final本身,而是它和构造顺序、多态调用、反射之间的隐含冲突——这些地方不写代码跑一遍,光看定义很容易误判。

热门AI工具

更多
豆包大模型

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

DeepSeek

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

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

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

WorkBuddy

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

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

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

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

二狗PPT
二狗PPT Hot

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

相关专题

更多
string转int
string转int

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

6699

2023.08.02

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

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

549

2023.09.22

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

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

1698

2024.03.01

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6164

2023.10.24

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

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

355

2025.11.27

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

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

355

2025.11.27

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

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

355

2025.11.27

string转int
string转int

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

6699

2023.08.02

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

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

100

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