(续上一篇,今天扒完 final 这个 “终极钉子户”)
家人们!上一篇咱们唠了 abstract 和 static,今天必须把 final 这个 “Java 倔驴” 给盘明白!final 翻译过来是 “最终的、最后的”,被它修饰的东西,那就是 “钉死在墙上的钉子”,谁都别想改,主打一个 “油盐不进、死磕到底”。
一、final 修饰变量:只能赋值一次的 “一次性水杯”
被 final 修饰的变量,不管是局部变量、实例变量还是静态变量,都变成了常量,只能赋值一次,赋值之后就再也改不了,像一次性水杯,用一次就不能再装别的东西了。
1. final 修饰局部变量:方法里的 “一次性水杯”
方法里的局部变量被 final 修饰后,只能赋值一次,赋值之后就固定了。比如你在方法里写final int a = 10;,后面再写a = 20;,编译器直接给你报错,说 “你这杯子用过了,不能再装水了”。
2. final 修饰实例变量:类里的 “定制水杯”
实例变量被 final 修饰后,编译器不会给它默认值,必须手动初始化,而且只能赋值一次。初始化的时机有三种:
- 声明的时候直接赋值:
final int a = 10;,就像定制水杯出厂就印好了图案,改不了。 - 在构造方法里赋值:每个构造方法都得给它赋值,不然编译器会说 “你这水杯没印图案,没法用”。
- 借助动态代码块赋值:
{ a = 10; },在类加载的时候给它赋值,也是一次性的。
3. final 修饰静态变量:全类共用的 “公共水杯”
静态变量被 final 修饰后,就是全类共用的常量,初始化时机有两种:
- 声明的时候直接赋值:
static final int PI = 3.14;,比如咱们常用的圆周率,就是这种常量,全类共用,谁都不能改。 - 借助静态代码块赋值:
static { PI = 3.14; },类加载的时候给它赋值,之后就固定了。
重点提醒:final 修饰的引用,地址不能改!
比如你写final Student s = new Student();,这个s引用里存的是对象的地址,被 final 修饰后,这个地址就不能改了,你不能再让s指向另一个 Student 对象。但注意!对象里的属性是可以改的!就像你买了个带图案的水杯,水杯的地址(位置)不能变,但你可以往里面装不同的水,对象的属性就是 “水杯里的水”,可以随便改。
二、final 修饰方法:只能被继承、不能被重写的 “祖传秘方”
被 final 修饰的方法,就像老祖宗传下来的秘方,子类可以继承,但绝对不能改配方!
- 语法:
public final void method() {},方法前面加个 final,子类继承后,不能重写这个方法,只能直接用。 - 为啥要这么做?就是怕子类乱改父类的核心逻辑,比如 Java 里的一些工具类方法,都是 final 的,防止子类重写搞出 bug。
三、final 修饰类:不能被继承的 “绝户类”
被 final 修饰的类,就是 Java 里的 “绝户类”,没有子类,谁都不能继承它!
- 语法:
final class 类名 {},加了 final 之后,这个类就断了传承,只能自己用,不能被继承。 - 咱们常用的
String、System、Math类,都是 final 类!为啥?因为这些类是 Java 的核心类,要是被随便继承修改,整个程序都可能出问题,所以直接用 final 锁死,不让别人改。
四、三大修饰符总结:三个 “性格迥异” 的工具人
好了家人们!Java 这三个修饰符的套路全给你扒完了,抽象的、共享的、倔驴的,各有各的用处,再也不用写代码的时候被它们搞心态了!要是还有啥没看懂的地方,评论区唠唠,我给你掰开揉碎了讲明白!