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

相关推荐
csdn_wuwt1 小时前
前后端中Dto是什么意思?
开发语言·网络·后端·安全·前端框架·开发
print(未来)1 小时前
C++ 与 C# 的性能比较:选择合适的语言进行高效开发
java·开发语言
四问四不知1 小时前
Rust语言入门
开发语言·rust
JosieBook1 小时前
【Rust】 基于Rust 从零构建一个本地 RSS 阅读器
开发语言·后端·rust
云边有个稻草人1 小时前
部分移动(Partial Move)的使用场景:Rust 所有权拆分的精细化实践
开发语言·算法·rust
一晌小贪欢2 小时前
Pandas操作Excel使用手册大全:从基础到精通
开发语言·python·自动化·excel·pandas·办公自动化·python办公
松涛和鸣3 小时前
11.C 语言学习:递归、宏定义、预处理、汉诺塔、Fibonacci 等
linux·c语言·开发语言·学习·算法·排序算法
王者之座3 小时前
java+maven配置yguard的一次实验
java·spring boot·maven
IT痴者4 小时前
《PerfettoSQL 的通用查询模板》---Android-trace
android·开发语言·python
2501_941111244 小时前
C++与自动驾驶系统
开发语言·c++·算法