Java中的final关键字和static关键字

        这两个关键字编写代码时会经常用,正确的使用这些关键字,可以形成良好的编程习惯,保护好代码的封装性。

1、final 关键字

        在Java中,利用关键字final指示常量,习惯上,常量名使用全大写。

        关键字final表示这个变量只能被赋值一次。一旦被赋值之后,就不能够再更改了。如果将实例字段定义为final,那么这样的字段必须在构造对象时初始化。也就是说,必须确保在每一个构造器执行之后,这个字段的值已经设置,开且以后不能再修改这个字段。

public class Test {//私有成员变量:此字段被构造函数赋值后不能再更改private final Integer traversalDepth;//构造函数public Test(Integer traversalDepth) {this.traversalDepth = traversalDepth;}
}

        在Java中,经常希望某个常量可以在一个类的多个方法中使用,通常将这些常量称为类常量(class constant)。可以使用关键字static final设置一个类常量。如果一个常量被声明为public,那么其他类的方法也可以使用这个常量。//一般情况下为保护封装性,都应该使内部成员变量为私有属性

(1)final 修饰变量、方法和类

        对变量和基本数据类型使用 final:final 表示该变量或基本数据类型只能被赋值一次。一旦赋值后,就不能再改变其值。

        对于引用类型final 保证引用不会改变,但对象本身可以被修改

public class Test {final int y;final Integer x;final List<String> list; //仍然可以往集合中添加元素public Test(int y, Integer x, List<String> list) {this.y = y;this.x = x;this.list = list;}
}

        对方法使用 final:当方法被声明为 final 时,子类无法重写或覆盖该方法。

        对类使用 final:当类被声明为 final 时,该类不能被继承,即不能有子类。

        final 关键字提供了一种限制或保护代码的方式,确保一些关键的变量、方法或类不被改变或继承。这种特性在编写安全性高、稳定性强的代码时非常有用。

(2)final 修饰的集合和不可变集合

        在 Java 中,使用 final 修饰集合时,意味着该集合的引用不可变,也就是说,这个引用在初始化后不能再指向其他对象。但是,这并不意味着集合本身不可变或不能被修改

import java.util.ArrayList;
import java.util.List;
public class Test {public static void main(String[] args) {final List<String> list = new ArrayList<>();// 可以添加元素,因为集合本身并未被声明为不可变list.add("A");// 这是合法的,因为没有改变集合引用的指向,仅修改了集合本身的内容list.add("B");System.out.println("add element to list. list content:" + list);list.remove("A");System.out.println("remove element from list. list content:" + list);}
}//输出:
add element to list. list content:[A, B]
remove element from list. list content:[B]

        如果你需要创建一个不可变的集合,可以考虑使用 Collections.unmodifiableList()Collections.unmodifiableSet()、Collections.unmodifiableMap() 等方法创建不可变视图,这样的集合视图将不能被修改。例如:

public class Test {public static void main(String[] args) {List<String> originalList = new ArrayList<>();originalList.add("A");originalList.add("B");List<String> unmodifiableList = Collections.unmodifiableList(originalList);//下面的操作会抛出 UnsupportedOperationException 异常unmodifiableList.add("c");// 试图添加元素到不可变集合中}
}//输出:
Exception in thread "main" java.lang.UnsupportedOperationExceptionat java.util.Collections$UnmodifiableCollection.add(Collections.java:1057)at test001.Test.main(Test.java:19)

2、static 关键字

(1)静态字段

        如果将一个字段定义为static,那么每个类只有一个这样的字段(类级别的字段。而对于非静态的实例字段,每个对象都有自己的一个副本。例如,假设需要给每一个员工赋予唯一的标识码。 如果将一个字段定义为静态,每个类只有一个这样的字段。而对于非静态的实例字段,每个对象都有自己的一个副本。//static -> 所有类的实例共享一个字段,不会有额外的副本,配上 final 就可成为全局常量

public class Employee {private static int globalId;  //属于类,所有实例共享private int employeeId;       //每个实例都有一个副本
}

        现在,每一个 Employee 对象都有一个自己的 employeeId 字段,但这个类的所有实例将共享一个 globalId 字段。即使没有 Employee 对象,静态字段 globalId 也存在。它属于类,而不属于任何单个的对象//属于类而不属于实例,所以不需要创建类对象即可调用 static 修饰的 public 成员变量。所以 static 修饰的变量会一直存在于内存,不会随着实例的回收而回收。

(2)静态方法

        类中的静态方法可以直接通过类名调用,而不需要创建类的实例。静态方法通常用于工具类辅助函数不依赖于特定实例的操作。

       static 关键字用于创建与类相关联而不是实例相关联的成员,它们可以通过类名直接访问而无需创建类的实例。

        static 关键字会涉及到类加载对象创建的相关知识点,有关类加载和对象创建可以点击这篇文章:《JAVA对象的创建、内存布局和访问》。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/230810.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络:自顶向下第八版学习指南笔记和课后实验--运输层

记录一些学习计算机网络:自顶向下的学习笔记和心得 Github地址&#xff0c;欢迎star ⭐️⭐️⭐️⭐️⭐️ 运输层 TCP&#xff1a; 传输控制协议 报文段 UDP&#xff1a; 用户数据包协议 数据报 将主机间交付扩展到进程间交付被称为运输层的多路复用与多路分解 将运输层…

【Java】【Stream流】分组

Java实际开发中使用流会提升代码的质量&#xff0c;所以这里继续分享使用流 玩分组 import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class StreamGroupingExample { public static void main(String[] args) { List<…

深入解析C语言数组与指针:嵌套循环遍历数组

在这篇博客中&#xff0c;我们将深入探讨C语言中数组和指针的关系&#xff0c;通过一个简单的嵌套循环遍历数组的例子展示了它们的使用。 代码示例 #include <stdio.h>int main() {int arr1[] {1, 2, 3, 4, 5};int arr2[] {2, 3, 4, 5, 6};int arr3[] {3, 4, 5, 6, …

RocketMq查看消息轨迹

查看消息轨迹 1.修改配置文件 broker的启动文件加上消息轨迹相关配置 ##if msg tracing is open,the flag will be true traceTopicEnabletrue2.启动broker 使用broker-a.properties配置文件后台启动Broker。 nohup mqbroker -c /usr/local/rocketmq/rocketmq-all-4.9.1-bin…

智能五子棋1

*一、项目需求* 五子棋是一种简单的黑白棋&#xff0c;历史悠久&#xff0c;起源于中国&#xff0c;后传入日本&#xff0c;在日本被称为“连珠”&#xff0c;是一种老少皆宜的益智游戏。 人工智能五子棋系统的目标用户是一切想致力于研究人机对弈算法理论的相关研究者和一切…

使用C语言设计并实现一个成绩管理系统

使用C语言设计并实现一个成绩管理系统&#xff0c;该系统用于教师管理一门课程的成绩。 系统功能&#xff1a;成绩录入、打印成绩单、修改成绩、统计分数段、统计平均分、统计不及格学生&#xff0c;相关要求&#xff1a; 1&#xff09; 系统要有主菜单界面&#xff0c;让教师…

关于《企业数字化平台》

大家好&#xff0c;开始我们《企业数字化平台》系列栏目&#xff0c;首先做一个简短的自我介绍&#xff0c;Duster是本人现在的笔名&#xff0c;曾用笔名尘埃&#xff0c;写了本书《生活新视界》&#xff0c;如果有缘的话&#xff0c;希望您读到他&#xff0c;如果您能读懂&…

Android Stuido报错处理

仅用作报错记录。防止以后出项问题不知如何解决。 报错1 Dependency‘androidx.annotation:xx requires libraries and applications … 需要修改CompileSDKVersion更改为报错中提示的版本 打开项目build.gradle文件&#xff0c;将compileSdk和targetSdk修改为报错中提示的版…

【深入pytorch】transforms.functional 梯度流动问题

实验环境&#xff1a; torch.__version__ Out[3]: 1.12.1cu113首先测试一下&#xff1a; import torch from torchvision.transforms import functional as F from torch.autograd import Function img torch.randn(1, 3, 224, 224) startpoints torch.FloatTensor([[0., 0…

.NET Core中鉴权 Authentication Authorization

Authentication: 鉴定身份信息&#xff0c;例如用户有没有登录&#xff0c;用户基本信息 Authorization: 判定用户有没有权限 使用框架提供的Cookie鉴权方式 1.首先在服务容器注入鉴权服务和Cookie服务支持 services.AddAuthentication(options > {options.DefaultAuthe…

【性能优化】一、使用JMeter进行压力测试并进行简单调优

压力测试 压力测试不同于功能测试&#xff0c;其目的是为了测试出系统在高并发&#xff0c;高数据量的情况下可能会出现的问题&#xff08;内存泄露、并发、同步&#xff09; 一种典型的内存泄漏就是对象在创建之后由很多用户进行调用&#xff0c;导致对象被不断新建但复用率…

2020 年网络安全应急响应分析报告

2020 年全年奇安信集团安服团队共参与和处置了全国范围内 660起网络安全应急响应事件。2020 年全年应急响应处置事件行业 TOP3 分别为:政府部门行业(146 起)医疗卫生行业(90 起)以及事业单位(61 起&#xff0c;事件处置数分别占应急处置所有行业的 22.1%、13.6%、9.2%。2020 年…

防篡改、控权限,一键搞定!迅软DLP助您轻松应对企业外发风险

由于电子文档传播性强&#xff0c;政企单位在与客户或合作伙伴分享重要资料时&#xff0c;存在非法篡改和无序传播的风险。因此&#xff0c;为了保护自身利益并确保与外界的安全交流&#xff0c;对外发文件的有效安全管控变得至关重要。 迅软DLP提供了针对外发文件的严格安全管…

OAuth 2.0进阶指南:解锁高级功能的秘密

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 OAuth 2.0进阶指南&#xff1a;解锁高级功能的秘密 前言令牌管理与刷新令牌的生命周期&#xff1a;刷新机制&#xff1a;有效管理访问令牌&#xff0c;防止令牌泄漏的方法&#xff1a; 客户端凭证客户…

宝塔Linux:部署His医疗项目通过jar包的方式

&#x1f4da;&#x1f4da; &#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; ​​​ &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Linux》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有…

OpenAI发布官方提示工程指南和示例

OpenAI提供了一系列策略和技巧&#xff0c;以帮助用户更有效地使用ChatGPT。这些方法可以单独使用也可以组合使用&#xff0c;以获得更好的效果。官方给出了6 个大提示策略&#xff08;并给出了具体教程和示例&#xff09; 主要策略&#xff1a; 1、清晰的指令&#xff1a; 告…

测试估算:确保项目成功的关键

引言&#xff1a; 在软件开发过程中&#xff0c;测试是不可或缺的一环。它可以帮助发现和修复软件中的错误和缺陷&#xff0c;提高软件的质量和可靠性。然而&#xff0c;测试工作需要耗费大量的时间和资源&#xff0c;因此进行测试估算是至关重要的。本文将介绍测试估算的重要性…

微信小程序校园跑腿系统怎么做,如何做,要做多久

​ 在这个互联网快速发展、信息爆炸的时代&#xff0c;人人都离不开手机&#xff0c;每个人都忙于各种各样的事情&#xff0c;大学生也一样&#xff0c;有忙于学习&#xff0c;忙于考研&#xff0c;忙着赚学分&#xff0c;忙于参加社团&#xff0c;当然也有忙于打游戏的&#x…

js中国标准时间转换

一、将中国标准时间转换为 例如 2023-12-18 08:00:00 // 获取今天的日期let today new Date();// 设置 beginDate 为今天的上午8点let beginDate new Date(today.getFullYear(), today.getMonth(), today.getDate(), 8, 0, 0, 0);// 设置 finishDate 为 beginDate 的后三天的…

快速排序(一)

目录 快速排序&#xff08;hoare版本&#xff09; 初级实现 问题改进 中级实现 时空复杂度 高级实现 三数取中 快速排序&#xff08;hoare版本&#xff09; 历史背景&#xff1a;快速排序是Hoare于1962年提出的一种基于二叉树思想的交换排序方法 基本思想&#xff1a…