Java final 关键字
1.ElasticSearch Java 使用2.Shell SpringBoot 操作3.Java 并发4.Java 变量和数据类型5.Java 抽象类6.Java 常用数据结构7.Java 反射8.Java 泛型9.Java 方法入门10.Java 方法引用11.Java 运算符12.Java 异常13.Java 数组
14.Java final 关键字
15.Java 权限修饰符16.Java 匿名对象17.Java 内部类18.Java 面向对象思想19.Java 流程控制20.Java 接口21.Java 函数式接口22.Java 对象进行深拷贝23.Java内存区域(运行时数据区域)和内存模型(JMM)24.Java中的finally一定会被执行吗25.Java 包装类26.Java 缓冲流27.Java 日期时间类28.Java 序列化流29.Java 转换流30.Java 字节流、字符流31.Java File类32.Java StringBuilder类33.Java Collections类34.Java Collection集合35.Java ArrayList类36.Java List集合37.Java List的子类38.Java Set接口39.JVM参数40.Netty41.Java Stream 流42.Java 多任务异步导出数据到excel概述
学习了继承后,我们知道,子类可以在父类的基础上改写父类内容,比如,方法重写。那么我们能不能随意的继承 API 中提供的类,改写其内容呢?显然这是不合适的。为了避免这种随意改写的情况,Java 提供了final
关键字,用于修饰不可改变内容。
- final: 不可改变。可以用于修饰类、方法和变量。
- 类:被修饰的类,不能被继承。
- 方法:被修饰的方法,不能被重写。
- 变量:被修饰的变量,不能被重新赋值。
使用方式
修饰类
格式如下:
final class 类名 {
}
查询 API 发现像public final class String
、public final class Math
、public final class Scanner
等,很多我们学习过的类,都是被final修饰的,目的就是供我们使用,而不让我们所以改变其内容。
修饰方法
格式如下:
修饰符 final 返回值类型 方法名(参数列表){
//方法体
}
重写被final
修饰的方法,编译时就会报错。
修饰变量
- 局部变量——基本类型
基本类型的局部变量,被final修饰后,只能赋值一次,不能再更改。代码如下:
public class FinalDemo1 {
public static void main(String[] args) {
// 声明变量,使用final修饰
final int a;
// 第一次赋值
a = 10;
// 第二次赋值
a = 20; // 报错,不可重新赋值
// 声明变量,直接赋值,使用final修饰
final int b = 10;
// 第二次赋值
b = 20; // 报错,不可重新赋值
}
}
思考,如下两种写法,哪种可以通过编译?
写法1:
final int c = 0;
for (int i = 0; i < 10; i++) {
c = i;
System.out.println(c);
}
写法2:
for (int i = 0; i < 10; i++) {
final int c = i;
System.out.println(c);
}
根据final
的定义,写法1报错!写法2,为什么通过编译呢?因为每次循环,都是一次新的变量c。这也是大家需要注意的地方。
2. 局部变量——引用类型
引用类型的局部变量,被final修饰后,只能指向一个对象,地址不能再更改。但是不影响对象内部的成员变量值的修改,代码如下:
public class FinalDemo2 {
public static void main(String[] args) {
// 创建 User 对象
final User u = new User();
// 创建 另一个 User对象
u = new User(); // 报错,指向了新的对象,地址值改变。
// 调用setName方法
u.setName("张三"); // 可以修改
}
}
- 成员变量
成员变量涉及到初始化的问题,初始化方式有两种,只能二选一:
- 显示初始化;
public class User {
final String USERNAME = "张三";
private int age;
}
- 构造方法初始化。
public class User {
final String USERNAME ;
private int age;
public User(String username, int age) {
this.USERNAME = username;
this.age = age;
}
}
被 final 修饰的常量名称,一般都有书写规范,所有字母都大写。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!