Java final 关键字学习笔记一、final 的定义final 是一个修饰符用来修饰变量、方法、类表示最终的、不可改变的。二、final 修饰变量常量1. 基本概念被 final 修饰的变量称为常量只能赋值一次赋值后无法再修改命名约定全大写多个单词用下划线隔开2. 基本数据类型 finalfinalintMAX_SIZE100;finaldoublePI3.14159;finalbooleanIS_VALIDtrue;// ❌ 编译错误无法修改MAX_SIZE200;PI3.14;理解变量里面记录的是真实的数据值一旦用 final 修饰这个值就固定了。3. 引用数据类型 finalfinalStudentstunewStudent();// ❌ 错误不能改变 stu 的地址stunewStudent();// ✅ 可以修改对象内部的属性stu.setName(小明);stu.setAge(18);关键区别类型记录的内容final 的作用基本类型真实数据值值无法改引用类型对象的内存地址地址无法改但对象属性可改4. 图解理解基本类型 final int a 10; ┌─────┐ │ a │ ──→ 10值固定无法改 └─────┘ 引用类型 final Student stu new Student(); ┌─────┐ ┌──────────────┐ │ stu │ ──→ 0x1234 ──→ │ Student对象 │ └─────┘ │ name: │ │ age: 0 │ └──────────────┘ stu 的地址固定无法改 但对象内部的属性可以改三、final 修饰方法1. 作用被 final 修饰的方法不能被子类重写override用于保护方法的实现防止被意外修改2. 示例classParent{finalvoidimportantMethod(){System.out.println(这是重要方法不能被改);}}classChildextendsParent{// ❌ 编译错误不能重写 final 方法// void importantMethod() { }}四、final 修饰类1. 作用被 final 修饰的类不能被继承用于防止类被扩展保证类的完整性2. 示例finalclassImmutableClass{// 这个类不能被继承}// ❌ 编译错误不能继承 final 类// class SubClass extends ImmutableClass { }3. 常见例子String类是 final 的不能被继承Integer、Double等包装类也是 final 的五、final 的三种用法总结修饰对象作用示例变量变量值无法改常量final int MAX 100;方法方法不能被重写final void method() {}类类不能被继承final class MyClass {}六、final 变量的赋值时机1. 声明时赋值finalinta10;// 直接赋值2. 构造方法中赋值classDog{finalStringname;publicDog(Stringname){this.namename;// 在构造方法中赋值只能赋一次}}3. 静态常量classConstants{staticfinaldoublePI3.14159;// 类加载时初始化}七、final 的常见用途1. 定义常量finalintMAX_USERS1000;finalStringAPP_NAMEMyApp;finaldoubleDISCOUNT_RATE0.9;2. 保护重要方法classBankAccount{finalvoidwithdraw(doubleamount){// 重要的取款逻辑不允许子类修改}}3. 防止类被继承finalclassSecurityClass{// 安全相关的类不允许被继承}4. 方法参数voidprocess(finalStringdata){// data 在方法内不能被修改// data new value; // ❌ 错误}八、核心理解关键点 1final 修饰变量的本质final 修饰哪个变量这个变量里面记录的内容就无法再次发生改变。基本类型记录的是值值无法改引用类型记录的是地址地址无法改但对象属性可改关键点 2final 不等于不可变finalint[]arr{1,2,3};// ❌ 不能改地址arrnewint[]{4,5,6};// ✅ 可以改数组内容arr[0]10;关键点 3final 和 static 的组合staticfinaldoublePI3.14159;// 既是类级别的static又是常量final// 通过 类名.PI 访问且无法修改九、小结速查表问题回答final 修饰变量后能改吗不能改变变量记录的内容基本类型改值引用类型改地址final 修饰方法后能重写吗不能子类无法重写 final 方法final 修饰类后能继承吗不能该类无法被继承final 常量命名规范全大写多个单词用下划线隔开final 引用类型能改属性吗能只是地址无法改十、常见错误❌ 错误 1混淆基本类型和引用类型finalinta10;a20;// ❌ 错误值无法改finalDogdognewDog();dognewDog();// ❌ 错误地址无法改dog.setName(小白);// ✅ 正确属性可以改❌ 错误 2忘记命名约定finalintmaxSize100;// ❌ 不符合约定finalintMAX_SIZE100;// ✅ 正确❌ 错误 3在子类中重写 final 方法classParent{finalvoidmethod(){}}classChildextendsParent{voidmethod(){}// ❌ 编译错误}十一、总结final 是 Java 中用于表示不可改变的关键字有三种用法修饰变量创建常量变量值无法改修饰方法防止方法被重写修饰类防止类被继承理解 final 的关键是区分基本类型和引用类型明确 final 修饰的是变量记录的内容而不是对象本身。