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

相关推荐
RickyWasYoung3 小时前
【matlab】字符串数组 转 double
android·java·javascript
lang201509283 小时前
Spring OXM:轻松实现Java-XML互转
xml·java·spring
Lisonseekpan4 小时前
为什么要避免使用 `SELECT *`?
java·数据库·后端·sql·mysql·oracle
一只小透明啊啊啊啊4 小时前
Java的中间件
java·开发语言·中间件
Wilson Chen4 小时前
深入理解 MySQL 事务与锁机制:从 ACID 到 Next-Key Lock 的实证之旅
java·数据库·mysql
学编程就要猛4 小时前
数据结构初阶:Java中的ArrayList
java·开发语言·数据结构
JH30734 小时前
10分钟理解泛型的通配符(extends, super, ?)
java·开发语言·windows
在等晚安么4 小时前
力扣面试经典150题打卡
java·数据结构·算法·leetcode·面试·贪心算法
Fency咖啡4 小时前
Spring进阶 - Spring事务理论+实战,一文吃透事务
java·数据库·spring