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 就是你给编译器和其他程序员的一个"锁",告诉他们这里的东西到此为止,不能再改了。

相关推荐
程序员阿鹏2 分钟前
SpringBoot自动装配原理
java·开发语言·spring boot·后端·spring·tomcat·maven
Andy工程师2 分钟前
一个接口可以有多个实现类
java
彭世瑜4 分钟前
C/C++:libfort用于在终端输出表格
c语言·开发语言·c++
RAY_01045 分钟前
Python—数据可视化pyecharts
开发语言·python
徐同保6 分钟前
n8n+GPT-4o一次解析多张图片
开发语言·前端·javascript
老华带你飞9 分钟前
工会管理|基于springboot 工会管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·spring
自在极意功。9 分钟前
MyBatis配置文件详解:environments、transactionManager与dataSource全面解析
java·数据库·tomcat·mybatis
春日见9 分钟前
如何跑通,吃透一个开源项目?
linux·运维·开发语言·数码相机·matlab
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ14 分钟前
配置springdoc swagger开关
java
技术净胜14 分钟前
MATLAB数据清洗流程包含:缺失值处理/异常值检测/重复值删除
开发语言·matlab