final是干嘛的

好的,这是一个非常核心的关键字,在多种编程语言中都有出现,但具体的含义和行为因语言而异。我会以最常用的几种语言为例来解释。

核心思想

final 关键字的核心思想是"限制继承和修改"。 它被用来表示某种实体(变量、方法或类)是"最终的",即不可被进一步改变、覆盖或继承。


按语言分类详解

1.在 Java 中

在 Java 中,final 是一个非常常用的关键字,它可以修饰变量、方法和类。

a) 修饰变量 (Final Variables)

这表示变量只能被赋值一次,之后就不能再被修改。本质上,它变成了一个常量。

  • 基本类型变量(如 int, double):值不能再改变。
  • 引用类型变量 (如 String, Object):引用(即内存地址)不能再改变,但对象内部的状态(如果对象本身允许)是可以修改的
java 复制代码
final int maxUsers = 100;
// maxUsers = 200; // 编译错误!不能再次赋值

final List<String> list = new ArrayList<>();
list.add("Hello"); // 正确:可以修改对象内部的状态
// list = new LinkedList<>(); // 编译错误!不能改变 list 这个引用指向另一个对象

b) 修饰方法 (Final Methods)

这表示该方法不能被子类覆盖 (Override)。设计上通常是为了防止子类改变该方法的核心行为。

java 复制代码
class Parent {
    public final void secureMethod() {
        System.out.println("这是关键逻辑,不能改变!");
    }
}

class Child extends Parent {
    // @Override
    // public void secureMethod() { ... } // 编译错误!不能覆盖 final 方法
}

c) 修饰类 (Final Classes)

这表示这个类不能被继承 。设计上通常是为了安全(如 String 类)或效率原因。

java 复制代码
final class String { // 想象一下 String 类的声明
    // ...
}

// class MyString extends String { } // 编译错误!不能继承 final 类

2.在 C++ 中 (作为 constfinal)

C++ 的情况稍微复杂一些,它没有 final 关键字来修饰变量。

  • 对于变量: 使用 const 关键字来实现与 Java final 变量类似的功能。

    cpp 复制代码
    const int maxUsers = 100; // 值不可变
    // maxUsers = 200; // 错误!
  • 对于方法和类(C++11 标准引入): 使用 final 关键字,含义与 Java 完全相同。

    • 修饰虚函数:阻止它在派生类中被覆盖。
    • 修饰类:阻止它被继承。
cpp 复制代码
class Base {
public:
    virtual void doSomething() final; // 这是最终的虚函数
};

class Derived : public Base {
public:
    // void doSomething() override; // 错误!不能覆盖 final 函数
};

class NoInheritance final { // 这个类是最终的
    // ...
};

// class Try : public NoInheritance { }; // 错误!不能继承 final 类

3.在 C# 中 (作为 readonly, sealed, 和 const)

C# 使用了不同的关键字来达到相同的目的:

  • 对于变量:

    • const:编译时常量,必须在声明时赋值。
    • readonly:运行时常量,可以在声明时或构造函数中赋值。这最接近 Java 的 final 变量。
    csharp 复制代码
    public readonly int maxUsers;
    public MyClass(int users) {
        maxUsers = users; // 只能在构造函数中赋值
    }
  • 对于方法/类: 使用 sealed 关键字。

    • sealed 方法:阻止它在派生类中被重写。
    • sealed 类:阻止它被继承。
csharp 复制代码
class Base {
    public sealed override void SomeMethod() { } // 密封方法
}

sealed class FinalClass { } // 密封类

// class Derived : FinalClass { } // 错误!无法从密封类继承

总结与用途

应用对象 作用 主要语言中的关键字
变量 使其成为常量,只能赋值一次。 Java: final C++: const C#: readonly / const
方法 禁止子类覆盖该方法。 Java: final C++: final C#: sealed
禁止该类被继承。 Java: final C++: final C#: sealed

为什么要使用它?

  1. 安全性: 确保关键变量不被意外修改,关键逻辑不被子类破坏。
  2. 清晰性: 向其他开发者明确声明你的设计意图("这个类/方法/变量不应该被改变")。
  3. 性能: 在某些情况下,编译器可以对 final 方法/类进行优化(如静态绑定、内联)。
  4. 设计: 强制不可变对象,这在多线程编程中尤其重要,因为不可变对象天生是线程安全的。

简单来说,final 就是你给编译器和其他程序员的一个"锁",告诉他们这里的东西到此为止,不能再改了。

相关推荐
咩咩啃树皮11 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
灯澜忆梦11 小时前
GO_并发编程---定时器
开发语言·后端·golang
鱟鲥鳚12 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
-银雾鸢尾-12 小时前
C#中的StringBuilder相关方法
开发语言·c#
-银雾鸢尾-12 小时前
C#中结构体与类的区别;抽象类与接口的区别
开发语言·c#
大模型码小白13 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司14 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地15 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
wuqingshun31415915 小时前
TCP超时重传机制是为了解决什么问题?
java
段一凡-华北理工大学15 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化