【static关键字的作用是什么?它用在什么场景?static关键字深度解析来袭】
2021/9/4/18:37
文章目录
- 1、一般情况下类的创建
- 2.一般情况下类创建产生的问题
- 2.1、第一种情况如何使用static解决
- 2.2、第二种情况如何使用static解决
- 3.如何调用static修饰的属性或方法
- 4.静态变量、方法和非静态变量、方法之间的调用问题
- 5、有关static相关的案例
- 6、静态代码块
- 7、静态代码块的作用以及需要注意的细节
1、一般情况下类的创建
一般情况下,只有当我们执行new来创建对象时,才能为数据分配存储空间;其中的方法或者属性才能被外界调用
2.一般情况下类创建产生的问题
有两种情况是上面无法解决的。第一种情况就是为某一特定域分配单一的存储空间(域也可以理解为类属性),不去考虑究竟要创建多少对象;第二种情况是希望某个方法不与类的任何对象联系在一起,也就是即使没有创建对象,也依旧可以调用这个方法。
2.1、第一种情况如何使用static解决
如上图所示,nation变量的值永远为china,创建一两个对象还可以,如果创建了上百个对象,那么是不是很浪费资源。所以我们可以使用静态关键字static进行标识该变量,就会变成如下
这就是使用static解决第一种情况(为特定域分配单一的存储空间),这静态区里的变量随着类的加载就存在了。在程序的整个运行过程中都存在,当程序结束时,由系统进行清除。(因此由static修饰的属性也可以成为全局变量)
2.2、第二种情况如何使用static解决
第二种情况我们都遇到过,比如工具类某某Utils,我们一般都是在其他类中直接类名.方法直接调用;
使用static修饰也要注意很多,不能过多的使用static修饰变量或者方法,因为static修饰的变量或方法是属于类层级的,虽然类的加载而分配存储空间,因此,你的static方法或者属性越多,在一开始就会分配固定的内存空间,那么大部分的内存空间分配给了static,剩下的内存空间就不多了,就会造成内存负担。
public static void main(String[] args) {..........}
static方法在不创建对象的情况下就可以通过类名调用,这对于main方法很重要,main方法是运行一个应用的入口点。
3.如何调用static修饰的属性或方法
1.类名.属性
class Test{static String num = 1;
}
Test.num = 2;
2.引用.属性
Test test = new Test();
test.num = 2;
由于静态修饰的方法或属性是类层级的,随着类的加载而出现,所以通过类名.方法调用应该都会明白;那么通过引用调用静态变量该怎么理解呢?
这是因为static修饰的变量或方法是被类的所有对象共享的,也就是其中任何一个对象都可以调用进行修改。
4.静态变量、方法和非静态变量、方法之间的调用问题
1.无法在静态方法中调用非静态变量
这是因为静态方法是随着类的加载而加载,非静态变量是new该类对象时而加载;前者出现过早,根本无法加载到其中的非静态变量。
2.非静态方法可以调用静态变量
和第一个类似,静态变量首先出现,轮到加载非静态方法时当然可以得到
3.无法在静态方法中调用非静态方法,可以在静态方法中调用非静态方法
总之,只要牢牢记住静态和非静态的加载顺序就很容易理解了。
5、有关static相关的案例
class StaticTest {static int num = 10;
}
StaticTest test1 = new StaticTest();
StaticTest test2 = new StaticTest();
test1.num++;
System.out.println(test2.num);
结果:11
只要记住static修饰的变量被类的所有对象共享,那么这一类的题就会很容易就能解决!
6、静态代码块
首先静态代码块随着类的加载而执行,而且只运行一次;如果由多个静态代码块,会按照顺序来执行。
看下面一段代码是否在你的意料之中
public class StaticTest {static {System.out.println("静态代码块执行....");System.out.println(country);}private static String country = "china";public static void main(String[] args) {System.out.println(country);}
}
结果
当我该变顺序之后
public class StaticTest {private static String country = "china";static {System.out.println("静态代码块执行....");System.out.println(country);}public static void main(String[] args) {System.out.println(country);}
}
结果:
所以当在静态代码块中调用静态变量时,一定要将定义静态变量的位置放在静态代码块之前。
7、静态代码块的作用以及需要注意的细节
如果一些代码在项目启动时就要执行并且只需要执行一次,那么就可以放到静态代码块中。比如我们启动一个项目要加载相应的配置文件,那么我们就可以将其放到静态代码块中
需要注意的细节
1.静态代码块不能出现在任何方法当中
无论是静态方法还是非静态方法都是如此
对于非静态方法,这个很好理解,因为静态代码块是在类加载之后就能运行的;而非静态方法只能在new完对象之后,通过对象才能运行这个方法
对于静态方法,在类加载时,虽然静态方法也加载了,但是静态方法必须通过类名或者对象名才能访问。也就是说静态方法是被动运行的,静态代码块是主动运行的。
2、静态代码块不能访问普通变量
这个应该就不用说了。需要注意的是静态代码块中能够访问静态变量,但必须将静态变量的位置放在静态代码块前面。
2021/9/4/22:43
【static关键字的作用是什么?它用在什么场景?static关键字深度解析来袭】相关推荐
- c++语言static作用,详解c++中的 static 关键字及作用
注:若没有特指是 静态成员时,默认都是普通成员: 1 类中的普通成员 类中的成员变量 和 成员函数 是分开存储的.其中, 1)每个对象都有独立的成员变量:成员变量可以存储在 栈空间.堆空间.全局数据区 ...
- 、简述global关键字的作用_详解static inline关键字
详解static inline关键字 本文章为知乎用户 @徐yang哟 原创,禁止抄袭! 灵感来源 在查stm32的LL库部分函数的API时,有时会查到这种函数: __STATIC_INLINE vo ...
- c语言 static 关键字的作用
static 关键字的作用 全局静态变量 局部静态变量 静态函数 类的静态成员 类的静态函数 全局静态变量 在全局变量前加上关键字 static,全局变量就定义成一个全局静态变量. 静态存储区,在整个 ...
- C++中 static 关键字的作用
C++中 static 关键字的作用 对于函数定义和代码块之外的变量声明,static 修改标识符的链接属性,由默 认的 external 变为 internal,作用域和存储类型不改变,这些符号只能 ...
- php 中的作用是什么,php中static关键字的作用是什么
php中static关键字的作用是:1.放在函数内部修饰变量,函数执行完后变量值仍然保存:2.放在类中修饰属性或方法,如果修饰的是类的属性,则保留值:3.放在类的方法中修饰变量:4.修饰全局作用域的变 ...
- c语言中{的作用,C语言中Static和Const关键字的作用
C语言中Static和Const关键字的作用 程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于(堆)中.那么关于C语言中Static和Const关键字的作用,你了解多少 ...
- java static关键字的作用是什么_static关键字有什么作用
今天主要学习下Java语言中的static关键字. static关键字的含义及使用场景 static是Java50个关键字之一.static关键字可以用来修饰代码块表示静态代码块,修饰成员变量表示全局 ...
- java中static关键字的作用_面试|static 关键字有什么作用
今天主要学习下Java语言中的static关键字. static关键字的含义及使用场景 static是Java50个关键字之一.static关键字可以用来修饰代码块表示静态代码块,修饰成员变量表示全局 ...
- C++static关键字的作用
C++ --static关键字的作用 1.全局静态变量 : 在全局变量前加上关键字static,全局变量就变成了一个全局静态变量. 静态存储区:在整个程序执行期间一直存在. 初始化:未经初始化的全局静 ...
最新文章
- “自拍神器”贴心实用功能大曝光
- Dictionary解析json,里面的数组放进list,并绑定到DataGridView指定列
- STL中用erase()方法遍历删除元素
- 计算MATLAB时间复杂度的例子,学编程数学到底有多重要?线性代数能否视为一门程序语言呢?...
- Java程序转成exe可执行程序方法和exe4_j下载地址和破解。
- 【Python 爬虫】 4、爬虫基本原理
- python如何拟合三维平面(拟合Intel Realsense D435深度数据点)
- 图胜千言:电商支付架构设计
- Qt5设置应用程序图标及程序的发布
- 首次安装Linux,配置网络、换源一步到位
- 键、索引、约束及其区别
- 一个DirectInput演示程序
- JAVA架构师之路-视频学习
- NAS网络配置、资源管理和用户访问权限
- DHCP server和DHCP relay配置
- 使用7段数码管实现0到99数码管显示(循环嵌套)
- EMBA必看书籍推荐
- 安卓10源码开发定制(29)手电筒控制源码分析
- FlashBuilder精选插件
- python 存储字典_python 字典存储
热门文章
- SqlServer 2008 R2定时备份数据库,并且发送邮件通知
- 【NPOI】.NET EXCEL导入导出开发包
- 案例分析:免费的维护服务
- linux系统怎样指定gpu运行,linux服务器如何指定gpu以及用量
- pdf 中的java运行,java - 从pdf文件读取特定位置的itext在intellij中运行,并提供所需的输出,但是可执行jar抛出错误 - 堆栈内存溢出...
- echarts指针进度条刻度调整_指针式流量开关
- 武汉自考本科计算机专业哪个好,2020年武汉自考本科专业有哪些?
- java sleep join_Java多線程之sleep,wait,join和yield關鍵字
- java发送串口命令_如何發送命令到串口(JAVA + RXTX)
- hashCode() 和equals() 区别和作用