java中static{}语句块详解

别再为Word转PDF表格变形发愁了!Aspose.Words for Java 19.5 保姆级避坑指南 本文详细介绍了使用Aspose.Words for Java 19.5解决Word转PDF时表格变形问题的完整方案。从格式转换原理到实战技巧,涵盖固定表格宽度、禁用自动调整、强制文本换行等核心方法,并提供高级场景应对策略和性能优化建议,帮助开发者高效处理复杂文档转换需求。 阅读详情

原文地址:http://blog.youkuaiyun.com/lubiaopan/article/details/4802430     感谢原作者!


static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法,下面我们详细的讨论一下该语句块的特性及应用。

 

一、在程序的一次执行过程中,static{}语句块中的内容只被执行一次,看下面的示例:

示例一

[java]  view plain copy
  1. class Test{  
  2.         public static int X=100;  
  3.     public final static int Y;=200  
  4.     public Test(){  
  5.         System.out.println("Test构造函数执行");  
  6.     }  
  7.     static{  
  8.         System.out.println("static语句块执行");  
  9.     }  
  10.     public static void display(){  
  11.         System.out.println("静态方法被执行");  
  12.     }  
  13.     public void display_1(){  
  14.         System.out.println("实例方法被执行");  
  15.     }  
  16. }  
  17. public class StaticBlockTest{  
  18.     public static void main(String args[]){  
  19.         try{  
  20.                 Class.forName("Test");     
  21.                     Class.forName("Test");   
  22.         }catch(ClassNotFoundException e){  
  23.             e.printStackTrace();  
  24.         }  
  25.             
  26.     }     
  27. }  
  

结果:你会发现虽然执行了两条Class.forName("Test")语句,但是,只输出了一条"静态方法被执行"语句;其实第二条Class.forName()语句已经无效了,因为在虚拟机的生命周期中一个类只被加载一次;又因为static{}是伴随类加载执行的,所以,不管你new多少次对象实例,static{}都只执行一次。 --关于类加载请看本文的附录。

 

二、static{}语句块执行的时机(其实就是附录中类加载的时机)

 

上面说到static{}会在类被加载的时候执行,我们必须准确理解类加载的准确含义,含义如下:

1、用Class.forName()显示加载的时候,如上面的示例一;

2、实例化一个类的时候,如将main()函数的内容改为:Test t=new Test();//这种形式其实和1相比,原理是相同的,都是显示的加载这个类,读者可以验证Test t=new Test();和Test t=(Test)Class.forName().newInstance();这两条语句效果相同。

3、调用类的静态方法的时候,如将main()函数的内容改为:Test.display();

4、调用类的静态变量的时候,如将main()函数的内容改为:System.out.println(Test.X);

 

总体来说就这四种情况,但是我们特别需要注意一下两点:

1、调用类的静态常量的时候,是不会加载类的,即不会执行static{}语句块,读者可以自己验证一下(将main()函数的内容改为System.out.println(Test.Y);),你会发现程序只输出了一个200;(这是java虚拟机的规定,当访问类的静态常量时,如果编译器可以计算出常量的值,则不会加载类,否则会加载类)

2、用Class.forName()形式的时候,我们也可以自己设定要不要加载类,如将Class.forName("Test")改为 Class.forName("Test",false,StaticBlockTest.class.getClassLoader()),你会发现程序什么都没有输出,即Test没有被加载,static{}没有被执行。

 

三、static{}语句块的执行次序

 

1、当一个类中有多个static{}的时候,按照static{}的定义顺序,从前往后执行;

2、先执行完static{}语句块的内容,才会执行调用语句;

示例二

public class TestStatic{
    static{
        System.out.println(1);
    }
    static {
        System.out.println(2);
    }
    static {
        System.out.println(3);
    }
    public static void main(String args[]){
        System.out.println(5);
    }
    static {
        System.out.println(4);
    }
}
结果:程序会输出1,2,3,4,5

3、如果静态变量在定义的时候就赋给了初值(如 static int X=100),那么赋值操作也是在类加载的时候完成的,并且当一个类中既有static{}又有static变量的时候,同样遵循“先定义先执行”的原则;

示例三

 class Test{
 public static int X=300;
 static{
  System.out.println(X);
  X=200;
  System.out.println(X);
 }
}

public class StaticBlockTest{
 public static void main(String args[]){
  System.out.println(Test.X);
 }
}

结果:程序会依次输出300,200,200,先执行完X=300,再执行static{}语句块。

 

四、static{}语句块应用

 

1、JDBC中的应用

熟悉JDBC的读者应该知道,java中有一个DriverManager类,用于管理各种数据库驱动程序、建立新的数据库连接。DriverManager类包含一些列Drivers类,这些Drivers类必须通过调用DriverManager的registerDriver()方法来对自己进行注册,那么注册是什么时候发生的呢?下面会给出答案:

所有Drivers类都必须包含有一个静态方法,利用这个静态方法可以创建该类的实例,然后在加载该实例时向DriverManage类进行注册。我们经常用Class.forName()对驱动程序进行加载,那么注册就发生在这条语句的执行过程中,前面说的Drivers的静态方法是放在static{}中的,当对驱动程序进行加载的时候,会执行该static{},便完成了注册。

 

2、hibernate中的应用

hibernate中的SessionFactory是一个重量级的类,创建该类的对象实例会耗费比较多的系统资源,如果每次需要时都创建一个该类的实例,显然会降低程序的执行效率,所以经常将对该类的实例化放在一个static{}中,只需第一次调用时执行,提高程序的执行效率,如下:

static {
     try {
   configuration.configure(configFile);
   sessionFactory = configuration.buildSessionFactory();
  } catch (Exception e) {
   System.err.println("%%%% Error Creating SessionFactory %%%%");
   e.printStackTrace();
  }
    }

 

五、附录

类加载:Java命令的作用是启动虚拟机,虚拟机通过输入流,从磁盘上将字节码文件(.class文件)中的内容读入虚拟机,并保存起来的过程就是类加载。

 

类加载特性 :
      *
在虚拟机的生命周期中一个类只被加载一次。
      *
类加载的原则:延迟加载,能少加载就少加载,因为虚拟机的空间是有限的。
      *
类加载的时机:
      1)第一次创建对象要加载类.
      2)调用静态方法时要加载类,访问静态属性时会加载类。
      3)加载子类时必定会先加载父类。
      4)创建对象引用不加载类.
      5) 子类调用父类的静态方法时
          (1)当子类没有覆盖父类的静态方法时,只加载父类,不加载子类
          (2)当子类有覆盖父类的静态方法时,既加载父类,又加载子类
      6)访问静态常量,如果编译器可以计算出常量的值,则不会加载类,例如:public static final int a =123;否则会加载类,例如:public static final int a = math.PI。


rk3568 修改开机动画 bootanimation.zip是一个Android设备启动时播放的动画文件,它包含了一系列的图片和描述文件,用于描述动画的播放顺序和持续时间。 阅读详情

相关推荐

基于STM32的智能台灯PWM调光与人体感应融合设计

本文详细介绍了基于STM32单片机的智能台灯设计方案,重点讲解了PWM调光技术与人体感应模块的融合实现。通过STM32的高级定时器产生精准PWM信号控制LED亮度,结合红外传感器实现人来灯亮、人走灯灭的智能体验,同时集成光敏传感实现环境自适应调光,打造高效节能的智能照明解决方案。

threejs5artist的博客 823

MC6470与PIC18LF46K42的硬件协同设计与优化

惯性测量单元(IMU)通过加速度计和磁力计实现运动感知,其核心在于传感器数据融合算法。在嵌入式系统中,6DOF IMU如MC6470与微控制器如PIC18LF46K42的协同设计面临I2C通信优化、资源受限算法实现等挑战。通过互补滤波和PID控制等轻量级算法,可在8位MCU上实现高精度姿态解算和运动控制。典型应用包括无人机稳定、机器人导航等场景,其中磁力计校准和DMA数据传输是关键实践点。

weixin_33911824的博客 547

基于zynq在linux下的AXI-CAN实战

从petalinux的搭建,到uboot、kernel、rootfs的调试、打包提示:以下是本篇文章正文内容,下面案例可供参考本次要讲述的zynq的AXI-CAN实战小知识就说到这里了,兄弟萌要有什么指导意见或疑问可以在评论区留下"足迹"。

qq_45521099的博客 3164

static{}语句块详解

声明:转载请注明出处static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法,下面我们详细的讨论一下该语句块的特性及应用。 一、在程序的一次执行过程中,static{}语句块中的内容只被执行一次,看下面的示例:示例一class Test{ public static int X=100; publi

lubiaopan的专栏 2万+

基于python+mediapipe的手势拖动识别(无gpu)

手势点方块拖动

weixin_38029956的博客 5982

【遥感数字图像处理(朱文泉)】第四章 变换域处理方法

变换域的处理方法

甜子yu的博客 4311

java中的static属性详细介绍

java中静态代码块 静态代码块的特点: 随着类的加载而执行,而且只执行一次 https://www.baidu.com/s?wd=java%E9%9D%99%E6%80%81%E4%BB%A3%E7%A0%81%E5%9D%97 https://recomm.cnblogs.com/blogpost/6907471 https://zhidao.baidu.com/question/393900964.html https://www.cnblogs.com/twlqx/p/4430135.html ht

忆往昔的博客 8211

ptrade从零开始学习量化交易第166期【ptrade量化策略研究参考--三个因子挖掘思路】

三个因子挖掘思路

GJ57017_wx的博客 1246

static{}是什么意思

static{}中的代码表示是在类装载的时候执行一次,且仅执行一次【静态初始化块的作用就是:提升程序性能。】 static关键字:方便在没有创建对象的情况下进行调用(方法/变量)。 在类中,用static声明的成员变量为静态成员变量,也成为类变量。类变量的生命周期和类相同,在整个应用程序执行期间都有效。 static修饰的成员变量和方法,从属于类 普通变量和方法从属于对象 静态方法不能调用非静态成员,编译会报错 被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通

qq_34266854的博客 2138

Unreal5从入门到精通之初学者碰到解决不了的问题怎么办?

在学习Unreal的过程中,你曾陷入困境了吗?对于我来说,这种情况发生得比我愿意承认的要多得多。幸运的是,除了一般地在网上搜索之外,还有很多地方可以获得虚幻引擎的帮助。

TxNet 979

2、Elixir与Erlang:构建高可用系统的利器

本文介绍了Elixir与Erlang在构建高可用系统方面的优势,深入探讨了Erlang的并发机制、容错能力以及分布式特性,并结合实际应用场景展示了其在服务器端开发中的强大能力。此外,还提供了学习资源和交流平台,帮助开发者快速上手并深入实践。

grape的博客 125

Java类中static{}解释

Java类中static{}语句解释

枫飘长安的博客 1520

31、车载通信中的可见光通信(VLC)技术解析

本文详细解析了车载通信中可见光通信(VLC)技术的应用背景、优势及发展前景。对比传统RF通信技术(如DSRC),VLC利用LED照明设备实现高效、安全的车辆与车辆、车辆与基础设施之间的通信,具有频谱资源丰富、安全性高、无电磁干扰等优势。文章还探讨了VLC在交叉口交通控制、高速公路通信、自动驾驶等场景的应用潜力,展望了其在未来智能交通系统中的重要作用。

hill8的博客 318

Java static语句块详解

static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法。

weixin_49337350的博客 359

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

java如何定义语句块_Java static{}语句块详解

[转自] http://blog.youkuaiyun.com/lubiaopan/article/details/4802430static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法,下面我们详细的讨论一下该语句块的特性及应用。一、在程序的一次执行过程中,static{}语句块中的内容只被执行一次,看下面的示例:示例一class Test{publ...

weixin_36080474的博客 207

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

static块 java_java中static{}语句块详解

static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法,下面我们详细的讨论一下该语句块的特性及应用。一、在程序的一次执行过程中,static{}语句块中的内容只被执行一次,看下面的示例:示例一classTest{publicstaticintX=100;publicfinalstaticintY;=200publicTe...

weixin_39712865的博客 337

转 java中static{}语句块详解

原文地址:http://blog.youkuaiyun.com/lubiaopan/article/details/4802430 感谢原作者! static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法,下面我们详细的讨论一下该语句块的特性及应用。 一、在程序的一次执行过程中,static{}语句块中的内容只被执行一次,看...

weixin_30535843的博客 353

java中static x 5_java中static{}语句块详解

1、当一个类中有多个static{}的时候,按照static{}的定义顺序,从前往后执行;2、先执行完static{}语句块的内容,才会执行调用语句;示例二public class TestStatic{static{System.out.println(1);}static {System.out.println(2);}static {System.out.println(3);}public...

weixin_29611239的博客 274

Java static{}语句块详解

static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法,下面我们详细的讨论一下该语句块的特性及应用。 一、在程序的一次执行过程中,static{}语句块中的内容只被执行一次,看下面的示例:示例一[java] view plain copy print?class Test{          public static int X=100;

CurryXu的博客 434

JAVA中STATIC{}语句块详解

JAVA中STATIC{}语句块详解 static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法,下面我们详细的讨论一下该语句块的特性及应用。 类加载:Java命令的作用是启动虚拟机,虚拟机通过输入流,从磁盘上将字节码文件(.class文件)中的内容读入虚拟机,并保存起来的过程就是类加载。 类加载特性:...

weixin_30411997的博客 75
上一篇: Java虚拟机深入学习之四: Java虚拟机的性能监控和故障处理工具
下一篇: 一些有用的device信息,可能有些是私有API
NewJerryj
博客等级 码龄19年 196粉丝 115原创
评论 15
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值