从源码学习static的使用

从源码学习static的使用

前言

​ static意味静态的,在Java中,主要用来修饰类级别的变量或方法等,被修饰的内容,表示随着类的加载而加载,而不是具体的实例级别。

​ 具体到static的使用场景,主要有以下用途:静态变量、静态方法、静态代码块和静态内部类。

静态变量

​ 使用static关键字声明的变量称为静态变量(类变量),它们属于类而不是实例。所有的实例将共享同一个静态变量的值

​ 静态变量在源码中使用较为常见,通常用来修饰不变的静态常量。

在这里插入图片描述

比如Math类中的静态常态常量自然数E和圆周率PI,他们就被static修饰,可以直接通过类名来调用该静态常量;

静态方法

​ 使用static关键字声明的方法称为静态方法,可以通过类名直接调用,无需实例化对象

在这里插入图片描述

还是Math类的源码中,sin和cos方法被修饰为static的,在使用时,可以直接通过类名调用该方法,而无需再调用前实例化对象;

静态代码块

​ 使用static关键字声明的代码块称为静态代码块,它在类加载时执行,用于初始化静态变量或执行其他静态操作

在这里插入图片描述

如上述URLEncoder类,其定义了静态变量dontNeedEncoding,然后在静态代码块中对它进行了初始化等相关操作。

当然,除了操作静态变量外,也可以调用静态方法,进行一些处理。如下图中的DriverManager类,在静态代码块中,调用静态方法loadInitialDrivers进行一些初始化的操作:

在这里插入图片描述

静态内部类

​ 静态内部类是嵌套在另一个类中的类,使用static关键字声明,可以直接通过外部类名访问静态内部类。

​ 静态内部类与非静态内部类的区别在于,静态内部类不持有对外部类对象的引用,可以直接通过外部类名访问。静态内部类可以像普通类一样被实例化和访问,不依赖外部类的实例。

静态内部类的主要作用包括:

  1. 封装性:静态内部类可以将与外部类相关的类逻辑进行封装,使代码更加清晰和模块化。
  2. 隔离性:静态内部类与外部类解耦,不依赖于外部类的实例,可以独立存在,提高代码的灵活性和可维护性。
  3. 命名空间:静态内部类可以有效避免命名冲突,提供了更好的命名空间控制。

在这里插入图片描述

例如DriverManager类中有一个静态内部类DriverInfo,用于保存数据库驱动程序的信息。使用静态内部类的方式可以更好地组织代码结构,提高代码的可读性和可维护性。

static的使用场景

​ 通过上述实例,我们大概知道了static在修饰变量、方法、代码块和内部类时,如何使用。

​ 那具体到场景,我们应该什么时候考虑使用static呢,以下是一些可参考的建议:

  • 当需要表示类级别的常量或共享数据时,可以使用静态变量。
  • 方法与类的实例状态无关,仅与类本身相关时,可以使用静态方法。
  • 当需要在类加载时执行一次性的初始化操作时,可以使用静态代码块。
  • 当需要封装与外部类相关的逻辑且不依赖外部类实例时,可以使用静态内部类。
  • 静态工具类。静态工具类通常包含一些静态方法,用于提供通用的功能或工具方法。这些静态方法可以直接通过类名调用,无需实例化对象。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java 并发的三大特性

CPU 三级缓存架构 为平衡CPU与主存的处理速度问题,提出在CPU中设置多级缓存机制。 当CPU要读取一个数据时,首先从一级缓存中查找,如果没有找到再从二级缓存中查找,如果还是没有就从三级缓存或内存中查找。 每个核心都含有一套L…

高频面试题整理(一)

文章目录 平台无关性如何实现?JVM如何加载 .class文件?什么是反射?谈谈ClassLoader谈谈类的双亲委派机制类的加载方式Java的内存模型?JVM内存模型-jdk8程序计数器:Java虚拟机栈局部变量表和操作数栈: Java内存模型中堆和栈的区别…

vector 用法

C++数组是继承C语言的,C++标准库中的vector封装了动态数组,是一个模板类(vector<int>,<>里面可以是各种类型。 定义方式: vector<元素类型> 对象名(长度); (注:vector还有个好处就是,数组定义时长度那里不能包含变量,但是vector定义时长度那里可…

家政小程序有哪些功能 怎么制作

随着人们生活节奏的加快&#xff0c;家政服务变得越来越受到人们的青睐。为了提升家政服务的便捷性和高效性&#xff0c;家政小程序成为了越来越受欢迎的选择。下面具体介绍家政小程序有哪些功能&#xff0c;如何制作。 1. 展示家政服务 在小程序中&#xff0c;上传所有的家政…

C语言中的字体背景颜色汇总

客官请看效果 客官请看代码 #include <stdio.h> #include <stdlib.h> #include <windows.h>int main() {int i;for (i 0; i < 254; i) {SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), i); // 设置当前文本颜色为循环变量对应的颜色printf(…

Git+py+ipynb Usage

0.default config ssh-keygen -t rsa #之后一路回车,当前目录.ssh/下产生公私钥 cat ~/.ssh/id_rsa.pub #复制公钥到账号 git config --global user.email account_email git config --global user.name account_namebug of ipynb TqdmWarning: IProgress not found. Please …

移动端自动化常用的元素定位工具 介绍

在移动端自动化测试和开发中&#xff0c;元素定位是非常关键的一步。以下是一些常用的工具和技术来帮助开发者或测试工程师在移动设备上定位元素&#xff1a; 1. **UiAutomator**: - **UiAutomator** 是 Android 官方提供的自动化测试框架。它可以用来编写测试脚本&…

【电子通识】为什么单片机芯片上会有多组VDD电源?

在单片机芯片规格书中&#xff0c;我们经常能看到多个组VDD的设计&#xff0c;如下红框所示管脚都是VDD管脚。 为什么需要这样设计&#xff1f;只设置一个VDD管脚&#xff0c;把其他的VDD管脚让出来多做几个IO或是其他复用功能不好吗&#xff1f;接下来我们从单片机内部的电路结…

微信小程序商城-兜点零食

微信小程序商城 【微信小程序商城-兜点零食】 小程序采用uniappvue开发&#xff0c;后台djangopython开发&#xff0c;模块化方便二次开发 1、具备商城完整功能&#xff0c;包括在线下单、支付、订单跟踪、物流查询&#xff1b; 2、具备社交化分享功能&#xff0c;为用户提供分…

【Java程序设计】【C00290】基于Springboot的网上书城管理系统(有论文)

基于Springboot的网上书城管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的网上书城管理系统 本系统分为系统功能模块、管理员功能模块以及用户功能模块。 系统功能模块&#xff1a;在系统首页可以查看首…

【数据结构】时间复杂度(加法乘法规则、渐近时间复杂度、循环时间复杂度总结

2.2 时间复杂度 什么是时间复杂度&#xff1f; 评估算法时间开销 T ( n ) O ( f ( n ) ) T(n)O(f(n)) T(n)O(f(n)) 在实际求解中&#xff0c;只留表达式中最高阶的部分&#xff0c;丢弃其他部分。 如何求解&#xff1f; 求解步骤 1.找到一个最深层的基本操作&#xff1b; 2.分…

yolov8添加注意力机制模块-CBAM

修改 在tasks.py&#xff08;路径&#xff1a;ultralytics-main/ultralytics-main - attention/ultralytics/nn/tasks.py&#xff09;文件中&#xff0c;引入CBAM模块。因为yolov8源码中已经包含CBAM模块&#xff0c;在conv.py文件中&#xff08;路径&#xff1a;ultralytics-…

【README 小技巧】在项目README.md 中展示github点赞数量

在项目README.md 中展示github点赞数量 [![Star History Chart](https://api.star-history.com/svg?reposwujiawei1207537021/wu-lazy-cloud-network&typeDate)](https://star-history.com/#wujiawei1207537021/wu-lazy-cloud-network&Date)效果

【微服务】mybatis typehandler使用详解

目录 一、前言 二、TypeHandler简介 2.1 什么是TypeHandler 2.1.1 TypeHandler特点 2.2 TypeHandler原理 2.3 mybatis自带的TypeHandler 三、环境准备 3.1 准备一张数据表 3.2 搭建一个springboot工程 3.2.1 基础依赖如下 3.2.2 核心配置文件 3.2.3 测试接口 四、T…

java面向对象高级

一、静态 static读作静态&#xff0c;可以用来修饰成员变量&#xff0c;也能修饰成员方法。我们先来学习static修饰成员变量。 1.1 static修饰成员变量 Java中的成员变量按照有无static修饰分为两种&#xff1a;类变量、实例变量。它们的区别如下图所示&#xff1a; 由于静态…

通过底层原理理解Java是值传递还是引用传递?

本文学习目标或者巩固的知识点 参数传递方式 值传递引用传递指针传递 彻底理解Java的值传递和引用传递 从底层的角度分析值传递会发生复制行为 Java的参数传递例子 快手的一面面试曾经问到过此类题目&#xff0c;所以记下此篇加深印象。 问&#xff1a;求下面main方法中的输…

常用状态码

状态码 用于响应中的&#xff0c;表示响应的结果如何 1、200 OK 运行成功 2、404 Not Found 访问的资源没有找到&#xff08;url的路径&#xff09; 3、403 Forbidden 请求资源没有权限访问 4、405 Method Not Allowed 你的服务器只支持GET请求&#xff0c;但是你发了个PO…

基于springboot+vue的校园社团信息管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

sizeof和strlen的对比及练习题(超详细)

创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ sizeof和strlen的对比 sizeof举例说明 sizeof计算int类型数据 &#xff08;有关于数组&#xff09;sizeof计算 strlen举例说明 strlen是C语言库函数&#xff0c;求字符串长度 函数原型&#xff1a; size_t s…

前端项目打包体积分析与优化

一、安装依赖分析工具 npm install webpack-bundle-analyz 二、修改webpack.config.js文件 1、导入上面下载的包 2、在plugins里创建实例 三、启动打包命令 npm run build 会弹出如下界面&#xff1a; 四、优化 1、通过CDN导入react-dom文件 修改webpack.config.js文件里…