当前位置: 首页 > news >正文

static关键字和final关键字

在java的关键字中,static关键字和final关键字是两个必须掌握的关键字。static关键字和final关键字用法多样,且在一定环境下使用,可以提高程序的运行性能,优化程序的结构。下面将依次介绍static关键字和final关键字。注意,某些场景下,staic关键字和final关键字可以联合使用,这里也记录下。

static 关键字

static 关键字可以修饰多种成员,如使用static关键字修饰变量,以表示类变量;使用static关键字修饰方法,以表示类方法;使用static关键字代码块,以表示静态块;使用static关键字修饰内部类,以表示静态内部类;使用static关键字修饰包,以表示静态导包。

static 修饰字段

static关键字可以用来修饰字段,这里的字段仅包括成员变量,被修饰的成员变量也称静态变量。静态变量可以用于存储所有对象的公共属性。如:员工公司名称,学生所在的大学名称。在Java中,静态变量保存在方法区,可以被所有线程共享。静态变量通过较少相同数据的存储来达到节省内存的效果。静态变量的定义很简单,就是使用static关键字修饰成员变量。示例如下:

public class MyClass {public static String staticVariable; // 这是一个静态变量
}

static 修饰方法

static关键字可以用来修饰成员方法,被修饰的成员方法也称类方法。注意,静态方法属于类,不属于类的对象;可以直接调用静态方法,而无需创建类的实例;静态方法可以访问静态变量,并可以更改静态变量的值。静态方法通常用于执行与类本身相关的操作,而不是与特定实例相关的操作。静态方法的定义很简单,就是使用static关键字修饰成员方法。示例如下:

public class MyClass {public static String staticVariable; // 这是一个静态变量public static void staticMethod() {System.out.println("This is a static method.");staticVariable = "foo";  // 在静态方法中更改静态变量的值}
}

静态方法使用上有两个主要限制。它们分别是:(1) 静态方法不能直接使用非静态数据成员或调用非静态方法;(2) this和super两个关键字不能在静态上下文中使用。简言之,静态方法中不能使用对象或对象方法。
最经典的静态方法就是入口类的main方法:

public class Main {public static void main(String[] args) {System.out.println("Hello world.");}
}

这里简单介绍下,为什么Java的main方法是静态的。Java的main方法之所以是静态的,是因为它充当了程序的入口点。当运行一个Java程序时,JVM会首先寻找具有静态main方法的类,然后调用该类的main方法。main方法的关键特性有:
(1) main方法是一个静态方法。这意味着它不需要创建类的实例就可以被调用,减少不必要的对象创建。
(2) main方法具有特定的签名:它接收一个字符串数组作为参数。这是因为JVM通过命令行参数将数据传递给程序。
(3) 当运行Java程序时,JVM会自动调用具有静态main方法的类的main方法。

static 修饰代码块

static关键字可以用来修饰代码块,别修饰的代码块也称静态块。静态块主要用于初始化类,为类的静态变量赋初始值,提升程序性能。静态块有以下特点:
(1) 静态块类似于一个方法,但它不可以存在于任何方法体中。
(2) 静态块可以置于类中的任何地方,类中可以有多个静态初始化块。
(3) Java 虚拟机在加载类时执行静态代码块,很多时候会将一些只需要进行一次的初始化操作都放在静态块中进行。
(4) 如果类中包含多个静态代码块,则 Java 虚拟机将按它们在类中出现的顺序依次执行它们,每个静态代码块只会被执行一次。
静态块的定义很简单,就是使用"static + {}"的方式定义。示例如下:

public class MyClass {public static String staticVariable; // 这是一个静态变量static {staticVariable = "foo-1";System.out.println(staticVariable);}static {staticVariable = "foo-2";System.out.println(staticVariable);}
}

在上面的示例代码中,两个静态块按照在类中出现的顺序依次执行,所以staticVariable先被赋值为"foo-1",然后被赋值为"foo-2"。

static 修饰内部类

static关键字可以用来修饰内部类,被修饰的内部类称为静态内部类。静态内部类也称为嵌套类(这里特指Java语言)。静态内部类是一种特殊的内部类,当外部类在加载时,并不会立即加载其静态内部类,而是在第一次调用静态内部时,才会初始化静态内部类。所以,静态内部类可以实现延迟加载的效果。静态内部类的定义很简单,就是使用static关键字修饰内部类。示例如下:

public class OuterClass {private String privateField;private static String privateStaticField;private void visit() {// 外部类可以直接访问静态内部类的静态成员System.out.println(StaticInnerClass.privateStaticField);// 外部类可以实例化静态内部类,并访问该实例的私有成员StaticInnerClass staticInnerClass = new StaticInnerClass();System.out.println(StaticInnerClass.privateStaticField);}static class StaticInnerClass {private String privateField;private static String privateStaticField;public static void visit() {// 静态内部类方法中,可以直接使用外部类的静态私有成员System.out.println(OuterClass.privateStaticField);// 静态内部类方法中,可以实例化外部类,并访问外部类实例的私有成员OuterClass outerClass = new OuterClass();System.out.println(outerClass.privateField);}}
}

静态内部类的经典使用场景是基于静态内部类实现单例模式,示例代码如下:

public class Singleton {private Singleton() {}// 静态方法public static Singleton getInstance() {return SingletonHolder.INSTANCE;}// 静态内部类private static class SingletonHolder {private static final Singleton INSTANCE = new Singleton();}
}

使用静态内部类实现单例模式,不仅可以实现延迟加载,还能确保线程安全,也能保证单例的唯一性。更多静态内部类的说明可以参考Java内部类一文。

static 修饰包

static关键字可以用来修饰包,被修饰的包称为静态导包。JDK 在 1.5 版本支持静态导包。静态导包简化了静态变量或静态方法的使用。采用static导入包后,在不与当前类的方法名冲突的情况下,无需使用“类名.方法名”的方法去调用类方法,而是可以直接可以采用"方法名"去调用类方法,就好像是调用该类自己的方法一样。静态导包的实现很简单,就是在导入外部类时,额外添加static关键字。示例代码如下:

package xxx;// (1) 定义待引用的类并定义静态方法
public class CustomClass {public static void customStaticMethod(Object o){System.out.println(o);}
}
// (2) 在import包的同时,使用static关键字,并在引入类的最后加上".*"
import static xxx.CustomClass.*;public class Main {public static void main( String[] args ) {customStaticMethod("Hello World!");}
}

需要说明的是,虽然静态导包使代码更简洁,但可能会导致无法区分类方法和成员方法,从而导致代码的可读性和可维护性降低。在日常的编码活动中,并不推荐静态导包的写法。

final关键字

final 关键字可以修饰多种成员,如使用static关键字修饰数据,具体包括成员变量、局部变量、方法参数等;使用final关键字修饰方法,以防止方法被覆盖;使用final关键字修饰类,以防止该类被继承。

final 修饰数据

当在一个数据(成员变量、局部变量、方法参数)前使用final关键字时,这意味着这个数据的值是固定的,不能被改变,也即一个永不改变的编译时常量。注意final修饰的数据允许不初始化,也即"空白final"。空白final是指被声明为final但又未给定初值的字段。编译器需确保空白final在使用前必须被初始化。空白final修饰的变量一旦在运行时被初始化,就不会再改变。
注意,static关键字可以和final关键字联合使用修饰变量,表示不可变的类常量。
final修饰数据的方式很简单,就是在待修饰的数据前补充final关键字,示例如下:

public class MyClass {// static+final修饰变量,表示不可变的类常量private static final String FLAG = "red";// 空白finalprivate final String code;// final修饰的成员变量private final String name = "jack";public FinalDemo() {// 空白final修饰变量的初始化this.code = "foo";}public void testFinalParam(final String param) {// param = "new value"; // Cannot assign a value to final variable 'param'System.out.println(param);final String localVariable = "test"; //final修饰的局部变量// localVariable = "new value"; // Cannot assign a value to final variable 'localVariable'System.out.println(localVariable);}
}

说明,final参数的语义是不可在方法体中修改参数。对于基本类型,表示该基本类型不可被重新赋值;对于引用类型,表示不能更改参数引用所指向的对象

final 修饰方法

final关键字可以用来修饰成员方法,这意味着这个方法不能被重写或重载。final关键字用于表示方法已锁定,其子类无法修改它的含义。使用final关键字修饰的方法可以在编译期转化为内嵌方法,从而提供执行效率。但是因为这种优化效率并不高,所以不再作为特性使用。final关键修饰方法很简单,就是使用final关键字修饰成员方法。示例如下:

public class Main {public final void test1() {System.out.println("test1");}
}

注意,所有private方法都隐式指定为final。 需要说明的是,final方法并没有控制方法的访问权限,只是保证该方法不可被子类覆盖。如可以使用public权限控制final方法的访问权限。示例如下:

public class Main {public final void test1(){System.out.println("test1");}protected final void test2(){System.out.println("test2");}private final void test3(){System.out.println("test3");}
}

final 修饰类

final关键字可以用来修饰类,这意味着这个方法不能被继承。需要说明的是,因为final修饰的类不可继承,所以其方法均为final。final关键修饰类很简单,就是使用final关键字修饰类。示例如下:

public final class Main {public final void test1(){System.out.println("test1");}
}

与final关键字修饰成员方法类似,final修饰类时,并不能控制类的访问权限,只是保证该类不可被继承。常见的String类就是一个使用final修饰的类,对应源码如下:

public final class String implements java.io.Serializable, Comparable<String>, CharSequence {@Stableprivate final byte[] value;// ...
}

static和final联合使用

static和final可以联合使用,且目前为止只能用来修饰字段和方法。其实,两者联合使用,并没有特别处理,只是各自表示各自的含义,并没有1+1>2的效果。
static 关键字表示该变量或方法是属于类的,而不是属于类的任何一个实例的。因此,静态变量或方法可以在没有创建类的实例的情况下进行访问。
而final 关键字表示该变量或方法是一个常量或不可变的方法,其值不能被改变或方法不可覆盖。
static 关键字和 final 关键字结合使用,就表示以创建不可变的常量或不可变的静态方法。需要注意的是,当使用static关键字和final关键字修饰方法时,因为静态方法不属于对象,所以不存在被覆盖的情况,所以实际的应用中,使用static关键字修饰的方式可以不用final关键字修饰。示例代码如下:

public class MyClass {public static final float MY_CONSTANT = 3.14f;public static final void test() {System.out.println("test");}
}

在上面的代码中,使用 static 关键字和 final 关键字定义了一个不可变的静态常量 MY_CONSTANT,其值为 3.14。由于 MY_CONSTANT 是静态的,因此可以在没有创建 MyClass 类的实例的情况下访问它;由于它是常量的,因此它的值不能被改变。
使用 static 关键字和 final 关键字定义的test方法,由于static修饰的方法已表示静态方法,所以不存在被覆盖的情况,所以可以省略final关键字。

参考

《Java编程思想》(第四版) Bruce Eckel [译]陈昊鹏
https://www.yiibai.com/java/static-keyword-in-java.html Java static关键字
https://www.cnblogs.com/dotgua/p/6354151.html java static关键字的四种用法
https://www.changchenghao.cn/n/562466.html static变量放JVM哪个区域(static关键字基本概念和应用)

相关文章:

static关键字和final关键字

在java的关键字中&#xff0c;static关键字和final关键字是两个必须掌握的关键字。static关键字和final关键字用法多样&#xff0c;且在一定环境下使用&#xff0c;可以提高程序的运行性能&#xff0c;优化程序的结构。下面将依次介绍static关键字和final关键字。注意&#xff…...

使用Postman如何在接口测试前将请求的参数进行自定义处理

1、前言 当我们使用 Postman 进行接口测试时&#xff0c;对于简单的不需要处理的接口&#xff0c;直接请求即可&#xff0c;但是对于需要处理的接口&#xff0c;如需要转码、替换值等&#xff0c;则就麻烦一些&#xff0c;一般我们都是先手动把修改好的值拷贝到请求里再进行请…...

QT第二天

1.优化登陆界面&#xff0c;当点击登录按钮后&#xff0c;在该按钮对应的槽函数中&#xff0c;判断账户和密码框内的数据是否为admin和123456&#xff0c;如果账户密码匹配成功&#xff0c;则提示登陆成功并关闭登录界面&#xff0c;如果账户密码匹配失败&#xff0c;则提示登录…...

鸿蒙应用程序入口UIAbility详解

一、UIAbility概述 UIAbility是一种包含用户界面的应用组件&#xff0c;主要用于和用户进行交互。UIAbility也是系统调度的单元&#xff0c;为应用提供窗口在其中绘制界面。每一个UIAbility实例&#xff0c;都对应于一个最近任务列表中的任务。一个应用可以有一个UIAbility&am…...

扫地僧站群·静态养站王:自动万站智能LOGO功能说明

扫地僧站群静态养站王:自动万站智能LOGO功能说明,无需配置,自动根据网站状态生成对应LOGO&#xff0c;高质量LOGO万站不重样.说明&#xff1a;模板调用智能LOGO方式&#xff1a;{当前域名}/logo.png 自动识别HTTP/HTTPS 只需在模板需要展示LOGO的地方放上如上标签即可。以下为L…...

【Day-32慢就是快】代码随想录-二叉树-合并二叉树

给定两个二叉树&#xff0c;想象当你将它们中的一个覆盖到另一个上时&#xff0c;两个二叉树的一些节点便会重叠。 你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠&#xff0c;那么将他们的值相加作为节点合并后的新值&#xff0c;否则不为 NULL 的节点将直接…...

接口测试系列 —— 什么是接口测试?

接口测试系列 为什么要做这个事情&#xff1f; 对自己过往在接口测试上的经验&#xff0c;写一个小结的系列文章&#xff0c;是一个系统性的思考和知识构建。发布的同时&#xff0c;也是希望获得更多感兴趣的同学的意见和反馈&#xff0c;可以把这个部分做的更好。 接口测试概…...

qt作业day2

//widget.cpp#include "widget.h" #include "ui_widget.h"void Widget::usr_login() {if("admin" this->edit_acc->text()){if("123456" this->edit_psd->text()){speech->say("登录成功");emit jump_sig1…...

JWT一篇通

JWT 是什么&#xff1f; JWT&#xff08;JSON Web Token&#xff09;是一种开放的标准&#xff0c;标准的编号是RFC7591。用于在不同实体之间安全地传输信息。它是基于 JSON 编码的令牌。 JWT 的组成 JWT由三个部分组成&#xff1a;头部&#xff08;Header&#xff09;、载荷…...

【2023-09-01】vue中自定义按钮设置disabled属性后,异常触发click事件

vue中自定义按钮设置disabled属性后&#xff0c;异常触发click事件 项目中自定义按钮&#xff0c;使用a标签实现。设置disabled属性后&#xff0c;点击可以触发click事件。 由于各种原因&#xff0c;项目中并未使用成熟的第三方组件库&#xff0c;例如element-ui&#xff0c;a…...

nginx报错file not found解决

文章目录 一、nginx配置文件修改1.1 配置文件位置1.2 php fastcgi配置1.3 测试 二、nginxphp运行原理三、外网访问内网设置 采用nginxphp作为webserver的架构模式&#xff0c;在现如今运用相当广泛。然而第一步需要实现的是如何让nginx正确的调用php。由于nginx调用php并不是如…...

【力扣】96. 不同的二叉搜索树 <动态规划>

【力扣】96. 不同的二叉搜索树 给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;5 示例 2&#xff1a; 输入&am…...

Win11搭建 Elasticsearch 7 集群(一)

一&#xff1a; ES与JDK版本匹配一览表 elasticsearch从7.0开始默认安装了java运行环境&#xff0c;以便在没有安装java运行环境的机器上运行。如果配置了环境变量JAVA_HOME&#xff0c;则elasticsearh启动时会使用JAVA_HOME作为java路径&#xff0c;否则使用elasticsearch根目…...

哭了,python自动化办公,终于支持 Mac下载了

想了解更多精彩内容&#xff0c;快来关注程序员晚枫 大家好&#xff0c;这里是程序员晚枫&#xff0c;小红薯/小破站也叫这个名。 在我的主页发布的免费课程&#xff1a;给小白的《50讲Python自动化办公》&#xff0c;一直在更新中&#xff0c;昨晚12点多&#xff0c;有朋友在…...

【已更新建模代码】2023数学建模国赛B题matlab代码--多波束测线问题

一、 问题重述 1.1问题背景 海洋测深是测定水体深度与海底地形的重要任务&#xff0c;有两种主要技术&#xff1a;单波束测 深与多波束测深。单波束适用于简单任务&#xff0c;但多波束可提供更精确的地形数据。多 波束系统的关键在于覆盖宽度与重叠率的设计&#xff0c;以确保…...

GMSL技术让汽车数据传输更为高效(转)

目前&#xff0c;大部分车企都在其旗舰车型上配备了达到Level 2水平的自动驾驶技术&#xff0c;也就是高级自动驾驶辅助 ADAS系统。ADAS系统硬件主要由以下几部分组成&#xff0c;包括传感器、串行器、解串器、ADAS处理器等。 除了ADAS系统&#xff0c;包括传感器融合、音视频影…...

ARM+Codesys标准通用型控制器

整机工业级设计&#xff0c;通讯外设经过隔离保护 电源宽电压设计(9~36V DC ) 丰富的通讯接口&#xff0c;满足多种场合控制和通讯需求 四核工业级处理器&#xff0c;高性能&#xff0c;低功耗&#xff0c;高可靠性 机身无风扇设计&#xff0c;外壳小巧 搭载内核 100% 自主…...

YOLOV8从零搭建一套目标检测系统(修改model结构必看)附一份工业缺陷检测数据集

目录 1.YOLOV8介绍 2.YOLOV8安装 2.1环境配置 3.数据集准备 1.YOLOV8介绍 Yolov8结构图&#xff1a; YoloV8相对于YoloV5的改进点&#xff1a; Replace the C3 module with the C2f module. Replace the first 6x6 Conv with 3x3 Conv in the Backbone. Delete two Convs …...

Maven 的其它插件

文章目录 Maven 的其它插件dockerfile 插件Apache Maven Checkstyle Pluginp3c-pmd Maven 的其它插件 dockerfile 插件 dockerfile-maven-plugin 是 spotify 公司新提供的、用以替代 docker-maven-plugin 的插件&#xff0c;它同样是用于在 maven 中将当前项目打成一个 docke…...

系列十三、Java操作RocketMQ之带Key的消息

一、概述 RocketMQ中的消息&#xff0c;默认会有一个messageId当做消息的唯一标识&#xff0c;我们也可以给消息携带一个key&#xff0c;用作唯一标识或者业务标识&#xff0c;包括在控制面板&#xff08;Dashboard&#xff0c;RocketMQ的一个可视化面板&#xff09;中也可以使…...

避坑指南:在Linux DRM驱动开发中,实现plane的update_plane回调时要注意哪些检查?

Linux DRM驱动开发实战&#xff1a;update_plane回调必须处理的4大核心检查 当你为一块新的显示控制器编写DRM驱动时&#xff0c;update_plane回调函数就像是在走钢丝——内核框架已经帮你过滤了明显的错误&#xff0c;但剩下的每一步操作都直接影响显示稳定性和系统可靠性。本…...

从0到1落地智能仓储:C#上位机+Modbus RTU实现AGV集群调度与货物自动分拣

本文是纯实战、可直接落地的智能仓储完整方案,基于C# .NET 6 + Modbus RTU/Modbus TCP + AGV调度 + 自动分拣,从零搭建一套轻量级、低成本、高可靠的智能仓储系统,适用于电商仓库、工厂原料仓、成品仓、立体库。 无废话、无虚架构,代码可直接复制运行,适合新手从0到1上手智…...

AI 焦虑别乱投!3 个问题秒懂要不要养「虾」

作者 | 张辉清 责编 | 梦依丹出品 | 程序人生&#xff08;ID&#xff1a;coder_life&#xff09;当下 AI 热度居高不下&#xff0c;企业该如何抉择&#xff1f;是大举投入布局&#xff0c;还是保持观望&#xff1f;我们借以下三个问题来展开思考。AI 当下处在什么阶段&#xf…...

Postman团队版协作踩坑实录:我们是如何被‘英文界面’拖慢项目进度的

Postman团队协作中的语言障碍&#xff1a;从踩坑到高效协同的实战指南 当敏捷开发团队遭遇API协作瓶颈&#xff0c;语言差异往往成为最隐蔽的效率杀手。某金融科技团队在季度冲刺阶段&#xff0c;因Postman英文界面导致的接口理解偏差&#xff0c;直接造成核心支付模块延期两周…...

效率倍增:借助快马ai智能生成与管理系统化java面试题库

作为一名经常需要准备Java面试的开发者&#xff0c;我深刻体会到传统刷题方式的低效——手动收集题目、整理答案、标注重点不仅耗时&#xff0c;还容易遗漏关键知识点。最近尝试用InsCode(快马)平台的AI功能搭建了一个智能题库工具&#xff0c;效率提升超乎想象。以下是具体实现…...

低显存福音:实测Neeshck轻量化工具,16G显卡流畅跑Z-Image模型

低显存福音&#xff1a;实测Neeshck轻量化工具&#xff0c;16G显卡流畅跑Z-Image模型 1. 轻量化方案的诞生背景 1.1 大模型与小显存的矛盾 Z-Image作为国产文生图模型的代表&#xff0c;其强大的生成能力有目共睹。但原生部署对显存的高要求&#xff08;通常需要20GB以上&am…...

高效使用Cursor Free VIP:5步全面解锁AI编程Pro功能终极指南

高效使用Cursor Free VIP&#xff1a;5步全面解锁AI编程Pro功能终极指南 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached yo…...

2026长沙GEO优化公司权威实测:基于稳定性与转化效率的TOP5服务商深度推荐

2026长沙GEO优化公司权威实测&#xff1a;基于稳定性与转化效率的TOP5服务商深度推荐2026年&#xff0c;生成式AI搜索已深度重塑商业决策与品牌获客的路径。在全国GEO&#xff08;生成式引擎优化&#xff09;的版图中&#xff0c;长沙凭借活跃的数字经济生态与扎实的产业基础&a…...

notepad-- Markdown实时预览功能高效使用全攻略

notepad-- Markdown实时预览功能高效使用全攻略 【免费下载链接】notepad-- 一个支持windows/linux/mac的文本编辑器&#xff0c;目标是做中国人自己的编辑器&#xff0c;来自中国。 项目地址: https://gitcode.com/GitHub_Trending/no/notepad-- 作为一款支持Windows、…...

数字人表情驱动:ARKit blend shape中文对照与实战解析

1. ARKit blend shape基础概念解析 第一次接触ARKit的blend shape功能时&#xff0c;我也被这些英文术语搞得晕头转向。简单来说&#xff0c;blend shape就像是我们小时候玩的橡皮泥&#xff0c;通过调整不同部位的形状来改变整体表情。ARKit定义了52个标准面部动作单元&#…...