static块的作用及何时被执行

一般情况下,如果有些代码必须在项目启动的时候就要被执行,这种情况上就需要使用静态代码块,这种代码是主动执行的,写个例子看看static块什么时候被执行

静态代码块就是在类加载的时候运行,并且只加载一次,通常用在某些事情在类加载时运行,只需用一次的地方,比如jdbc链接数据库,还有一些工具类导入某些配置文件等等。
现在链接数据库都已被框架封装好,我用静态代码块更多的地方就是导入配置文件,或者给这个类的一个final属性赋值。

1.StaticTest

Java代码 收藏代码
  1. packagecom.test.statictest;
  2. publicclassStaticTest{
  3. /**构造方法*/
  4. publicStaticTest(){
  5. System.out.println("构造函数被执行了!");
  6. }
  7. /**静态代码快*/
  8. static{
  9. System.out.println("静态代码块被执行了!");
  10. //show();
  11. }
  12. /**静态方法*/
  13. publicstaticvoidshow(){
  14. System.out.println("静态方法被执行了!");
  15. }
  16. }

2.Main

Java代码 收藏代码
  1. packagecom.test.statictest;
  2. publicclassMain{
  3. publicstaticvoidmain(String[]args)throwsClassNotFoundException{
  4. Mainmain=newMain();
  5. //加载类
  6. Class.forName("com.test.statictest.StaticTest");
  7. Class.forName("com.test.statictest.StaticTest");
  8. }
  9. }

结果输出

静态代码块被执行了!

在测试类里我加载了2次StaticTest类,按理说"静态代码块被执行了!"这句话应执行二次,但只输出了一次。

再看看别的

Java代码 收藏代码
  1. packagecom.test.statictest;
  2. publicclassMain{
  3. publicstaticvoidmain(String[]args)throwsClassNotFoundException{
  4. Mainmain=newMain();
  5. //加载类
  6. Class.forName("com.test.statictest.StaticTest",true,Main.class.getClassLoader());
  7. //Class.forName("com.test.statictest.StaticTest");
  8. }
  9. }

结果:

静态代码块被执行了!

这两个语句是等价的,执行的结果相同。

Class.forName("com.test.statictest.StaticTest",true,Main.class.getClassLoader())中的true改为false,代表加载类的时候不初始化静态代码块的内容,只能在这个类被实例化的时候才能初始化

Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码块.

我们只是想加载这个驱动到JVM,并不需要实例化这个驱动,因此调用Class.forName(xxx.xxx.xx) 足够,如果你调用Class.forName(xxx.xxx.xxx).newInstance(),结果和调用Class.forName(xxx.xxx.xxx)是一样的,因为Class.forName(xxx.xxx.xxx).newInstance() 会首先加载驱动并创建实例,但是这个实例通常你决不会用到,所有你不需要创建它。


在一个类中有一段这样的代码
class ...
{
       static
       {
       .......
       ........
       ........
       }
}
也就是静态代码块,静态代码块在什么时候执行,哪位高手给我详细一点解释一下
在这个类第一次被调用或实例化的时候就会被执行。 
静态代码块只会执行一次,一般会用来初始化一些值,并且在所有对象中全局共享。

编译时执行,对象创建前就已执行 

凡是声明为static的语句(变量,方法,代码块),是在加载类的时候就执行的 

在类加载时执行,我的理解就是出现这个类的类名的时候就执行; 就是类被点名就执行。

java 静态代码块 静态方法

 

他们两者的区别是什么?有什么作用?

一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,这种代码是被动执行的.

两者的区别就是:静态代码块是自动执行的;
静态方法是被调用的时候才执行的.

作用:静态代码块可用来初始化一些项目最常用的变量或对象;静态方法可用作不创建对象也可能需要执行的代码.




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值