GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • 卡码笔记-最强八股文
  • 计算机基础
  • Python
  • C++
  • Java
  • Go
  • ChatGPT充值
  • Claude充值
  • 国内使用Claude
  • 中转站推荐
  • 🔥大模型🔥
  • 大模型面经
  • Java面经
  • C++面经

This view

  • Original page
  • New address

GeezerVison is showing notes.kamacoder.com — final关键字|高频面试题|Java高频面试题|final修饰类、final修饰方法、final修饰变量

# 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

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

评论

验证登录状态...

You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.