镇江市住房和城乡建设局网站二手交易网站开发

张小明 2026/1/2 11:07:52
镇江市住房和城乡建设局网站,二手交易网站开发,网站后台如何设计,店标设计logo设计一、先搞懂final到底是啥二、final修饰类#xff1a;不能被继承的“铁疙瘩”三、final修饰方法#xff1a;不能被重写的“固定逻辑”四、final修饰变量#xff1a;最常用也最容易踩坑4.1 基本类型变量#xff1a;值真的不能改4.2 引用类型变量#xff1a;引用不变#xf…一、先搞懂final到底是啥二、final修饰类不能被继承的“铁疙瘩”三、final修饰方法不能被重写的“固定逻辑”四、final修饰变量最常用也最容易踩坑4.1 基本类型变量值真的不能改4.2 引用类型变量引用不变内容可变4.3 成员变量和局部变量的区别4.4 final参数方法里不能改引用五、并发场景下的final线程安全的小帮手六、使用final的一些小经验最后想说接触Java有一阵子了final这个关键字一直没彻底搞明白总觉得它就是“不能改”的意思但实际用起来总踩坑。这几天花时间仔细研究了下发现里面门道还真不少整理成笔记方便自己回顾也希望能帮到和我一样困惑的朋友。一、先搞懂final到底是啥我认为final最核心的作用就是“声明不可变”就像给代码加了把锁告诉自己也告诉别人被它修饰的东西不能随便动了。但这里的“不能动”得分情况说不是一刀切的不能改具体要看修饰的是类、方法还是变量这点特别关键之前我就因为没分清踩过坑。二、final修饰类不能被继承的“铁疙瘩”被final修饰的类就相当于一个成品不能再被扩展了没有子类能继承它。我觉得这种设计特别适合那些功能完整、不需要再修改的类比如Java自带的String类要是能被继承改写字符串的不可变性就没保障了。给大家整个简单的例子比如写个工具类不想别人随便继承篡改// final修饰的工具类不能被继承publicfinalclassCalculateUtil{// 私有构造器不让外部实例化privateCalculateUtil(){}// 加法工具方法publicstaticintsum(inta,intb){returnab;}}// 下面这行代码会编译报错因为不能继承final类// class SubCalculateUtil extends CalculateUtil {}在我看来这种用法很适合工具类或者安全敏感的类能守住核心逻辑不被破坏避免有人瞎继承搞出问题。三、final修饰方法不能被重写的“固定逻辑”final修饰方法的话子类能继承这个方法直接用但不能重写它的实现。这就像父类定好的规矩子类必须遵守不能擅自修改。举个实际的例子感受下classAnimal{// 普通方法子类可以重写publicvoideat(){System.out.println(动物吃东西);}// final方法子类不能重写publicfinalvoidsleep(){System.out.println(动物睡觉固定逻辑);}}classDogextendsAnimal{// 重写普通方法没问题Overridepublicvoideat(){System.out.println(狗吃骨头);}// 下面这行代码会报错不能重写final方法// Override// public void sleep() {// System.out.println(狗趴着睡);// }}还有个小知识点要提一下private方法默认就是隐式final的因为子类根本访问不到自然没法重写。如果子类写了个和父类private方法同名的方法那只是子类自己的新方法不算重写。四、final修饰变量最常用也最容易踩坑这是final最常用的场景但也是最容易出错的地方。核心规则就一条final变量一旦赋值就不能再重新赋值了。但这里要区分基本类型和引用类型差别很大。4.1 基本类型变量值真的不能改如果final修饰的是int、double这些基本类型那它的值就彻底固定了改不了一点。publicclassFinalBasicDemo{publicstaticvoidmain(String[]args){// 声明时直接赋值finalintnum10;// 下面这行报错不能重新赋值// num 20;// 先声明后赋值也只能赋一次finalStringname;name小明;// 下面这行也报错// name 小红;}}这种用法很适合定义常量比如项目里的配置参数用final修饰能防止不小心被篡改。4.2 引用类型变量引用不变内容可变这是我之前踩过的大坑final修饰对象、集合这种引用类型时只是说这个引用不能指向新的对象但对象里面的内容该怎么改还能怎么改。给大家整个直观的例子importjava.util.ArrayList;importjava.util.List;classStudent{privateStringname;publicStudent(Stringname){this.namename;}publicvoidsetName(Stringname){this.namename;}publicStringgetName(){returnname;}}publicclassFinalReferenceDemo{publicstaticvoidmain(String[]args){// final修饰Student对象finalStudentstudentnewStudent(张三);System.out.println(初始名字student.getName());// 可以修改对象里面的内容没问题student.setName(李四);System.out.println(修改后名字student.getName());// 下面这行报错不能让引用指向新对象// student new Student(王五);// 集合的例子更明显finalListStringlistnewArrayList();// 可以往集合里加元素list.add(苹果);list.add(香蕉);System.out.println(集合内容list);// 下面这行报错不能指向新集合// list new ArrayList();}}所以如果想让对象彻底不可变光用final修饰引用可不够还得把对象里的字段也用final修饰并且不提供修改方法就像String类那样。4.3 成员变量和局部变量的区别成员变量也就是类里定义的变量用final修饰的话必须显式初始化要么声明时直接赋值要么在构造器里赋值而且所有构造器都得赋。classPerson{// 声明时直接赋值privatefinalStringgender男;// 构造器里赋值privatefinalintage;privatefinalStringaddress;// 第一个构造器publicPerson(intage,Stringaddress){this.ageage;this.addressaddress;}// 第二个构造器也得赋值publicPerson(intage){this.ageage;this.address默认地址;}}局部变量方法里定义的变量就灵活点可以先声明后赋值但必须在第一次使用前赋好值而且只能赋一次。4.4 final参数方法里不能改引用方法参数用final修饰的话在方法里面就不能给这个参数重新赋值了能防止不小心改了传入的引用。publicclassFinalParamDemo{publicstaticvoidhandleData(finalintid,finalListStringdata){// 下面两行都报错不能重新赋值// id 100;// data new ArrayList();// 可以修改集合内容没问题data.add(处理后的id);}publicstaticvoidmain(String[]args){ListStringdatanewArrayList();data.add(原始数据);handleData(1,data);System.out.println(data);}}我觉得这种用法在处理复杂逻辑时很有用能避免不小心改了参数引用导致的bug。五、并发场景下的final线程安全的小帮手这部分有点深但很实用。在我看来final在多线程里最大的价值就是能保证可见性而且不用额外加同步零成本线程安全。简单说就是只要对象是正确构造的没有发生this逸出那么这个对象里的final字段在其他线程里看到的一定是初始化后的最终值不会是默认值。给大家整个例子classSafeData{privatefinalintcode;privatefinalStringmessage;publicSafeData(intcode,Stringmessage){this.codecode;this.messagemessage;}publicintgetCode(){returncode;}publicStringgetMessage(){returnmessage;}}publicclassFinalThreadDemo{publicstaticvoidmain(String[]args)throwsInterruptedException{SafeDatadatanewSafeData(200,成功);ThreadthreadnewThread(()-{// 子线程能正确读到final字段的值System.out.println(状态码data.getCode());System.out.println(信息data.getMessage());});thread.start();thread.join();}}这里关键是不能让this逸出也就是不能在构造器还没执行完的时候就把this引用传给其他线程。比如在构造器里启动线程并传入this那其他线程可能会读到还没初始化好的final字段就出问题了。还有个小对比final和volatile都能保证可见性但不一样final只保证初始化后的一次可见性适合不会修改的字段volatile保证多次读写的可见性适合经常修改的共享变量。而且两者都不保证原子性比如i这种操作还是得用锁或者原子类。六、使用final的一些小经验我们的经验是合理用final能让代码更健壮但别过度使用不然会降低灵活性。总结几个常用场景修饰类工具类、安全敏感类不想被继承的类修饰方法核心算法、不想被重写的逻辑修饰变量常量、不需要修改的配置、多线程共享的只读数据修饰参数防止方法内误改参数引用。还有几个常见误区要避开以为final修饰引用类型就是对象不可变其实不是过度使用final比如每个变量都加反而不方便构造器里让this逸出导致final的可见性失效。最后想说final关键字看着简单其实里面的细节还挺多的。核心就是分清“不可变的是什么”——是类不能继承方法不能重写还是变量不能重新赋值。我觉得掌握好final不仅能减少bug还能让代码的意图更清晰别人一看就知道哪些东西是不能动的。现在我写代码的时候遇到该固定的东西就会下意识用final修饰感觉代码确实稳定了不少。如果有理解不到位的地方欢迎大家指正呀
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

卫计局本年度网站建设工作总结网站费计入什么科目

第一章:从零构建可信量子程序 在量子计算的前沿领域,构建可信的量子程序不仅是技术挑战,更是确保计算结果可验证、过程可追溯的核心任务。传统程序依赖确定性逻辑,而量子程序运行于叠加态与纠缠态之上,其不确定性要求全…

张小明 2025/12/30 21:16:20 网站建设

企业网站案列培训机构网站建设推广

Linux系统下Snort的配置与使用指南 1. 安装Snort 在Linux系统上安装Snort的过程与Windows系统非常相似。主要区别在于, snort.conf 文件中的默认(相对)路径在Linux系统上更有可能无需修改即可使用。你需要下载适合你系统的最新版本的Snort。如果你使用的是Fedora Core 5…

张小明 2025/12/31 18:54:12 网站建设

深圳设计网站培训学校社保网站做员工用工备案

第一章:Open-AutoGLM 电商售后工单处理在现代电商平台中,售后工单数量庞大且类型多样,传统人工处理方式效率低下。Open-AutoGLM 是一款基于开源大语言模型的自动化工单处理系统,专为电商场景设计,能够智能识别用户诉求…

张小明 2025/12/30 20:54:56 网站建设

响应式网站模板之家建设网站制作实训报告

React SoybeanAdmin:现代化中后台管理系统终极指南 【免费下载链接】soybean-admin-react react-admin基于Antd,功能强大且丰富,页面美观,代码优雅 项目地址: https://gitcode.com/gh_mirrors/so/soybean-admin-react 在当…

张小明 2025/12/31 18:54:13 网站建设

湖南做网站 磐石网络引领网站建设方案对比分析报告

光学标准具在具有简单结构的透明板中可以形成法布里-珀罗谐振器(Fabry-Prot resonators),并用于光谱和/或角谱选择。 VirtualLab Fusion中的非序列场追迹技术可以对不同类型的标准具进行精确建模,其中包括平面或曲面和涂层。作为典型应用,我们…

张小明 2025/12/31 0:20:21 网站建设

鹿泉城乡建设局网站wordpress积分查看

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个SpringBoot文件上传模块,包含:1. 本地File转MultipartFile的工具方法 2. 文件类型验证逻辑 3. 大小限制配置 4. 异常处理机制 5. 与MinIO存储的集成…

张小明 2025/12/30 22:20:58 网站建设