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关键字深度解析来袭】相关推荐

  1. c++语言static作用,详解c++中的 static 关键字及作用

    注:若没有特指是 静态成员时,默认都是普通成员: 1 类中的普通成员 类中的成员变量 和 成员函数 是分开存储的.其中, 1)每个对象都有独立的成员变量:成员变量可以存储在 栈空间.堆空间.全局数据区 ...

  2. 、简述global关键字的作用_详解static inline关键字

    详解static inline关键字 本文章为知乎用户 @徐yang哟 原创,禁止抄袭! 灵感来源 在查stm32的LL库部分函数的API时,有时会查到这种函数: __STATIC_INLINE vo ...

  3. c语言 static 关键字的作用

    static 关键字的作用 全局静态变量 局部静态变量 静态函数 类的静态成员 类的静态函数 全局静态变量 在全局变量前加上关键字 static,全局变量就定义成一个全局静态变量. 静态存储区,在整个 ...

  4. C++中 static 关键字的作用

    C++中 static 关键字的作用 对于函数定义和代码块之外的变量声明,static 修改标识符的链接属性,由默 认的 external 变为 internal,作用域和存储类型不改变,这些符号只能 ...

  5. php 中的作用是什么,php中static关键字的作用是什么

    php中static关键字的作用是:1.放在函数内部修饰变量,函数执行完后变量值仍然保存:2.放在类中修饰属性或方法,如果修饰的是类的属性,则保留值:3.放在类的方法中修饰变量:4.修饰全局作用域的变 ...

  6. c语言中{的作用,C语言中Static和Const关键字的作用

    C语言中Static和Const关键字的作用 程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于(堆)中.那么关于C语言中Static和Const关键字的作用,你了解多少 ...

  7. java static关键字的作用是什么_static关键字有什么作用

    今天主要学习下Java语言中的static关键字. static关键字的含义及使用场景 static是Java50个关键字之一.static关键字可以用来修饰代码块表示静态代码块,修饰成员变量表示全局 ...

  8. java中static关键字的作用_面试|static 关键字有什么作用

    今天主要学习下Java语言中的static关键字. static关键字的含义及使用场景 static是Java50个关键字之一.static关键字可以用来修饰代码块表示静态代码块,修饰成员变量表示全局 ...

  9. C++static关键字的作用

    C++ --static关键字的作用 1.全局静态变量 : 在全局变量前加上关键字static,全局变量就变成了一个全局静态变量. 静态存储区:在整个程序执行期间一直存在. 初始化:未经初始化的全局静 ...

最新文章

  1. “自拍神器”贴心实用功能大曝光
  2. Dictionary解析json,里面的数组放进list,并绑定到DataGridView指定列
  3. STL中用erase()方法遍历删除元素
  4. 计算MATLAB时间复杂度的例子,学编程数学到底有多重要?线性代数能否视为一门程序语言呢?...
  5. Java程序转成exe可执行程序方法和exe4_j下载地址和破解。
  6. 【Python 爬虫】 4、爬虫基本原理
  7. python如何拟合三维平面(拟合Intel Realsense D435深度数据点)
  8. 图胜千言:电商支付架构设计
  9. Qt5设置应用程序图标及程序的发布
  10. 首次安装Linux,配置网络、换源一步到位
  11. 键、索引、约束及其区别
  12. 一个DirectInput演示程序
  13. JAVA架构师之路-视频学习
  14. NAS网络配置、资源管理和用户访问权限
  15. DHCP server和DHCP relay配置
  16. 使用7段数码管实现0到99数码管显示(循环嵌套)
  17. EMBA必看书籍推荐
  18. 安卓10源码开发定制(29)手电筒控制源码分析
  19. FlashBuilder精选插件
  20. python 存储字典_python 字典存储

热门文章

  1. SqlServer 2008 R2定时备份数据库,并且发送邮件通知
  2. 【NPOI】.NET EXCEL导入导出开发包
  3. 案例分析:免费的维护服务
  4. linux系统怎样指定gpu运行,linux服务器如何指定gpu以及用量
  5. pdf 中的java运行,java - 从pdf文件读取特定位置的itext在intellij中运行,并提供所需的输出,但是可执行jar抛出错误 - 堆栈内存溢出...
  6. echarts指针进度条刻度调整_指针式流量开关
  7. 武汉自考本科计算机专业哪个好,2020年武汉自考本科专业有哪些?
  8. java sleep join_Java多線程之sleep,wait,join和yield關鍵字
  9. java发送串口命令_如何發送命令到串口(JAVA + RXTX)
  10. hashCode() 和equals() 区别和作用