锁定老帖子 主题:static块到底什么时候执行?
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2005-03-17
sunr 写道 直接调用类的一个静态方法,看看其他的静态方法是否会执行,从这里就可以看出静态方法的执行和类的实例化无关,而是和类的初始化操作有关。
呵呵,好像谁也没有提过静态方法吧,而且和静态方法也不扯边。 ![]() 直接调用一个静态方法,其他方法当然不会执行了。从这里怎么看出来什么无关了。 注意:咱们讲的是静态变量的初始化和静态块的执行。 |
|
返回顶楼 | |
发表时间:2005-03-17
大家不是在讨论静态块是不是在类实例化的时候执行的么?那么直接调用一个类的静态方法(没有对类进行实例化吧?)看看那个static块里面的程序是否执行不就行了么。如果执行了,证明就不需要类实例化就能执行static块。
|
|
返回顶楼 | |
发表时间:2006-01-07
在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作如下:
装载:查找和导入类或接口的二进制数据; 链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的; 校验:检查导入类或接口的二进制数据的正确性; 准备:给类的静态变量分配并初始化存储空间; 解析:将符号引用转成直接引用; 初始化:激活类的静态变量的初始化Java代码和静态Java代码块。 |
|
返回顶楼 | |
发表时间:2006-01-08
to sunr:
你的意思是,把代码写成: Study.method(); 其实可把这个动作分为两步: Study st; ---其实就是在这个时候,隐含的初始化了类,相当于在这个时候做了个ClassLoader的动作 st.method(); |
|
返回顶楼 | |
发表时间:2006-01-09
lixigua 写道 to sunr:
你的意思是,把代码写成: Study.method(); 其实可把这个动作分为两步: Study st; ---其实就是在这个时候,隐含的初始化了类,相当于在这个时候做了个ClassLoader的动作 st.method(); class StaticTest{ public StaticTest();{ System.out.println("I be initialization");; } static{ System.out.println("static initialization!");; } public static void say();{ System.out.println("Say me......");; } } class MainTest{ public static void main(String[] args);{ StaticTest.say();; } } 结果:static initialization! Say me...... 并没有执行StaticTest的构造函数,也就没有初始化StaticTest |
|
返回顶楼 | |
发表时间:2006-01-19
我这样理解static method ,static block,static member的。
它们不依附于任何object,其所在类可以认为是地址空间命名。举个例子来说: /** * * @author Nirvana * * Description:test static class */ public class StaticClass { public static String color = "red"; public StaticClass() { color = "green"; } static { color = "yellow"; } public static void test() { System.out.println(color); } public static void main(String[] args) throws ClassNotFoundException { StaticClass.test(); //--------(1) (new StaticClass()).test(); //--------(2) } } 输出: yellow green 静态的已经存在,类名StaticClass只是命名空间,执行(1)时并未产生任何对象,当然不调用构造函数 color="yellow",只有显式创建object,构造函数才被调用,如(2). 所以构造函数一定是在static member,static block初始化后被调用。 |
|
返回顶楼 | |
发表时间:2006-01-19
Inside JVM
|
|
返回顶楼 | |
发表时间:2006-02-07
是啊,曾经也被误倒过,呵呵。
|
|
返回顶楼 | |
发表时间:2006-03-29
这个问题在 thinking in java 里面有提到,
其实学基础的话我认为只看 tij 也够用了. |
|
返回顶楼 | |
发表时间:2006-03-29
虚拟机创建一个对象的时候其实是走了2个初始化的过程。
1,是class的初始化。 2,是object的初始化。 在步骤1的时候,虚拟机调用的是class的cinit函数(这个方法只允许虚拟机调用。)这个方法里面就是当前class中的所有static块,包括static变量的初始化。 当cinit执行完以后,才是object的init方法,这个时候调用的就是类的构造函数来初始化一个类。 另外,当调用一个类的static变量或方法的时候,都会触发虚拟机调用这个类的cinit函数。 |
|
返回顶楼 | |