static,final,static final修饰变量到底有什么区别?

article/2025/9/23 13:25:54

平时在项目中可能经常会用到一些常量,一般都定义成static final的,有时候可能会突然想到,到底staitc,final,static final定义的变量到底有什么关系呢?

通过以下例子一起看一下:

/*** @Description: 变量定义类* @Author: yuhua* @Date: 2018/12/7*/
public class FinalStaticDemo {public final double aDouble= Math.random();public static double bDouble = Math.random();
}
/*** @Description: static与final修饰变量详解测试类* @Author: yuhua* @Date: 2018/12/7*/
public class FinalStaticTest {/*** final跟static的代码表现总结* 1.final的变量在定义初始化的取值与1、2条输出值一样。* 若是在期间修改( myClass.aDouble=11.00;)final的值会报错:Error:(7, 16) java: 无法为最终变量aDouble分配值。* 2.通过对static变量定义赋初值输出,与先后两次修改static的值,其值都在变化。* 3.我们观察输出两个对象的final变量值是不同的,而在同一个阶段(过程中未发生修改),两个static的变量值是相同的。** final跟static的总结* 1.由代码表现1,可以得到final的一经赋初值自始至终都不会改变,在代码过程中不允许对final的值做修改。* 2.static得变量在定义赋初值后,在以后的代码中可以被修改,只要是改一次就变一次,。* 3.static变量跟final变量在内存中分布不同,final变量在堆内存中,两个对象各有一块且有自己的初值,而static在data seg区域只存在一份值(共享)。** 最终结论,通过实验我们可以得出:* 1.final变量在赋初值后,在后期过程中不可被改变。* 2.static变量在赋初值后,每次修改都可以改变,且在方法区中仅有一份,两个对象共享信息。* 3.static final定义的常量,在dataseg区域存在一份不可修改的常量值。** 另外,final修饰有如下特征:* 1.final修饰的类不能被继承* 2.final修饰的方法不能被子类重写* 3.final修饰变量,变量不能被修改*/public static void main(String[] args) {
1.        FinalStaticDemo finalStaticDemo = new FinalStaticDemo();
2.        FinalStaticDemo finalStaticDemo1 = new FinalStaticDemo();
3.        System.out.println("FinalStaticDemo类定义final变量时候取值:    "+ finalStaticDemo.aDouble);
4.        System.out.println("FinalStaticDemo1类定义final变量时候取值:   "+ finalStaticDemo1.aDouble);
5.        System.out.println("FinalStaticDemo类定义static变量时候取值:   "+ finalStaticDemo.bDouble);
6.        System.out.println("FinalStaticDemo1类定义static变量时候取值:  "+ finalStaticDemo1.bDouble);//第一次修改static值
7.        finalStaticDemo.bDouble=Math.random();//final变量不能被修改,只是值不能被再分配,你若是强行修改他就报错:Error:(36, 32) java: 无法为最终变量aDouble分配值
//                finalStaticDemo.aDouble=11.00;
8.        System.out.println("1  第一次myClass final:            "+ finalStaticDemo.aDouble);
9.        System.out.println("2  第一次myClass1 final:           "+ finalStaticDemo1.aDouble);
10.       System.out.println("3  第一次myClass static:           "+ finalStaticDemo.bDouble);
11.       System.out.println("4  第一次myClass1 static:          "+ finalStaticDemo1.bDouble);//第二次修改static值
12.       finalStaticDemo1.bDouble=Math.random();
13.       System.out.println("5  第二次myClass static:           "+ finalStaticDemo.bDouble);
14.       System.out.println("6  第二次myClass1 static:          "+ finalStaticDemo1.bDouble);}
}输出值:
FinalStaticDemo类定义final变量时候取值:    0.1331466337681967
FinalStaticDemo1类定义final变量时候取值:   0.6718066536403038
FinalStaticDemo类定义static变量时候取值:   0.7568583648875984
FinalStaticDemo1类定义static变量时候取值:  0.7568583648875984
1  第一次myClass final:            0.1331466337681967
2  第一次myClass1 final:           0.6718066536403038
3  第一次myClass static:           0.8134530385938469
4  第一次myClass1 static:          0.8134530385938469
5  第二次myClass static:           0.4914602180950418
6  第二次myClass1 static:          0.4914602180950418

过程内存分析图:为了画图方面,我把finalStaticDemo看作c1,finalStaticDemo2看作c2,aDouble看作a,bDouble看作b。

1、运行到第1句后,内存分布状态:

2、执行完第二句后,内存分布状态(注意看方法区,这时候里面就一份静态变量值为data,final值未变化):

3.执行完第7句,内存分布状态(注意看方法区中的静态变量,这时候已经被修改了,起初final变量仍未变化): 

上面讲清楚了static,final,自然而然static final定义的变量就很简单了,被它定义过的变量是在方法区中初始值赋值后不可修改的一块值空间。

对于内存分析不是很明白的可以再回顾一下这一篇文章https://blog.csdn.net/Myuhua/article/details/81385609

 


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

相关文章

final修饰成员变量和局部变量的区别

昨晚12点以后,跟人讨论问题,无意中聊到了final可以修饰的类型以及修饰后所具备的特点,可以详见 java基础问题101问(javaSE阶段知识汇总) 聊到final修饰成员变量和局部变量有什么区别时,只是隐约记得大概,没有十足把握&…

final修饰变量、方法、类举例

第一种,final修饰变量 经过final修饰过的STR2"2"就是普通的字符串连接,不再重新new,而str3"2"相当于new了一个新的String对象。 第二中,final修饰方法 父类中经过final修饰过的方法,在子类中不能…

final修饰的变量

被final修饰的实例变量必须显式指定初始值,而且只能在如下3个位置指定初始值. 1.定义final实例变量时指定初始值; 2.在非静态初始化块中为final实例变量指定初始值; 3.在构造器中为final实例变量指定初始值. 对于普通实例变量,Java程序可以对它执行默认的初始化,也就是将实…

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

目录 引言final修饰变量final修饰变量,不可再改变量的值final修饰对象,能否修改对象属性值final全局静态变量 final修饰方法final修饰类重要总结final关键字的好处final的重要知识点 引言 在开发的过程中,经常会使用String类来处理字符串相关…

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_…