`
sunnylocus
  • 浏览: 875826 次
  • 性别: Icon_minigender_1
  • 来自: 美国图森
社区版块
存档分类
最新评论

static块的作用及何时被执行

    博客分类:
  • Java
阅读更多

       在逛论坛的看到很多的朋友在讨论staic块,进去瞧瞧,感觉有点雾里看花。我也不知道static块到底有什么用,何时用。学习下吧,好象JDBC就用到这些东西。

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

1.StaticTest

package com.test.statictest;

public class StaticTest {
	/** 构造方法*/
	public StaticTest() {
		System.out.println("构造函数被执行了!");
	}
	/** 静态代码快*/
	static {
		System.out.println("静态代码块被执行了!");
		//show();
	}
	/** 静态方法*/
	public static void show(){
		System.out.println("静态方法被执行了!");
	}
}

 

2.Main

package com.test.statictest;

public class Main {
	public static void main(String[] args) throws ClassNotFoundException {
		Main main = new Main();
		//加载类
		Class.forName("com.test.statictest.StaticTest");
		Class.forName("com.test.statictest.StaticTest");
		
	}
}

 结果输出

    静态代码块被执行了!

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

 

再看看别的

   

package com.test.statictest;

public class Main {
	public static void main(String[] args) throws ClassNotFoundException {
		Main main = new Main();
		//加载类
		Class.forName("com.test.statictest.StaticTest",true,Main.class.getClassLoader());
		//Class.forName("com.test.statictest.StaticTest");		
	}
}

 结果:

    静态代码块被执行了!

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

 

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

 

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

看看JDBC是怎么对Class.forName解释的:

      we just want to load the driver to jvm only, but not need to user the instance of driver, so call Class.forName(xxx.xx.xx) is enough, if you call Class.forName(xxx.xx.xx).newInstance(), the result will same as calling Class.forName(xxx.xx.xx), because Class.forName(xxx.xx.xx).newInstance() will load driver first, and then create instance, but the instacne you will never use in usual, so you need not to create it.

翻译:

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

 

 

 

3
2
分享到:
评论
2 楼 grandboy 2008-08-31  
    
public static Class<?> forName(String className) throws ClassNotFoundException {
        return forName0(className, true, lassLoader.getCallerClassLoader());
}

这是java源码。
1 楼 sunnylocus 2008-08-28  
一个类的运行,JVM做会以下几件事情 1、类装载 2、链接 3、初始化 4、实例化。初始化阶段做的工作就是是初始化静态变量,静态代码快和执行静态方法的工作。所以,当Class.forName(类名,true,类对象.getClass().getClassLoader())中的true为false的时候,就是告诉JVM不需再load class之后进行初始化的工作。这样,将初始化的工作放到newInstance的时候进行。所以,static块被执行的时机是在类被初始化的时候,无论这个类你加载多少次,static块仅仅只是被调用一次。

相关推荐

    Java中的Static块与静态方法

    System.out.println("静态块执行"); staticVar = 10; } // 静态方法 public static void staticMethod() { System.out.println("静态方法调用"); } public static void main(String[] args) { // 在main...

    java中static作用

    如果 static 代码块有多个,JVM 将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。 静态变量和实例变量的区别 静态变量和实例变量是两种不同的变量类型。静态变量在内存中只有一个拷贝,...

    java中的static变量,方法,代码块

    `static`代码块,或称静态代码块,是在类初始化过程中执行的一段代码。不同于普通的代码块,静态代码块在类加载时由JVM自动执行,并且只执行一次。这意味着静态代码块常被用来初始化静态变量或执行类级别的操作。多...

    static在Java语言中的作用

    `static`关键字在Java语言中具有重要作用,主要用于定义静态成员变量、静态方法、静态代码块以及静态内部类等。使用`static`关键字可以使某些属性和方法独立于类的实例存在,从而达到节省资源、提高效率的目的。下面...

    static 在java中的作用

    ### static在Java中的作用 `static`是Java语言中的一个关键字,主要用来修饰类成员(变量、方法或代码块),其核心功能在于定义类级别的共享属性。通过使用`static`,可以实现对类属性和方法的共享访问,而无需创建...

    TIA博途中FB和FC块里的IN,Inout,Out的区别以及Static和Temp变量的用法.docx

    在调用FB或FC时,你可以设定Inout变量的初始值,然后在块内部,这个值可能被修改,并在块执行结束后返回给调用者。这种变量类型常用于需要在调用前后更新或处理的值。 3. Out参数:Out参数是单向输出变量,只能由...

    构造函数与静态块的执行顺序

    在探讨继承中子类与父类构造函数及静态块的执行顺序时,我们首先需要理解构造函数和静态块的基本概念及其在Java中的作用。构造函数主要用于初始化对象的状态,而静态块则是在类加载到内存中时执行的一段代码,通常...

    C/C++中static作用

    - **作用域**:尽管存储于全局数据区,静态局部变量的作用域仍限于其所在函数或代码块,超出范围则无法访问。 ##### 3、静态函数 静态函数是在其声明前添加`static`关键字的函数,这类函数只在其所在文件内可见,...

    要static还是不要static?

    本文将深入探讨 "static" 关键字的含义、用途以及何时选择使用或不使用它。我们将通过分析《要 static 还是不要 static?》这篇博客中的观点,结合具体的代码示例 `InnerInterfaceNotStaticTest.java` 来阐述这个...

    关于static关键字的总结

    static 关键字有两种情况下会被用到: 1. 只想为某特定数据分配一块内存空间,不需考虑创建多少对象,设置无需创建对象。 2. 不希望这个方法,与包含它的类的任何一个实例关联在一起,也就是说,不创建对象,一样...

    java static块和构造函数的实例详解

    Java static 块和构造函数是 Java 编程语言中两个非常重要的概念,它们在 Java 程序的执行过程中扮演着重要的角色。今天,我们将深入探讨 Java static 块和构造函数的实例详解,帮助大家更好地理解和掌握 Java 编程...

    final和static用法详解JAVA

    static 块是 Java 中的一种特殊的块,它用于在类加载时执行一些初始化操作。static 块只能访问 static 变量和其他 static 方法。 final 和 static 关键字是 Java 中两个重要的访问修饰符,它们可以帮助开发者更好地...

    Java static静态初始快

    当我们讨论“Java static静态初始化块”时,我们关注的是如何在类加载时执行特定的初始化代码。 首先,让我们理解`static`关键字的基本概念。`static`在Java中用于声明类变量或静态方法,这些变量和方法不需要创建...

    Java中的static关键字

    静态代码块的定义:不包含在任何方法体中,当类被加载时,自动执行静态代码块,而且只被执行一次,它的作用是:经常用于实现类属性的初始化。 在 Java 中,类装载器把一个类装入 Java 虚拟机中,要经过三个步骤来...

    java中static作用详解

    在Java编程语言中,`static`关键字扮演着至关重要的角色,它允许我们定义静态成员变量、静态方法和静态初始化块。这些静态元素具有以下几个关键特点: 1. **静态变量(Static Variables)**: - 静态变量是属于类...

    static的使用方法

    本篇文章将深入探讨`static`的使用方法、原理及其在代码块中的应用。 首先,我们要理解`static`修饰符的基本含义。`static`关键字用于声明类变量(也称为静态变量)和类方法(静态方法)。这些成员是与类本身相关联...

    继承与static精选例题

    这是因为`static`代码块会在类加载时执行,而类加载是先于任何对象创建的。 2. **创建Z实例**:之后执行`main()`方法,在`main()`方法中创建了一个`Z`类的实例。因为`Z`类继承自`X`类,所以在创建`Z`实例时会先...

    Java静态代码块作用及执行顺序解析

    Java静态代码块作用及执行顺序解析 Java静态代码块是Java语言中的一种特殊代码块,它们在类加载的时候执行,且只执行一次。它们通常用来初始化静态变量、设置静态变量的初始值等。静态代码块的作用域是整个类,而...

    Java静态初始化块和对象初始化块

    静态初始化块是以`static`关键字标识的代码块,它在类被加载到Java虚拟机(JVM)时执行,且只执行一次。静态初始化块常用于设置类级别的变量,或者执行只应执行一次的初始化操作。例如,如果一个类需要在程序运行前...

    C语言中static的作用.pdf

    1. 静态变量的存储期:当static关键字用于局部变量时,它使得变量具有静态存储期,意味着该变量的生命周期贯穿整个程序运行期间,而不是仅在声明它的函数或代码块执行时存在。静态局部变量会保留上一次函数调用时的...

Global site tag (gtag.js) - Google Analytics