`

static块到底什么时候执行

阅读更多
(转载)此日志的引用通告 URL 是:
http://x-spirit.spaces.live.com/blog/cns!CC0B04AE126337C0!817.trak

static块到底什么时候执行?(Class.forName())
"java深度历险"一书在讲解“类装载”的一章中,举了以下的例子:

引用

Java代码

public interface Assembly{ 
public void start();; 

public class Word implements Assembly{ 
static{ 
        System.out.println("Word static initialization!");; 
    }     
public void start();{ 
        System.out.prinlnt("Word starts");; 
    } 

public class Office{ 
public static void main(String args[]); throws Exception{ 
        Office off = new Office();; 
        System.out.println("类别准备载入");; 
        Class c = Class.forName(args[0],true,off.getClass();.getClassLoader(););; 
        System.out.println("类别准备实例化");; 
        Object o = c.newInstance();; 
        Object o2= c.newInstance();; 
   } 
}
执行java Office Word,运行结果如下:
“Loaded Office”
“类别准备载入”
“Loaded Accembly”
“Loaded Word””
“Word static initialization”
“类别准备实体化”。
但是如果将Office.java中Class.forName(args[0],true,off.getClass().getClassLoader())中的true变为false,再执行java Office Word结果显示为:
“Loaded Office”
“类别准备载入”
“Loaded Accembly”
“Loaded Word””
“类别准备实体化”
“Word static initialization”。

显然两次红字部分顺序相反,及static块执行的顺序不同。此书作者提出了原因,原文:

引用

“过去很多java书上提到静态初始化(static initializion block)时,都会说静态初始化区块只是在类第一次载入的时候才会被调用仅仅一次。可是上面输出却发现即使类被载入了,其静态初始化区块也没有被调用,而是在第一次调用newInstance方法时,静态初始化块才被真正调用,应该改成-静态初始化块只是在类被第一次实体化的时候才会被仅仅调用一次。”

其实,该书作者的上述描述有误。通过一个试验,就可以看出谬误所在。

Java代码

public class TestA{ 
static{ 
       System.out.println("Static block executed!");; 
    }     

public class Test{ 
public static void main(String args[]);{ 
       Test test = new Test();; 
       Class.forName("TestA",true,test.getClass();.getClassLoader(););; 
   } 
}
运行一下,相信大家一定可以看到,“Static block executed!”的输出。这与

引用

而是在第一次调用newInstance方法时,静态初始化块才被真正调用

的说法矛盾。
其实我想事实是这样的:
一个类的运行,JVM做会以下几件事情 1、类装载 2、链接 3、初始化 4、实例化;而初始化阶段做的事情是初始化静态变量和执行静态方法等的工作。所以,当Class.forName(args[0],true,off.getClass().getClassLoader());中的true变为false的时候,就是告诉JVM不需再load class之后进行initial的工作。这样,将initial的工作推迟到了newInstance的时候进行。所以,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自动执行,并且只执行一次。这意味着静态代码块常被用来初始化静态变量或执行类级别的操作。多...

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

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

    final和static用法详解JAVA

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

    java中static作用

    静态代码块也叫静态代码块,是在类中独立于类成员的 static 语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM 加载类时会执行这些静态的代码块。如果 static 代码块有多个,JVM 将按照它们在类中出现...

    关于static关键字的总结

    静态代码块,是主动执行的,在项目启动时就加载到内存了,一般用于初始化类中的静态成员;例如: public class StaticBlock1 { static { System.out.println("static block"); } public static void main...

    要static还是不要static?

    3. **静态初始化块(static initialization blocks)** 静态初始化块在类加载时执行一次,用于初始化静态变量。这通常用于设置复杂的初始值或执行一次性操作。 4. **内部类与静态内部类(inner classes and static...

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

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

    static的使用方法

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

    Java中的static关键字

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

    Java static静态初始快

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

    java中的static{}块的实例详解

    `static`块,也称为静态初始化块,是包含一组初始化代码的特殊块,这些代码在类加载时仅执行一次,且在创建任何类实例之前执行。`static`块常用来初始化类级别的变量。 在第一个程序中,我们看到一个简单的`static`...

    继承与static精选例题

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

    static 的使用场合

    3. **静态块(Static Initialization Blocks)** - 静态初始化块用于在类加载时初始化静态变量,可以有多个,按顺序执行。 - 通常用于执行一次的初始化操作,比如初始化静态变量或进行资源分配。 - 示例: ```...

    java视频 static关键字

    类级别的初始化代码可以放在`static`块中,确保在类加载时执行,且只执行一次。这常用于初始化`static`变量或执行一次性设置任务。 ```java public class MyClass { static int count; static { count = 100; ...

    java中static属性学习

    这些静态语句块分别在类加载时被执行,输出`"static father555"`和`"static son555"`。 此外,`Son`类的构造函数显式地调用了父类`Father`的构造函数。这在继承关系中非常重要,因为子类构造函数默认会调用父类无参...

    java中final和static的区别

    8. 静态代码块:静态代码块是在类中独立于类成员的 static 语句块,可以有多个,位置可以随意放,它不在任何的方法体内,JVM 加载类时会执行这些静态代码块,是该类中最先被执行的代码,如果有多个静态代码块,会...

    Java关键字final、static使用总结

    static 块是用来初始化静态变量的,JVM 会在类加载时执行 static 块。 final 和 static 关键字都是 Java 编程语言中的重要概念,了解它们的使用方法和限制对编写高效、可靠的 Java 程序非常重要。

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

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

    static在Java语言中的作用

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

Global site tag (gtag.js) - Google Analytics