Java中的final变量 final修饰变量 final修饰方法 final修饰类 final和String的关系

article/2025/9/23 14:00:22

目录

  • 引言
  • final修饰变量
    • final修饰变量,不可再改变量的值
    • final修饰对象,能否修改对象属性值
    • final全局静态变量
  • final修饰方法
  • final修饰类
  • 重要总结
    • final关键字的好处
    • final的重要知识点

引言

在开发的过程中,经常会使用String类来处理字符串相关的数据,如下获取文件名称代码:

public static void main(String[] args) {String filePath = "C:/Users/zxy/Desktop/test.docx";String fileName = StringUtils.substring(filePath, filePath.lastIndexOf("/")+1);System.out.printf("fileName = %s,fileName = %s", filePath, fileName);}

但今天去看String源代码时,发现这个类是用final修饰的,于是,决定去探究final关键字。

final修饰变量

final修饰变量,不可再改变量的值

final关键字可用于变量声明,一旦当前变量被设定,就不可以再改变当前变量的值,如下图所示:

在这里插入图片描述

当我试图去修改fileName的值,编辑器报出这个错误:Cannot assign a value to final variable 'fileName',翻译成中文就是不能给final修改的变量fileName赋值

final修饰对象,能否修改对象属性值

但是,当我们用final来修饰对象,能否修改对象属性的值呢,如下图所示:

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Student {private String name;private int age;public static void main(String[] args) {final Student student = new Student("陈希尔", 18);System.out.println("student -- > " + student);student.name = "张韶涵";student.age = 23;System.out.println("student -- > " + student);// 报错:Cannot assign a value to final variable 'student'// student = new Student("程晨",12);}
}

输错结果:

在这里插入图片描述

由上可知,final修饰的对象不能重新指向新的对象,但是修饰的对象可以修改其属性值,如上述Student类。

final全局静态变量

在Java中定义全局常量,通常使用public static final修饰,这样的常量只能在定义时被赋值。

  public static final String APP_ID = "1234567890";

被定义为final的常量定义时需要使用大写字母命名,并且中间使用下划线进行连接。

final修饰方法

首先,我们应该了解定义为final的方法不能被重写,如下定义父类代码:

@Setter
@Getter
public class Animal {private String name;public Animal(String name) {this.name = name;}public final void introduce() {System.out.printf("我是 s% 动物 \n", name);}
}

在定义Dog子类,重写父类中的introduce()方法,如下图所示:
在这里插入图片描述

编辑器报出个错误:'introduce()' cannot override 'introduce()' in 'com.example.demo.finaldesc.Animal' ;overridden method is final,翻译成中卫便是:无法重写父类com.example.demo.finaldesc.Animal的introduce(),因为introduce()方法是用final修饰的

将方法定义为final类型可以防止任何子类修改该类的定义与实现方式,同时定义为final的方法执行效率要高于非final方法。

在修饰权限中曾经提到过private修饰符,如果一个父类的某个方法被设置为private修饰符,子类将无法访问该方法,自然无法覆盖该方法,所以一个定义为private的方法隐式被指定为final类型,这样无须将一个定义为private的方法再定义为final类型。

如果使用父类中的introduce(),如下代码所示:

private void introduce() {System.out.printf("我是 s% 动物 \n", name);
}

在这里插入图片描述
此时Dog类中报出的错误是不能重写父类中的方法

final修饰类

定义为final的类不能被继承,比如上文所说的String类。

如果希望一个类不允许任何类继承,并且不允许其他人对这个类有任何改动,可以将这个类设置为final形式,如下代码所示:

@Setter
@Getter
public final class Animal {public void introduce() {System.out.printf("我是所有动物的父类 \n");}
}

我们再看dog类,如下图所示:
在这里插入图片描述
编辑器报出个错误:cannot inhreit from final 'com.example.demo.finaldesc.Animal',翻译成中卫便是:无法继承被final修饰的父类com.example.demo.finaldesc.Animal

如果将某个类设置为final形式,则类中的所有方法都被隐式设置为final形式,但是final类中的成员变量可以被定义为final或非final形式。

重要总结

final关键字的好处

  • final关键字提高了性能。JVM和Java应用都会缓存final变量。

  • final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销。

  • 使用final关键字,JVM会对方法、变量及类进行优化。

  • final修饰的类是不可变类。不可变类是指它的对象一旦被创建了就不能被更改了。String是不可变类的代表。不可变类有很多好处,譬如它们的对象是只读的,可以在多线程环境下安全的共享,不用额外的同步开销等等。

final的重要知识点

  1. final关键字可以修饰成员变量、本地变量、方法以及类。
  2. final成员变量必须在声明时,初始化或者在构造器中初始化,否则就会报编译错误。
  3. 你不能够对final变量再次赋值。
  4. final修改的对象不能重新指向新的引用,但是可以修改其属性值。
  5. 本地变量必须在声明时赋值。
  6. 在匿名类中所有变量都必须是final变量。
  7. final方法不能被重写。
  8. final类不能被继承。
  9. final关键字不同于finally关键字,后者用于异常处理。
  10. final关键字容易与finalize()方法搞混,后者是在Object类中定义的方法,是在垃圾回收之前被JVM调用的方法。
  11. 接口中声明的所有变量本身是final的。
  12. final和abstract这两个关键字是反相关的,final类就不可能是abstract的。
  13. final方法在编译阶段绑定,称为静态绑定(static binding)。
  14. 没有在声明时初始化final变量的称为空白final变量(blank final variable),它们必须在构造器中初始化,或者调用this()初始化。不这么做的话,编译器会报错“final变量(变量名)需要进行初始化”。
  15. 将类、方法、变量声明为final能够提高性能,这样JVM就有机会进行估计,然后优化。
  16. 按照Java代码惯例,final变量就是常量,而且通常常量名要大写。

http://chatgpt.dhexx.cn/article/TwldP4Gg.shtml

相关文章

Java中final修饰变量

一:final修饰的变量即成为常量,只能赋值一次,但是final所修饰局部变量和 员变量有所不同。 (1)final修饰的局部变量必须使用之前被赋值一次才能使用 (2)final修饰的成员变量在声明时没有赋值的叫“空白final变量”,空白final变量必须在构造器方法或静态代…

微信服务商-小程序支付-商户传入的appid参数不正确,请联系商户处理

报错:商户传入的appid参数不正确,请联系商户处理。 处理方式: 1、 2、需要在商户号,配置小程序的APPID https://pay.weixin.qq.com/static/pay_setting/appid_protocol.shtml

支付宝APP支付之查看支付宝商户ID

2019独角兽企业重金招聘Python工程师标准>>> 1、登录支付宝蚂蚁金服开放平台 2、查看账号详情,选择合作伙伴管理,账户管理,查看角色身份,此处的PID就是商户ID 3、点击秘钥管理,可查看绑定的相关应用及其APP…

iOS-微信支付商户支付下单id非法

最近在APP中WKWebView中调用微信支付的时候,一直报商户支付下单id非法。看了n边微信文档,度娘了n次-----仍未解决。因为安卓的支付是没有问题的所以就跟安卓兄弟要了最终调用微信的字符串: weixin://wap/pay?prepayid%3Dwx19165520991244d92…

微信企业付款 ”错误码:NO_AUTH,错误信息:此IP地址不允许调用接口,如有需要请登录微信支付商户平台更改配置“报错的处理办法

提示”错误码:NO_AUTH,错误信息:此IP地址不允许调用接口,如有需要请登录微信支付商户平台更改配置“ 快速解决问题!!! 解说一下这个IP:这个IP是你发起支付的服务器外网IP,跟用户发起提现IP没关系,所以这里配置的是服务器IP。 这是微信官方给…

微信外部浏览器支付遇到:支付场景非法、appid 未关联paysignkey、商户支付下单id非法 等问题

正常流程用户支付完成后会返回至发起支付的页面,如需返回至指定页面,则可以在MWEB_URL后拼接上redirect_url参数,来指定回调页面。如,您希望用户支付完成后跳转至https://www.wechatpay.com.cn,则可以做如下处理&#…

微信的商户单号和交易单号_教你获取支付宝和微信的订单号、商户单号,涨知识了...

生活中常会用到支付宝和微信交易,交易完成后会用到「订单号」「商户单号」,需要注意的是微信的 「交易单号」就 等同于「订单号」,「订单号」和「商户单号」一般在同一个地方就能找到!!! 获取支付宝「订单号…

微信支付商户平台,企业付款,企业向个人付款接口总结

这几天做项目,有个需求,是微信用户需要把公众号中赚的钱提现,于是查资料找到了微信商户平台中的高级业务:企业付款。 官方文档:https://pay.weixin.qq.com/wiki/doc/api/mch_pay.php?chapter14_1 为了以后方便看&am…

微信支付常见错误和统一下单错误码详情

微信支付常见错误和统一下单错误码详情 微信支付常见问题描述及解决方法微信调用统一下单接口,当result_codeFAIL时,错误代码及错误描述参考链接: 微信支付常见问题描述及解决方法 序号问题错误描述解决方法1此公众号并没有这些scope的权限&…

微信支付 ---- (商户号该产品权限处罚中)

微信支付 ---- (商户号该产品权限处罚中) 一、分析问题 今天星期天不情愿的来上班,刚坐下来准备吃一下我的小包子,客户爸爸就很核蔼来电话了~ 电话里面说微信小程序怎么不能支付了啊~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 我很淡…

小程序支付提示 商户号mch_id与appid不匹配 的解决

打开微信支付平台, 进入产品中心后, 点击关联更多Appid 之后填写小程序的appid即可。 appid 可以 从微信公众平台查看。 点开头像下拉即可看到appid填写完成后会提示 已成功发起APPID授权绑定申请 请提醒APPID管理员尽快确认申请请求 公众号(包括小程序…

小程序微信支付提示:商户订单号重复

最近在有用户反馈,点击订单结束无反应. 去后台看了看报错, 是这个样子的 <xml><return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> <appid><![CDATA[保密处理]]></appid>…

【支付】第三方支付收单机构

简要概述 现在&#xff0c;在银行卡收单市场里&#xff0c;第三方收单机构在全国范围类极速发展。 收单牌照的第三方支付机构&#xff0c;即通过线下布放POS&#xff0c;替商户收单&#xff0c;第三方支付机构一般是找一个合作的收单银行&#xff0c;对于收单银行自己的持卡人…

小程序支付报错:向微信请求统一下单失败:商户号该产品权限未开通,请前往商户平台>产品中心检查后重试

一.检查微信商户和小程序是否建立绑定关系,没有绑定的需要进行绑定 1.登录微信商户平台,产品中心-->AppId账号管理-->关联AppId 2.填写要绑定的小程序AppId和认证主体点提交(可在微信公众平台-->设置-->基本设置获取) 3.登录微信公众平台 -->功能-->微信支付…

jenkins下载插件失败的解决方案

最近自己搭建jenkins&#xff0c;想实现远程部署环境&#xff0c;下载插件时提示失败&#xff0c;需要说明的是jenkins安装插件失败的原因是多样的&#xff0c;这里查找原因应该是镜像库地址的问题&#xff0c;以下是解决方案。 1.报错提示&#xff1a; 2.解决步骤&#xff1a…

Jenkins下载插件,报java.net.SocketTimeoutException: Read timed out

使用Jenkins下载插件报错 解决办法&#xff1a; 系统管理->插件管理->Advanced 选择最后的update site,输入http://mirror.esuni.jp/jenkins/updates/update-center.json 记得点submit 重新下载插件&#xff0c;即可成功 转载至&#xff1a;https://blog.csdn.net/qq_…

K8S搭建自动化部署环境(三)Jenkins下载、安装和启动

各位大佬&#xff0c;前文如下: K8S搭建自动化部署环境&#xff08;一&#xff09;安装Kubernetes K8S搭建自动化部署环境&#xff08;二&#xff09;安装K8S管理工具Kuboard V3 一、jenkins 下载 jenkins下载地址&#xff1a;https://jenkins.io/zh/download/ 如下图&…

修改 jenkins 插件下载地址

Jenkins国外官方插件地址下载速度非常慢&#xff0c;可以修改为国内的地址。 如下步骤&#xff1a; 到jenkins主机 cd /var/lib/jenkins/ //这个是jenkins的开发目录 cat updates/default.json //这里记录的是刚才从官方网站下载的所有插件地址12 修改…

jenkins 下载插件失败处理办法

jenkins 下载插件失败处理办法 jenkins 下载插件失败,提示&#xff1a; java.io.IOException: Downloaded file /app/jenkins_home/plugins/jacoco.jpi.tmp does not match expected SHA-1, expected CtK02wHdFOxTutqhUQzmue6uvpg, actual YGO05utKyaaFzpGCgCE95GS0WsUat hud…

jenkins中配置git下载代码

**在jenkins中配置git下载代码需要具备以下三点&#xff1a;** 1、jenkins安装git插件 2、要有自己的git库地址&#xff0c;以及访问权限账号 3、执行git下载的任务的电脑&#xff0c;需要安装git客户端1、首先安装git插件&#xff0c;在插件管理中心搜索git安装 2、安装完成后…