45从零开始学Java之详解static修饰符、静态变量和静态方法
作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦
千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者
前言
在前一篇文章中,壹哥给大家讲解了abstract关键字,从而我们掌握了抽象类与抽象方法的特性。除此之外,面向对象的核心修饰符还有static和final。今天这篇文章,壹哥会继续带领大家学习static关键字的特性,请各位打起精神来吧。static关键字是Java开发中很常用也很重要的一个关键字,我们必须要搞清楚哦。
---------------------------------------------------前戏已做完,精彩即开始---------------------------------------------
全文大约【3300】字,不说废话,只讲可以让你学到技术、明白原理的纯干货!本文带有丰富的案例及配图视频,可以让你更好地理解和运用文中的技术概念,并可以给你带来具有足够启迪的思考......
配套开源项目资料
Github:
https://github.com/SunLtd/LearnJava
Gitee:
一一哥/从零开始学Java
一. static关键字
1. 简介
在Java中,static表示“静态的”,它也是一种修饰符,可以修饰属性、方法、代码块和内部类。
2. 特性
static修饰符具有如下特性:
- 被static修饰的属性(成员变量)称为静态变量,也叫做类变量;
- 被static修饰的常量称为静态常量;
- 被static修饰的方法称为静态方法,也叫做类方法;
- 被static修饰的代码块叫做静态代码块;
- 被static修饰符的内部类,叫做静态内部类。
其中,静态变量、静态方法、静态常量统称为类的静态成员,归整个类所有,不属于某个单一的对象。也就是说,静态成员不属于某个对象单独拥有,而是被类的所有实例对象共享。举个例子,我们在教室里放了一台饮水机,这台饮水机是本教室所有成员共享的,不属于张三,也不属于李四,这台饮水机就是”静态成员“。而每个人还可以有自己单独的一个水杯,张三、李四都有自己独有的水杯,水杯不是共享的。另外,默认情况下,这些水杯是不能混用的,张三和李四彼此的水杯是互相隔离的。也就是说,自己的隐私不可被侵犯和窥探。
所以,静态成员不需要通过对象来进行访问,而是直接通过类来访问。只要这个类被加载,Java虚拟机就可以根据类名找到它们。我们调用静态成员的语法格式如下:
类名.静态成员
3. 注意事项
根据以上特性,我们需要注意以下几点:
- static关键词修饰的成员变量和方法都属于类,不属于某个对象;
- 普通变量和方法属于某个对象,每个对象都有自己的变量和方法,彼此之间是隔离的;
- 静态方法不能调用非静态的变量和非静态的方法,否则编译时就会报错。
4. 配套视频
与本节内容配套的视频链接如下:
Bilibili External Player
二. 静态属性与静态常量
1. 概念
在Java类中,由static修饰的属性(成员变量)叫做静态变量,也叫类变量。而被static修饰的常量就叫做静态常量,静态变量和静态常量统称为静态成员。注意,局部变量不能被声明为静态变量。
对于静态变量和静态常量来说,无论一个类实例化出来多少个对象,它的静态成员都只有一份拷贝,可以被所有的对象共享。
对实例变量来说,每个实例对象都有自己独立的变量,各个实例对象中的同名变量互不影响。但是对于静态变量来说,无论修改哪个实例对象的静态变量,效果其实都是一样的。也就是说,所有实例对象的静态变量都会被修改,原因在于静态变量并不属于某个单独的实例对象所有。
所以当我们需要在多个对象之间进行信息共享的时候,就可以考虑使用静态变量或静态常量,增加实例之间的交互性。而如果类的所有实例对象都包含一个相同的常量属性,我们就可以把这个属性定义为静态常量,以此节省内存空间。
可以说,实例成员在每个实例对象中都有自己的一个独立的私有“空间”,但是静态成员只有一个共享的公共“空间”,所有实例对象都会共享该静态成员。
2. 语法
对于静态变量或静态常量,我们可以通过如下格式调用:
类名.变量名
类名.常量名
3. 静态变量与实例变量的区别
我们现在已经知道什么是静态变量,什么是实例变量(成员变量)了,那么两者的区别有哪些呢?壹哥给大家总结一下。
3.1 静态变量
- JVM虚拟机只会为静态变量分配一次内存,在加载类的过程中完成对静态变量的内存分配;
- 我们可以在类的任意方法中直接访问任意静态变量;
- 我们可以在其他类中通过"类名.静态变量"的形式,来访问该类中的静态变量。
3.2 实例变量
- 每创建一个Java实例对象,JVM虚拟机就会为该实例变量分配一次内存;
- 我们可以在类的非静态方法中直接访问实例变量;
- 在类的静态方法中,需要通过"对象.实例变量"的形式进行访问。
4. 案例
4.1 定义静态属性和常量
我们来定义一个Student类,在该类中定义如下几个成员变量、静态变量和静态常量。
/*** @author 一一哥Sun* 千锋教育*/
public class Student {//成员变量public String name;//静态变量public static String className;//静态变量public static int age;//静态常量public static final String SCHOOL_NAME="湘北中学";//静态方法public static void setAge(int age) {//静态方法中不能使用this和super!//this.age=age;//可以通过“类名.静态成员”的形式来调用Student.age=age;//在本类中,我们也可以直接在static方法中直接访问本来中的静态成员System.out.println("age="+age+",className="+className);}
}
4.2 定义测试类
接下来我们再来定义一个测试类,看看如何在代码中调用这些成员变量、静态变量等。对于静态变量和静态常量,我们要通过”类名.静态成员“的形式进行调用,但是不建议通过“对象.静态变量”的形式来调用静态变量,虽然这样调用也不会报错!如果这样调用,会提示”静态属性应该通过静态方式来访问,The static field Student.className should be accessed in a static way”。
/*** @author 一一哥Sun* 千锋教育*/
public class StaticTest {public static void main(String[] args) {Student stu01=new Student();//调用成员变量stu01.name="流川枫";System.out.println("学生名称="+stu01.name);Student stu02=new Student();//调用成员变量stu02.name="樱木花道";System.out.println("学生名称="+stu02.name);//调用静态变量Student.className="高一.10班";System.out.println("班级名称="+Student.className);System.out.println("学校名称="+Student.SCHOOL_NAME); //不建议通过“对象.静态变量”的形式来调用静态变量!静态属性应该通过静态方式来访问!//The static field Student.className should be accessed in a static way//System.out.println("学生所在班级="+stu02.className);}
}
从上述案例中,我们可以总结出如下规律:
- 对于成员变量,要通过“对象.变量名”的形式调用;
- 成员变量属于某个对象,属于对象自己的“私有财产”,不能被整个类共享,对象之间不能共享这些成员变量;
- 静态变量和静态常量属于整个类,可以被类的所有对象共享,属于“公共财产”;
- 在同一个类中,我们可以在静态方法中直接调用静态成员,也可以通过“类名.静态成员”,或“对象.静态成员”的方式进行调用;
- 虽然语法支持通过“对象.静态变量”或“对象.静态常量”的方式进行调用,但不建议这样做;
- 对于静态成员,一般都是要通过“类名.静态成员”的方式调用,否则在编译时会有“静态属性应该通过静态方式来访问”的提示;
5. 配套视频
与本节内容配套的视频链接如下:
Bilibili External Player
三. 静态方法
1. 概念
被static修饰的方法叫做静态方法,也叫做类方法。我们经常在工具类中定义静态方法,比如常用的工具方法Arrays.sort()、Math.random()等。静态方法具有以下特性:
- 静态方法中只能调用静态成员和静态方法;
- 静态方法中不能使用this和super关键字;
- 抽象方法不能使用static进行修饰;
- 静态方法不能被重写,但可以被继承!
2. 语法
对于静态方法,我们可以通过如下格式调用:
类名.方法名
3. 静态方法与实例方法的区别
接下来壹哥再给大家总结一下静态方法与实例方法的区别。
- 静态方法可以直接通过“类名.方法名”的形式调用;
- 静态方法中不能使用this和super关键字;
- 静态方法中不能访问非静态的成员;
- 实例方法中可以直接访问所属类的静态变量、静态方法、实例变量和实例方法。
4. 案例
4.1 定义静态方法
我们在静态方法中,只能调用静态的成员和静态的方法,不能调用非静态的!
/*** @author 一一哥Sun* 千锋教育*/
public class Student {//静态变量public static int age;//静态方法---静态方法中只能调用静态成员和静态方法,不能调用非静态的!public static void setAge(int age) {//静态方法中不能使用this和super!//this.age=age;//可以通过“类名.静态成员”的形式来调用Student.age=age;System.out.println("age="+age);}
}
4.2 调用静态方法
对于静态方法的调用,需要使用“类名.静态方法名”的格式。
/*** @author 一一哥Sun* 千锋教育*/
public class StaticTest {public static void main(String[] args) {//调用静态方法---类名.静态方法名Student.setAge(100);}
}
5. 配套视频
与本节内容配套的视频链接如下:
Bilibili External Player
-------------------------------------------------正片已结束,来根事后烟-----------------------------------------------
四. 结语
至此,壹哥就把static静态变量、静态常量、静态代码块、静态类、静态导入等相关的内容给大家介绍完毕了,这是我们开发时很常用的内容,所以壹哥希望各位初学者,要把static相关的内容牢牢掌握。最后简单总结一下本文要点:
- 静态变量、静态方法、静态常量统称为类的静态成员;
- 静态成员归整个类所有,不属于某个单一的对象,是类中的“公共财产”;
- 要弄清楚静态变量和实例变量的区别;
- 静态方法中不能使用this和super关键字;
- 静态方法中不能访问非静态的成员。
另外如果你独自学习觉得有很多困难,可以加入壹哥的学习互助群,大家一起交流学习。
五. 今日作业
1. 第一题
class MyClass{static int a;int b;
}public class TestMain{public static void main(String args[]){MyClass mc1=new MyClass();mc1.a=100;mc1.b=200;MyClass mc2=new MyClass();mc2.a=300;mc2.b=400;System.out.println(mc1.a);System.out.println(mc1.b);System.out.println(mc2.a);System.out.println(mc2.b);}
}
分析上述代码的执行结果,请在评论区给出你的答案。
相关文章:
45从零开始学Java之详解static修饰符、静态变量和静态方法
作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在前一篇文章中,壹哥给大家讲解了abstract关键字,从而我们掌握了抽象类与抽象…...
电商超卖,从业务到设计
编辑导语:超卖这一概念的定义可以从不同层面进行阐述,比如平台层面、渠道层面、仓库层面等。而假设因超卖导致订单难以履行,则容易让用户体验“打折”。为什么有时电商超卖的现象会发生?可以从哪些角度来降低超卖导致的风险&#…...
【MySQL】表的约束
表的约束 表的约束1. 空属性2. 默认值3. 列描述4. zerofill(自动补零)5. 主键—primary key5.1 复合主键 6. 自增长—auto_increment7.唯一键 --- unique8. 外键 --- foreign key…reference9. 综合案例 表的约束 真正约束字段的是数据类型,…...
【计算机网络】第一章 概述(下)
文章目录 第一章 概述1.5 计算机网络的性能指标1.5.1 速率1.5.2 带宽1.5.3 吞吐量1.5.4 时延 1.6 计算机网络体系结构1.6.1 常见的体系结构1.6.2 分层的必要性1.6.4 体系结构中的专用术语 1.8 习题 第一章 概述 1.5 计算机网络的性能指标 常用的 计算机网络 的性能指标有以下 …...
化工园区人员全过程轨迹化安全解决方案
1、项目背景 化工园区化工厂是生产安全重点单位,对人员定位管理需求强烈。对人员定位主要需求是:一般区域人数统计、人员轨迹、重点区域人员实时精准定位。 华安联大安全化工园区人员全过程轨迹化安全解决方案通过人员实时定位管理、移动轨迹追溯、险情…...
Java泛型中的T、E、K、V、?通配符,你确定都了解吗?
目录 前言 泛型带来的好处 泛型中通配符 小结 前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。 泛型的本质是参数化类型,也就是说所操…...
Jenkins部署及使用
Jenkins 1.定义 1.Jenkins是一款开源CI/CD软件,用于自动化各种任务,包括构建、测试和部署软件 1.CI/CD 1.CI:持续集成(Continuous Integration) 1.协同开发是目前主流的开发方式,一般由多位开发人员同时处理同一个应用的不同模块…...
UML类图(二)
相信希望,相信自己 上一章简单介绍了 设计模式的原则(一), 如果没有看过,请观看上一章 本文参考文章: 常见UML符号详解 UML (Unified modeling language) 统一建模语言,是一种用于软件系统分析和设计的语言工具, 它用于帮助软件开发人员进行…...
【IoU全总结】GIoU, DIoU, CIoU, EIoUFocal, αIoU, SIoU,WIoU【基础收藏】
🥑 Welcome to Aedream同学 s blog! 🥑 并不存在效果一定优秀的IoU,需要结合自己的网络、数据集试验。 不想深究原理可直接跳转总结。文内公式均为手打,非图片,方便查看 文章目录 L1 Loss,L2Loss࿰…...
docker 安装 mysql
第一步,安装docker ,确保centos环境符合要求,有网 yum install docker -y 第二步:拉取mysql 首先可以先查询支持的mysql: search # 拉取镜像 docker pull mysql # 或者 docker pull mysql:latest # 以上两个命令是一致的&…...
Java 流程控制之 for 循环
Java语言中的for循环是一种常用的循环结构,用于重复执行一段代码,直到指定的条件不再成立。在本篇博客中,我们将深入探讨Java中的for循环,包括其语法、用法和示例。 一、for循环的基本语法 for循环的基本语法如下: …...
Kubernetes那点事儿——暴露服务之Ingress
Kubernetes那点事儿——暴露服务之Ingress 前言一、ingress负载均衡器Ingress Controller路由规则Ingress 二、Ingress Controller三、案例 前言 在 k8s 集群中,如果我们将服务暴露出来,提供访问,可以使用Nodeport方式,但是Nodepo…...
八股文总结
文章目录 项目介绍1.不动产项目项目难点机器学习算法调研图像提取算法调研数据集-ImageNetXceptionVGGInceptionDensenetMobilenet 系统流程图 2.图书项目技术栈ShiroMybatisMyBatis:Mybatis Plus: 面试问题 Java基础基本数据类型反射接口和抽象类异常代理模式1. 静态代理2. 动…...
【浅学 MyBatis 】
MyBatis 笔记记录 一、MyBatis基础1. MyBatis介绍及快速入门2. 相关API介绍2.1 Resources2.2 SqlSessionFactory&&SqlSessionFactoryBuilder2.3 SqlSession 3. 映射配置文件4. 核心配置文件4.1 规范写法4.2 参数和返回类型_起别名 5. 引入Log4j 二、MyBatis进阶1. 接口…...
Windows版Redis安装
最近电脑重装了系统,很多常用的软件、应用都没有了,所以需要重新装,所以想借此机会把一些安装比较复杂的应用的安装过程,重新记录一下,方便后续, 安装 Redis默认只有Linux的版本,但是微软为了更…...
Flume面试题二十道
什么是Apache Flume? 参考答案:Apache Flume是一个可靠、分布式、可扩展的日志收集和聚合系统。它用于将大量的日志数据从不同的源(如Web服务器、应用程序日志)传输到目标(如Hadoop、HBase)中进行存储和分析…...
单链表OJ题:LeetCode--138.复制带随即指针的链表
朋友们、伙计们,我们又见面了,本期来给大家解读一下LeetCode中第138道单链表OJ题,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! 数据结构与算法专栏:数据结构与算法 个 人…...
Chapter7: SpringBoot与数据访问
尚硅谷SpringBoot顶尖教程 1. JDBC 1.1 依赖及配置 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency><groupId>mysql</groupId…...
【Sqlite3】maraidb和sqlite3部分命令操作区别
maraidb和sqlite3部分命令操作区别记录 1.安装sqlite3 在实现我的视频点播系统项目时,我尝试封装了两种数据库的调用逻辑 mysql(maraidb)sqlite3 这里封装sqlite3的原因是,sqlite3主要针对的就是嵌入式数据库,其性能…...
Linux中新建用户使用sudo问题
文章目录 sudo问题 sudo问题 sudo:权限提示指令,当使用sudo这条指令时,会将普通用户的权限提升为root权限 但是在命令行新建用户,这个用户使用sudo指令对一条指令提权是用不了的 这个用户没有在sudoers file这个文件中ÿ…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...
