当前位置: 首页 > news >正文

final是干嘛的

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

核心思想

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


按语言分类详解

1.在 Java 中

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

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

  • 基本类型变量(如 int, double):值不能再改变。
  • 引用类型变量(如 String, Object):引用(即内存地址)不能再改变,但对象内部的状态(如果对象本身允许)是可以修改的
final int maxUsers = 100;
// maxUsers = 200; // 编译错误!不能再次赋值final List<String> list = new ArrayList<>();
list.add("Hello"); // 正确:可以修改对象内部的状态
// list = new LinkedList<>(); // 编译错误!不能改变 list 这个引用指向另一个对象

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

class Parent {public final void secureMethod() {System.out.println("这是关键逻辑,不能改变!");}
}class Child extends Parent {// @Override// public void secureMethod() { ... } // 编译错误!不能覆盖 final 方法
}

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

final class String { // 想象一下 String 类的声明// ...
}// class MyString extends String { } // 编译错误!不能继承 final 类

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

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

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

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

    • 修饰虚函数:阻止它在派生类中被覆盖。
    • 修饰类:阻止它被继承。
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 变量。
    public readonly int maxUsers;
    public MyClass(int users) {maxUsers = users; // 只能在构造函数中赋值
    }
    
  • 对于方法/类: 使用 sealed 关键字。

    • sealed 方法:阻止它在派生类中被重写。
    • sealed 类:阻止它被继承。
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 就是你给编译器和其他程序员的一个“锁”,告诉他们这里的东西到此为止,不能再改了。

http://www.dtcms.com/a/540579.html

相关文章:

  • 马赛克数据增强与 Tensor、TensorFlow 区别学习总结
  • 【Node】win 10 / win 11:node.js 长期维护版下载、安装与 npm 配置
  • 青岛公司网站建设开发南京网站建设与维护
  • 宠物系统功能演示
  • 具身智能的平民化浪潮:从表演秀到产业变革临界点
  • Geoserver漏洞图形化利用工具
  • 沈阳公司网站设计类似58的推广平台有哪些平台
  • 最小二乘问题详解6:梯度下降法
  • Linux内核RDMA计数器机制:深入解析与实现原理
  • iOS 反编译防护工具与实战组合 从静态侦察到 IPA 成品加固的工程化路径
  • 微信小程序组件中二维码生成问题解决方案
  • 网站文件解压北仑装修公司哪家最好
  • 《微信小程序》第八章:“我的“设计
  • 基于 Launcher3 的 iOS 风格桌面 04 拖拽和移位
  • django model Manager
  • 前端数据可视化实战:Chart.js vs ECharts 深度对比与实现指南
  • 霍山县网站建设公司寻花问柳专注做一家男人最爱的网站
  • LInux(一)VMware虚拟机中安装CentOS7
  • MATLAB基于对数灰关联度的IOWGA算子最优组合预测模型
  • 企业开源网站系统网页制作软件
  • Linux存储软件栈剖析之第4篇:Linux文件系统的实现
  • Excel怎么将八位数字设置为日期格式?
  • 怎么做系部网站首页做外贸的零售网站
  • 宁波企业网站排名优化公司网络系统管理技能大赛答案
  • 本地网站源码便民信息发布平台
  • Linux 内核内存屏障(中文译文)
  • “二分查找” 咋用?像 “查字典翻页码”,3 步找到目标值​
  • 在Ubuntu中使用Docker打包程序(Conda, pip)
  • 网站优化软件费用大连网站推广优化
  • 31_AI智能体工具插件之增强LangChain注册工具构建高效可控的AI工具生态