卡码笔记
首页
计算机基础
C++
Java
面经
笔记广场 (opens new window)
代码随想录 (opens new window)
首页
计算机基础
C++
Java
面经
笔记广场 (opens new window)
代码随想录 (opens new window)
  • 基础与面向对象

    • 面向对象三大特性
    • 面向对象和面向过程的区别是什么?
    • 抽象类和接口的区别?
    • 说说你对多态的理解?
    • Java中的方法重载和方法重写有什么区别?
    • Java中的final关键字可以修饰什么?被final修饰后有什么特点?
      • 简要回答
      • 详细回答
      • 知识拓展
    • equals方法和==的区别
    • 堆和栈的区别?
    • 解释一下Java中的泛型及其作用?
  • 集合

  • 异常

  • 字符串

  • JVM

  • 并发与多线程

  • JDK

  • Spring

  • 设计模式

# final关键字

# 简要回答

  • final作为Java中的一个关键字可以用来修饰 类 , 方法 ,和 变量。(但final不能修饰构造器)
    1. 修饰类:
      被final修饰的类不能被继承,但该类可以去继承别的 (没有被final修饰的)类,例如String类和System类,它们被final修饰,是不可以被继承的,但是它们有自己的父类——即顶层父类Object类。
      被final修饰的类虽然不能被继承,但 可以被实例化。
    2. 修饰方法:
      被final修饰的方法不能被子类重写,但可以被子类继承并使用(在满足访问权限规则的前提下)。当修饰方法时, final关键字不能与abstract关键字共存;因为abstract修饰的方法是必须被非抽象子类重写的。
    3. 修饰变量:
      被final修饰的变量称为最终变量,即常量——根据被修饰变量的定义位置又可分为成员常量和局部常量。常量只能赋值一次,不能被二次更改。

# 详细回答

  • final作为Java中的一个关键字可以用来修饰 类 , 方法 ,和 变量。(但final不能修饰构造器)
    1. 修饰类:
      ① 核心特点:
      被final修饰的类不能被继承,但该类可以去继承别的 (没有被final修饰的)类,例如String类和System类,它们被final修饰,是不可以被继承的,但是它们有自己的父类——即顶层父类Object类。
      被final修饰的类虽然不能被继承,但 可以被实例化。例如,Java中所有的包装类都被final关键字修饰了。也就是说,所有的包装类都不能被继承,但都可以被实例化。
      一般地,如果一个类已经被final关键字修饰,那么从逻辑上讲,该类中的方法是没有必要再次用final修饰的。这是因为用final修饰方法的目的就是为了不让该方法被子类重写;而final修饰的类本身就已经不能被继承了,也就不可能被重写。
      ② 设计意图:
      保证类的不可变性(如 String 类防止子类破坏字符串内容)。 确保安全性(如 System 类防止核心 API 被篡改)。
    2. 修饰方法:
      ① 核心特点:
      被final修饰的方法不能被子类重写,但可以被子类继承并使用(在满足访问权限规则的前提下)。当修饰方法时, final关键字不能与abstract关键字共存;因为abstract修饰的方法是必须被非抽象子类重写的。
      ② 设计意图:
      防止核心逻辑被修改(如模板方法模式中的关键步骤)。
    3. 修饰变量:
      ① 核心特点:
      被final修饰的变量称为最终变量,即常量——根据被修饰变量的定义位置又可分为成员常量和局部常量。常量只能赋值一次,不能被二次更改。
      成员常量——成员常量必须进行初始化,可以在定义成员常量时就对它赋初值来显式初始化,若在定义成员常量时没有赋初值——需要在构造器 或者 代码块中进行初始化。
      局部常量——局部常量如果未被使用,可以不赋初值;但如果局部常量被调用了,就必须赋初值。
      静态常量——对于静态常量来说,只能通过在定义时为其赋初值;或者先定义,然后在静态代码块中为其赋值,这样来初始化。但是不可以在构造器中进行静态常量的初始化。
      ② 设计意图:
      确保变量引用或值的不可变性(提升线程安全性与代码可读性)。

# 知识拓展

  1. final 修饰类的示意图如下:
    image
  2. final 修饰属性和方法的示意图如下:
    image
  3. 关于 常量的命名:
    • 一般来说,常量名所有字母都大写,多个单词之间用下划线隔开。eg : MAX_VALUE(最大值)。
  4. 关于 引用常量:
    • 若final关键字修饰的是一个引用类型变量,则该引用指向的地址值无法改变。(相当于一个 固定指针)
    • PS : 然而,需要注意的是,final 仅保证引用本身不可变,即不能再指向其他对象。但如果引用的对象是可变的(例如 List、StringBuilder),则该对象内部的数据仍然可以被修改。这在设计不可变类时需要注意,如果希望对象内容也完全不可变,需要额外的设计(如防御性拷贝或使用不可变集合)。
  5. final and Method Parameters:
    • When a method parameter is declared as final, it means:
      ① The parameter cannot be reassigned within the method body.
      ② For primitive types (eg: int, double), the value cannot be modified.
      ③ For reference types (eg: String, List), the reference cannot point to a new object, but the object’s internal state can still be modified.

    • Codeing Demonstration:

      public void process(final int id, final List<String> data) {
      	id = 100;          			// WRONG, Compile error (primitive)
      	data = new ArrayList<>();  // WRONG, Compile error (reference)
      	data.add("newItem");       // OK, Allowed (modify object state)
      }
      
      1
      2
      3
      4
      5

Last Updated: 3/10/2026, 6:08:48 PM

← Java中的方法重载和方法重写有什么区别? equals方法和==的区别 →

评论

验证登录状态...

侧边栏
夜间
卡码简历
代码随想录
卡码投递表🔥
2026群
添加客服微信 PS:通过微信后,请发送姓名-学校-年级-2026实习/校招
支持卡码笔记
鼓励/支持/赞赏Carl
1. 如果感觉本站对你很有帮助,也可以请Carl喝杯奶茶,金额大小不重要,心意已经收下
2. 希望大家都能梦想成真,有好的前程,加油💪