news 2026/10/2 23:09:02

final 关键字

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
final 关键字

一、final 关键字概述

final是最终、不可改变的意思,可以用来修饰类、方法、变量。 被 final 修饰之后,内容就不能被修改,不同修饰对象效果完全不同。

二、final 修饰类

1. 核心规则

final 修饰的类叫最终类,不能被继承,没有子类,但是它可以去继承别的父类。

底层原理:为了防止类的功能被子类篡改,Java 中很多源码类都是 final 类,比如String、Integer。

2. 语法格式

// final修饰类,该类无法被继承 final class Animal{ } // 下面这行代码编译报错,final类不能被继承 // class Dog extends Animal{}

重点阐释:final 类里面所有的方法,会隐式全部带上 final 效果,但是成员变量不受 final 影响,可以正常修改。

三、final 修饰方法

1. 核心规则

final 修饰的方法叫最终方法,该方法可以被继承,但是不能被子类重写。

使用场景:如果某个方法逻辑不希望子类覆盖改写,就加上 final。

2. 代码示例

class Person{ // final修饰方法:可以被子类调用,但是不能重写 public final void sleep(){ System.out.println("人需要睡觉"); } } class Student extends Person{ // 编译报错!父类final方法不允许重写 /* @Override public void sleep() { System.out.println("学生睡觉"); } */ } public class TestFinalMethod{ public static void main(String[] args) { Student s = new Student(); s.sleep(); // 子类可以直接继承调用父类final方法 } }

注意:final 和 private 区别:

  • private私有方法,子类看不见,本质不能重写;
  • final方法子类可以继承调用,禁止重写。

四、final 修饰变量

变量被 final 修饰,就变成常量,只能赋值一次,赋值完成后不能修改。

注意:变量分为局部变量、成员变量(实例成员变量、静态成员变量),规则有差异。

1.final 修饰局部变量

局部变量:写在方法、代码块内部的变量。

  • 可以先声明,后赋值,只能赋值唯一一次;
  • 一旦赋值,不能再次修改。
public class TestFinalVar{ public static void main(String[] args) { final int a; a = 10; //第一次赋值,允许 // a = 20; //编译报错,final局部变量不能二次修改 System.out.println(a); } }

2.final 修饰实例成员变量(普通成员变量,属于对象)

实例成员变量属于对象,必须保证对象创建完成前完成唯一一次赋值。 两种赋值时机二选一:

  1. 定义的时候直接赋值
  2. 在构造方法中赋值

❗不能在普通方法里面给 final 实例成员变量赋值。

class Demo{ //方式1:定义直接赋值 final int NUM1 = 100; final int NUM2; //方式2:构造方法赋值,对象创建时完成赋值 public Demo(){ NUM2 = 200; } }

3.final 修饰静态成员变量(static final,静态常量)

static+final 共同修饰的变量,称为静态常量。

  • 属于类,直接类名。常量名访问;
  • 赋值时机:定义直接赋值 / 静态代码块赋值;
  • Java 开发规范:静态常量名字全部大写,下划线分隔。
class Constants{ //静态常量,规范大写 public static final int MAX_AGE = 150; } public class Test{ public static void main(String[] args) { System.out.println(Constants.MAX_AGE); } }

4.final 修饰引用类型变量(重点易错)

⚠️非常容易踩坑! final 修饰引用变量,引用地址不能变,但是对象内部的属性可以修改。

  • 引用变量存的是对象地址,final 保证地址不能重新指向别的对象;
  • 对象里面的成员变量不受 final 限制,可以修改。
class User{ String name; public User(String name){ this.name = name; } } public class TestFinalRef{ public static void main(String[] args) { //final修饰引用变量u,u存储对象地址 final User u = new User("小明"); u.name = "小红"; //✅允许,修改对象内部属性 System.out.println(u.name); // u = new User("小李"); //❌报错,不能修改引用地址,不能指向新对象 } }

五、final 知识点总结表格

修饰对象作用效果
final 修饰类类不能被继承;类中方法默认 final 效果
final 修饰方法方法可以继承,不能重写
final 修饰局部变量只能赋值 1 次,值不可更改
final 修饰实例成员变量对象创建前完成唯一赋值,不可修改
static final 静态常量类加载阶段赋值,全局常量,名字大写
final 修饰引用类型对象地址不可改变,对象内部内容可以修改

六、常见面试易错点

  1. final abstract能不能一起修饰类?不能!abstract 抽象类必须被继承,final 禁止继承,二者冲突。
  2. final abstract能不能修饰方法?不能!abstract 方法必须子类重写,final 禁止重写。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/2 23:06:29

Altium元器件库上云实战:从本地SchLib迁移到Workspace的完整指南

元器件库管理这件事,说大不大,说小也真不小。画过几年板子的人大概都有体会:本地硬盘里躺着十几个版本的原理图库,命名从SchLib_old到SchLib_最终确认版_真的最终,同事之间靠聊天软件传来传去,谁改了哪个器…

作者头像 李华
网站建设 2026/10/2 23:03:28

C++红黑树从原理到实现:平衡二叉树为何默认是它?

在C里提到平衡二叉树,十有八九指的并不是AVL树,而是红黑树。不管你是用std::map、std::set还是std::multiset,底层容器都是同一棵红黑树。我最早真正读红黑树源码,是翻开源STL的rb_tree,第一感觉就是:这堆旋…

作者头像 李华
网站建设 2026/10/2 22:59:06

AI生成内容如何标注?企业知识库与RAG系统可信度治理实践

“AI 填的”这四个字,就是我这段时间折腾企业内部知识库,最值钱的一条经验。 项目背景很简单:我们打算把散落在各业务部门手里的操作手册、项目复盘、产品 FAQ、客户案例这些零散文档,统一收进一个知识库,再对接大模型…

作者头像 李华
网站建设 2026/10/2 22:55:12

制造业PLM与ERP系统选型与集成实战指南

简介:本资源是一份面向制造行业企业信息化负责人的PLM与ERP系统选型规划专业解决方案,聚焦多系统集成背景下的需求梳理、范围界定与实施路径设计,助力企业规避选型风险、明确建设边界并统一管理与业务层关注重点。资源为单文件PDF文档&#x…

作者头像 李华
网站建设 2026/10/2 22:54:25

SVM支持向量机Python实现:从手写代码到sklearn调参实战

简介:这是一份面向Python初中级学习者的支持向量机实现资源,基于SVM核心分类思想,用Python完成可运行的训练与测试代码,适合正在学习机器学习基础、希望从数学原理过渡到实战代码的读者。压缩包共6个文件,以py源码为主…

作者头像 李华
网站建设 2026/10/2 22:52:24

Jev浏览器Agent实测:本地部署AI模型驱动浏览器自动化全攻略

最近GitHub上有个叫Jev的浏览器Agent插件火了,21k star,把AI模型和浏览器自动化结合到一起,用自然语言就能驱动浏览器干活。我做了一轮完整的部署和使用测试,从模型选型、本地部署到插件配置、实际跑任务,把整个链路都…

作者头像 李华