【JavaSE基础】小看final关键字?教你如何深入理解和使用(下)

简介: 【JavaSE基础】小看final关键字?教你如何深入理解和使用

🌰 3.final修饰静态变量


          说到变量肯定不能少了静态变量,修饰静态变量我们通常把static和final搭配使用,像这样的格式:

final static double PAI_Value=3.14;


有的人问这样搭配有什么好处吗?我们结合static和final的特点就知道了,静态变量不需要对象就可以使用,而且可以被全局调用,当再加上final后,它就变成了一个全局的常量。我再任何地方调用PAI_Value都像是调用了一个3.14一样。写成前者代码当然更好看美观一点,这种书写格式在我们观看各种方法的源码时可以经常见到。而且这样书写也有一定的规范,要用大写字母开头中间进行下划线连接。


🌰 3.final变量指向对象


          前面的变量指向的都是基本数据类型,接下来我们来看看当final变量指向对象时有什么不一样呢?


image.png


我们同样发现当我们第二次给被final修饰的变量student1赋值另外一个Student实例对象时,它报错了(这里举例的是局部变量的例子)


image.png


        同样从内存角度分析:当我们student1指向一个实例对象后,是不被允许指向另外一个。那我们可以改变李四或者1的值吗?这就讲到前文讲到的修改地址里的内容,我们来尝试一下


public static void main(String[] args) {
        final Student student1;
        student1 = new Student("李四", 1);
        student1.name="王五";
        student1.id=2;
        System.out.println(student1);
    }
}

image.png


       🎃 :我们发现我们是可以对final变量指向的地址的内容进行更改的,不能更改的是final变量保存的地址。


🌰 3.final和String的不可变性区别


       🌼 :final的不可变性我们知道是变量的指向不可变,指向的内容可以变。而String则相反,是指向可以变,但是指向的内容不可变。            


image.png


 就像这个图,如果我们有一个String a="hello",我们再写a="wrold"时,它不会把原来的hello改成wrold,而是改变a的指向指向另外一个字符串wrold,原来的hello是不可以被修改的。由此我们可知如果String对象被final修饰,那它就两者都不能修改啦。


🌲2.final修饰类


       final修饰类的情况比较少见结论也比较简单,就直接给大家结论记住:


     🔑:1.final修饰的类不可以被继承


              2.final不能修饰抽象类(抽象类是要被继承的,当然不能final修饰它啦)


             3.被final修饰的类一般是为了不让别人改变它,例如String  


🌲3.final修饰方法


       同样先给出结论:


       🔑:1.final修饰方法,则方法不能被重写。


                2.final修饰的方法可以被重载(一定要把重写和重载分清)


                3.我们使用final修饰方法,一般是为了给方法“上锁”,我们不希望父类被子类继承后,某个方法被子类覆盖或者改写,我们可以给方法加上final  


🌲3.小剧场解答及final总结


现在我们可以很清楚地明白小剧场的答案应该选B。ACD都是都是正确,B错的原因是,我们只要在使用final前对它赋值即可,并不是只能在类方法中(也就是静态方法,照它的意思岂不是静态方法才能final修饰变量?荒谬!)。final虽然我们自己写代码很少用到,但它也是Java的基础关键字,它在各种源码中非常常见,我们应该掌握和了解它


相关文章
|
传感器 Linux
在Linux中使用libmodbus库进行Modbus RTU主从机通信
Modbus RTU是一种常见的工业通信协议,用于在自动化系统中传输数据。libmodbus是一个流行的C库,用于在Linux系统上实现Modbus通信。本文将介绍如何使用libmodbus库在Linux上创建Modbus RTU主从机通信的示例代码。
5937 0
|
关系型数据库 C语言 PostgreSQL
PostgreSQL服务端开发学习 --- 常用结构及宏定义1
本篇主要讲解使用C语言开发PostgreSQL服务端应用(libpq、自定义函数、扩展)常用到的结构及宏定义。
|
6月前
|
安全 5G 网络安全
RDP:你的远程办公"任意门"使用说明书(附防黑客秘籍)
本文趣味讲解远程桌面协议(RDP)的前世今生,从1998年诞生到如今支持4K高清的Win11版本,带你了解其技术进化。文章剖析RDP工作原理,如数据加密传输、省流模式等,并警示安全风险,提供防护建议。此外,还对比了SSH、VNC等协议特点,展望RDP在量子计算与5G时代的未来,提醒用户平衡虚拟与现实生活。内容轻松幽默,适合各路“社畜”与技术爱好者阅读。
349 2
|
消息中间件 Java Kafka
SpringCloud学习笔记(五)-SpringCloudStream集成kafka(上)
Spring Cloud Stream是构建消息驱动的微服务应用程序框架。提供统一的接收发送管道以连接到消息代理。通过@EnableBinding注解开启SpringCloudStream的支持。通过@StreamListener注解,使其接收流处理的时间。
SpringCloud学习笔记(五)-SpringCloudStream集成kafka(上)
|
JSON JavaScript 前端开发
成功解决:正则表达式在vscode中会自动格式化一部分
这篇文章讨论了在Visual Studio Code中编写正则表达式时遇到的问题,即正则表达式因自动格式化而变形,并提供了使用双反斜杠、确保在字符串中定义正则表达式、检查文件类型等解决方法来避免这一问题。
成功解决:正则表达式在vscode中会自动格式化一部分
|
7月前
|
机器学习/深度学习 人工智能 Java
Java机器学习实战:基于DJL框架的手写数字识别全解析
在人工智能蓬勃发展的今天,Python凭借丰富的生态库(如TensorFlow、PyTorch)成为AI开发的首选语言。但Java作为企业级应用的基石,其在生产环境部署、性能优化和工程化方面的优势不容忽视。DJL(Deep Java Library)的出现完美填补了Java在深度学习领域的空白,它提供了一套统一的API,允许开发者无缝对接主流深度学习框架,将AI模型高效部署到Java生态中。本文将通过手写数字识别的完整流程,深入解析DJL框架的核心机制与应用实践。
373 3
|
11月前
|
运维 安全 Devops
DevOps实践中的安全审核和合规性
在DevOps实践中,确保安全审核和合规性至关重要。通过自动化合规审查、持续安全集成、基础设施即代码管理、敏捷合规框架、跨部门合作、教育与培训、实施DevSecOps模型、使用安全编码技术、整合正确工具及采用安全即代码等措施,组织能有效管理并降低合规与安全风险,促进高效可靠的DevOps文化发展。
|
7月前
|
自然语言处理 安全 API
1688 跨境属性 API 接口(1688API 系列)
1688跨境属性API助力跨境电商发展,提供商品目标市场适配、跨境物流、国际认证及语言文化属性等数据,支持HTTP GET/POST请求。开发者可通过商品ID、目标市场代码和语言参数精准获取信息,提升业务效率与精准度。示例代码展示了如何使用Python进行GET请求,获取商品跨境属性,确保数据准确可靠。
|
网络协议 安全
QT多线程
本文详细介绍了在Qt中如何正确使用QThread以及信号槽跨线程的使用方式,包括线程的正确退出方法和QObject在不同线程中创建子对象时可能遇到的问题。同时,文章还提供了相关博客和资料的链接,用于进一步学习和参考。
298 3
|
监控 安全 数据库
【Docker专栏】Docker容器化应用的最佳实践
【5月更文挑战第7天】本文介绍了 Docker 容器化应用的关键最佳实践,包括使用官方基础镜像、保持镜像精简、以非 root 用户运行容器、安全扫描、编写高效 Dockerfile、环境隔离、使用数据卷、选择合适网络模式、设置资源限制、使用版本标签、容器编排以及文档和自动化部署。遵循这些实践可提升效率和安全性,同时要注意随着技术发展不断更新知识。
345 10
【Docker专栏】Docker容器化应用的最佳实践