论坛首页 Java企业应用论坛

static块到底什么时候执行?

浏览 52384 次
该帖已经被评为精华帖
作者 正文
   发表时间:2005-03-17  
sunr 写道
直接调用类的一个静态方法,看看其他的静态方法是否会执行,从这里就可以看出静态方法的执行和类的实例化无关,而是和类的初始化操作有关。


呵呵,好像谁也没有提过静态方法吧,而且和静态方法也不扯边。
直接调用一个静态方法,其他方法当然不会执行了。从这里怎么看出来什么无关了。
注意:咱们讲的是静态变量的初始化和静态块的执行。
0 请登录后投票
   发表时间:2005-03-17  
大家不是在讨论静态块是不是在类实例化的时候执行的么?那么直接调用一个类的静态方法(没有对类进行实例化吧?)看看那个static块里面的程序是否执行不就行了么。如果执行了,证明就不需要类实例化就能执行static块。
0 请登录后投票
   发表时间:2006-01-07  
  在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作如下:

  装载:查找和导入类或接口的二进制数据;
  链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;
  校验:检查导入类或接口的二进制数据的正确性;
  准备:给类的静态变量分配并初始化存储空间;
  解析:将符号引用转成直接引用;
  初始化:激活类的静态变量的初始化Java代码和静态Java代码块。
1 请登录后投票
   发表时间:2006-01-08  
to sunr:
  你的意思是,把代码写成:   Study.method();
其实可把这个动作分为两步:
  Study st;   ---其实就是在这个时候,隐含的初始化了类,相当于在这个时候做了个ClassLoader的动作
  st.method();
0 请登录后投票
   发表时间: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
0 请登录后投票
   发表时间: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初始化后被调用。
0 请登录后投票
   发表时间:2006-01-19  
Inside JVM
0 请登录后投票
   发表时间:2006-02-07  
是啊,曾经也被误倒过,呵呵。
0 请登录后投票
   发表时间:2006-03-29  
这个问题在 thinking in java 里面有提到,

其实学基础的话我认为只看 tij 也够用了.
0 请登录后投票
   发表时间:2006-03-29  
虚拟机创建一个对象的时候其实是走了2个初始化的过程。

1,是class的初始化。
2,是object的初始化。

  在步骤1的时候,虚拟机调用的是class的cinit函数(这个方法只允许虚拟机调用。)这个方法里面就是当前class中的所有static块,包括static变量的初始化。

  当cinit执行完以后,才是object的init方法,这个时候调用的就是类的构造函数来初始化一个类。

  另外,当调用一个类的static变量或方法的时候,都会触发虚拟机调用这个类的cinit函数。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics