详解static关键字在Java中的各种适应场景,这个很重要!
写在开头
静态(static)关键字在Java的众多关键字中举足轻重!也是很多大厂面试官特别喜欢问的面试高频知识点,今天我们就一起学习,梳理,重温一下这个关键吧,之所以用重温修饰是因为在过往的文章中早已提到了static,无论是变量中还是方法中甚至于类中,static都是不可或缺的!
我们知道要想调用类中的属性和方法,通常情况下,需要创建一个对象,初始化完成之后,通过对象的引用去访问,而static修饰的方法和变量为类所有,因此,可以直接跳过对象的初始化,主要类被加载了就可以直接通过类名.属性名/方法名进行直接调用!
一、静态变量
【代码示例】
public class Person {
//成员变量
//在类内部但在方法体外声明的变量称为成员变量,或者实例变量,或者字段。
//之所以称为实例变量,是因为该变量只能通过类的实例(对象)来访问。
int data1 = 3;
//静态变量
//通过 static 关键字声明的变量被称为静态变量(类变量),
//它可以直接被类访问
static int data2 = 4;
public int sum(){
//局部变量
//在方法体内声明的变量被称为局部变量,该变量只能在该方法内使用,
//类中的其他方法并不知道该变量。
int a = 1;
int b = 2;
return a+b;
}
public static void main(String[] args) {
Person person = new Person();
System.out.println(person.data1 == person.sum());
System.out.println(Person.data2 == person.sum());
}
}
二、静态方法
【代码示例】
public class Test {
public static void main(String[] args) {
System.out.println(sub(2,1));
}
//若方法的声明中加上了static关键字,静态方法是属于类的,
//而不是属于类创建的对象或实例的,故在调用时无需通过对象实例。
public static int sub(int a,int b){
return a - b;
}
}
三、静态代码块
虽然静态代码块和main()方法都被static修饰,但静态代码块通常用来初始化一些静态变量,它会优先于 main() 方法执行。来段代码感受一下:
【代码示例】
public class Test {
public static void main(String[] args) {
System.out.println("main 方法");
}
static {
System.out.println("静态代码块");
}
}
输出:
静态代码块
main 方法
四、静态内部类
静态嵌套类,并没有对实例的共享关系,仅仅是代码块在外部类内部
静态的含义是该内部类可以像其他静态成员一样,没有外部类对象时,也能够访问它
静态嵌套类仅能访问外部类的静态成员和方法
在静态方法中定义的内部类也是静态嵌套类,这时候不能在类前面加static关键字。
【代码示例】
class OuterFish {
static class InnerFish {
}
}
class TestStaticFish {
public static void main(String[] args) {
//创建静态内部类对象
OuterFish.InnerFish iFish = new OuterFish.InnerFish();
}
}
static在Java中的主要用法就这么多了,那么好,接下来我们就根据它的用法来进行最后的总结
总结
1、static 可以修饰变量、方法、代码块和内部类 static 变量是这个类所有,由该类创建的所有对象共享同一个 static
2、可以通过创建的对象名.属性名 和 类名.属性名两种方式访问 static 变量在内存中只有一份 static
3、修饰的属性,也就是类变量,是在类加载时被创建并进行初始化,只会被创建一次 static 修饰的变量可以重新赋值 static
4、方法可以通过对象名.方法名和类名.方法名两种方式来访问 static 方法中不能用 this 和 super 关键字 static
5、方法必须被实现,而不能是抽象的abstract static 方法不能被重写 static
6、代码块在类被第一次加载时执行静态代码块,且只被执行一次,主要作用是实现 static 属性的初始化 static
7、内部类属于整个外部类,而不属于外部类的每个对象,只可以访问外部类的静态变量和方法
相关文章:

SpringBoot3集成Zookeeper
ZooKeeper是一个集中的服务,用于维护配置信息、命名、提供分布式同步、提供组服务。分布式应用程序以某种形式使用所有这些类型的服务。

websocket服务端本地部署
即登录cpolar官网后,点击预留,保留一个固定tcp端口地址,然后将其配置到相应的隧道中即可。这里我们用cpolar内网穿透来映射内网端口,它支持http/https/tcp协议,不限制流量,无需公网ip,也不用设置路由器,操作简单。注意:该隧道选择的是临时tcp地址和端口,24小时内会变化,如需固定tcp地址,可升级为专业套餐做tcp地址固定!cpolar安装成功后,默认会配置两个默认隧道:一个ssh隧道和一个website隧道,可自行删减或者修改。,可以查看到token码,复制并执行命令进行认证。

使用DockerFile构建镜像与镜像上传
首先Dockerfile 是一个文本格式的配置文件, 用户可以使用 Dockerfile 来快速创建自定义的镜像。

微信小程序之WXSS模板样式、页面配置(.json)和网络数据请求
一、WXSS 模板样式1、什么是 WXSS2、WXSS 和 CSS 的关系二、WXSS 模板样式 - rpx1、什么是 rpx 尺寸单位2、rpx 的实现原理3、rpx 与 px 之间的单位换算*三 、WXSS 模板样式 - 样式导入1、什么是样式导入2、@import 的语法格式四、WXSS 模板样式 - 全局样式和局部样式1、全局样式2、局部样式五、页面配置1、页面配置文件的作用2、页面配置和全局配置的关系3、页面配置中常用的配置项。

Redis 击穿、穿透、雪崩产生原因解决思路
也就是在设定的时间里数据没有取出来,但是锁由过期了,常见的思路是,锁过期时间值递增,但是想想不靠谱,因为第一个请求可能超时,如果后面的也超时呢,接连多次超时之后,锁过期时间值势必特别大了,这样做弊端太多。雪崩,和击穿类似,不同的是击穿是一个热点Key某时刻失效,而雪崩是大量的热点Key在一瞬间失效,网络上很多博客都在强调解决雪崩的策略是随机过期时间,这个非常不准确,举个例子,银行做活动,之前这个利息系数为2%,过了零点系数改为3%,这种情况能将用户的对应的key改为随机过期吗?如果用的过去的数据叫脏数据。

spring和springboot、springMVC有什么区别?
今天来聊一下,刚在面试中被问到的一个经典问题Spring 提供了广泛的功能用于企业级应用开发Spring Boot 简化了 Spring 应用的开发和部署Spring MVC 则是专注于构建 Web 应用的 MVC 框架在使用时,你可以根据项目需求选择合适的组件或组合使用它们。在很多现代的 Spring 应用中,特别是微服务架构中,Spring Boot 和 Spring MVC 经常一起使用。好了,以上就是本文的全部内容,如有问题欢迎留言讨论。

Java中的方法重载和方法重写有什么区别?
Java中的方法重载(Overloading)和方法重写(Overriding)都是面向对象编程中的重要概念,但它们之间有一些区别。方法重载是指在同一个类中,可以定义多个具有相同名称但参数列表不同的方法。这些方法具有不同的参数类型、参数个数或参数顺序。在调用重载方法时,Java编译器会根据传递给方法的参数类型和数量来选择要调用的正确方法。方法重载主要用于解决方法的命名冲突和提高代码的可读性和可维护性。

python基础使用之变量,表达式,语句
PYTHON基础知识系列之变量、表达式、语句

C语言常见面试题:什么是宏,宏的作用是什么?
宏在计算机科学中是一种批量处理程序命令,它是一种抽象的规则或模式,用于说明某一特定输入(通常是字符串)如何根据预定义的规则转换成对应的输出(通常也是字符串)。在编译时,预处理器会对宏进行展开,即将宏的内容替换到宏所在的位置。以上是宏的一些主要作用,但并不是全部。在实际编程中,根据需要选择是否使用宏以及如何使用宏,以实现更好的代码组织和可读性。,这样就可以计算出a和b的和。这个例子展示了宏的基本用法和作用。在这个例子中,我们定义了一个宏。,用于计算两个数的和。时,预处理器会将其展开为。

python基础小知识:引用和赋值的区别
通过引用,就可以在程序范围内任何地方传递大型对象而不必在途中进行开销巨大的赋值操作。不过需要注意的是,这种赋值仅能做到顶层赋值,如果出现嵌套的情况下仍不能进行深层赋值。赋值与引用不同,复制后会产生一个新的对象,原对象修改后不会影响到新的对象。如果在原位置修改这个可变对象时,可能会影响程序其他位置对这个对象的引用

MySQL数据库查询语句之组函数,子查询语句
当一个SQL的执行需要借助另一个SQL的执行结果时,则需要进行SQL嵌套,该语法结构称之为子查询。先筛选出符合要求的数据,再对符合要求的数据进行分组时,分组的工作量会被减少,效率更高。先确定从哪张表进行操作-->对表中数据进行分组-->基于分组结果进行查询操作。执行顺序:优先执行小括号内的子SQL,根据子SQL的执行结果再执行外层SQL。执行顺序:from-->where-->group by-->select。执行顺序:from-->group by-->select。

k8s 使用tomcat官方镜像部署集群并解决访问页面404
官方镜像这里有个坑,使用kubectl启动之后,页面报错404,仔细检查发现,是因为tomcat的webapp目录下没有对应的文件,所以连初始界面都无法显示。要想显示,必须要根据官方镜像自己构建一个Dockerfile。根据上面的信息可以看出,该POD部署在k8s-node1上,映射POD的8080端口到master的30088端口上。这里需要将镜像上传到自己搭建的registry,并配置nodes节点都可以正常访问5000端口。三、根据官方镜像自己构建一个一次性就能启动的Tomcat镜像。

Servlet系列:生命周期(init、 service、destroy)详解
Servlet的生命周期是由Web容器(如Tomcat)管理的,包括以下三个阶段: 加载和实例化:当Web应用程序启动时,Web容器会加载和实例化Servlet。加载和实例化过程可以在应用程序启动时自动完成,也可以通过Servlet的名称手动加载。在实例化Servlet后,Web容器会调用其init

一文搞清楚Java中的方法、常量、变量、参数
写在开头 在上一篇文章:一文搞清楚Java中的包、类、接口 中我们讲了Java中的包、类和接口,今天继续将剩下的方法、常量、变量以及参数梳理完。 Java中的变量与常量 在JVM的运转中,承载的是数据,而数据的一种变现形式就是“量”,量分为:常量与变量,我们在数学和物理学中已经接触过变量的概念了,在

Java开发者的Golang进修指南:从0->1带你实现协程池
当然,我写的简易版协程池还有很多可以优化的地方,比如可以实现动态扩容等功能。今天我们要简单总结一下协程池的优势,主要是为了降低资源开销。协程池的好处在于可以重复利用协程,避免频繁创建和销毁协程,从而减少系统开销,提高系统性能。此外,协程池还可以提高响应速度,因为一旦接收到任务,可以立即执行,不需要等

mysql开启可以使用IP有权限访问
为实际的IP地址和你想要设置的密码。请小心操作,并确保你了解每个命令的作用。如果你对此有任何疑问,最好咨询经验丰富的数据库管理员。来设置或修改用户的密码。相反,你需要分两步来完成这个过程:首先创建或修改用户,并设置密码;然后授予相应的权限。用户应该能够从指定的内网IP地址访问MySQL服务器。用户已存在并且你只是想更改其密码或允许从另一个地址访问,使用。在MySQL 8.0及更高版本中,语句的语法有所变化。替换为你的内网IP地址,

elementPlust 的el-select在提示框关闭时自动弹出
主要问题就是因为filterable属性,根本解决方案是选中的时候让他失去焦点 el-select有一个visible-change事件,下拉框出现/隐藏时触发。当el-select添加filterable属性时,弹提示窗时,点击确定后,下拉框会自动弹出。console.log('弹窗出select', item)增加了visible-change事件。el-select事件最后增加焦点取消。

在C#中调用C++函数并返回const char*类型的值
在C#中,使用DllImport特性将C++函数声明为外部函数。在Main方法中,调用generateProjectCode函数并将返回的指针转换为const char*类型的字符串。在C#中调用C++函数并返回const char*类型的值,可以使用Interop服务来实现。C++代码需要编译为动态链接库(DLL)。

在 Spring MVC 中,用于接收前端传递的参数的注解常用的有以下几种
form-data参数使用multipart/form-data作为Content-Type,前端使用params格式传参,后端使用@RequestParam注解接收参数。- json请求体参数使用application/json作为Content-Type,前端使用data格式传参,后端使用@RequestBody注解接收参数。- 路径传参不需要设置Content-Type,前端将参数通过URL传递,后端使用@PathVariable注解接收参数。

Spring AOP 技术实现原理
Spring AOP的实现基于代理模式,通过代理对象来包装目标对象,实现切面逻辑的注入。通过本文,我们深入了解了Spring AOP是如何基于JDK动态代理和CGLIB代理技术实现的。通过详细的示例演示,希望读者能更清晰地理解Spring AOP的底层原理,并在实际项目中灵活应用这一强大的技术。

在react中说说对受控组件和非受控组件的理解?以及应用场景
这时候当我们在输入框输入内容时,会发现输入的内容无法显示出来,此时input标签是一个可读的状态,因为value被this.state.username所控制,当用户输入时,this.state.username不会自动更新,这样的话input的内容就不会发生变化了,想要解除被控制,可以为input标签设置onChange事件,触发的时候更新state,从而导致input框内容更新。简单来讲,就是受我们控制的组件,组件的状态全程响应外部数据。

这些年背过的面试题——架构设计篇
对技术人来说,面试成功的道路只有一条,就是好好准备技术基础。本文是面试系列文章架构设计篇,作者把自己的八股文和一些经验总结汇总在一起,供大家参考。

计划任务线程池ScheduledThreadPoolExecutor原理
根据对象、执行时间等入参,创建对象,将一个普通的对象包装计划任务调用方法,把这个包装好的任务放入队列中,如果有需要的话,为线程池创建新的工作线程在提交任务中,线程池做的事情十分简单,无非是创建任务、放入队列提交任务以后,线程池中存活的工作线程worker就可以从工作队列workQueue// 计划线程池ScheduledThreadPoolExecutor 是 线程池ThreadPoolExecutor 的子类// ...= null) {// ...task.run();// ...

鸿蒙Harmony-页面路由(router)详解
慢慢理解世界,慢慢更新自己,希望你的每一个昨天,今天,和明天都会很快乐,你知道的,先好起来的从来都不是生活,而是你自己

基于深度学习的细胞感染性识别与判定
通过引入深度学习技术,我们能够更精准地识别细胞是否受到感染,为医生提供更及时的信息,有助于制定更有效的治疗方案。基于深度学习的方法通过学习大量样本,能够自动提取特征并进行准确的感染性判定,为医学研究提供了更高效和可靠的手段。通过引入先进的深度学习技术,我们能够实现更快速、准确的感染性判定,为医学研究和临床实践提供更为可靠的工具。其准确性和效率将为医学研究带来新的突破,为疾病的早期诊断和治疗提供更可靠的支持。通过大规模的训练,模型能够学到细胞感染的特征,并在未知数据上做出准确的预测。

Visual Studio 设置编辑框(即代码编辑器)的背景颜色
如果你想要实现黑色主题,那么通常会将项背景色设置为黑色,并调整前景色(字体颜色)以保证对比度,便于阅读代码。这样一来,Visual Studio 的代码编辑器背景颜色就会按照你的设置进行更改。对于更深度的主题定制,可能需要安装第三方插件或主题包来提供完整的深色UI支持。

鸿蒙harmony--数据库sqlite详解
今天是1月20号星期六,早安,岁末大寒至,静后春归来。愿他乡故人,漂泊有归宿,前程有奔赴,愿人间不寒,温暖常伴,诸事顺利,喜乐长安。

Golang 搭建 WebSocket 应用(八) - 完整代码
本文应该是本系列文章最后一篇了,前面留下的一些坑可能后面会再补充一下,但不在本系列文章中了。

Centos系统上安装PostgreSQL和常用PostgreSQL功能
PostgreSQL安装成功之后,会默认创建一个名为postgres的Linux用户,初始化数据库后,会有名为postgres的数据库,来存储数据库的基础信息,例如用户信息等等,相当于MySQL中默认的名为mysql数据库。权限代码:SELECT、INSERT、UPDATE、DELETE、TRUNCATE、REFERENCES、TRIGGER、CREATE、CONNECT、TEMPORARY、EXECUTE、USAGE。为了方便我们使用postgres账号进行管理,我们可以修改该账号的密码。

【PostgreSQL】函数与操作符-网络地址函数和操作符
下表展示了可以用于cidr和inet类型的操作符。操作符=和&&测试用于子网包含。它们只考虑两个地址的网 络部分(忽略任何主机部分),然后判断其中一个网络部分是等于另外一个或者是 另外一个的子网。cidr。