public class HelloWorld { public static void main(String[] args) {
// TODO Auto-generated method stub
        Hello a=new Hello();
        Hello b=new Hello();
}}class Hello 
{
    static
    {
     System.out.println("Hello ,World");
    }
}
我也很困惑为什么
 还请大家解释下 
 谢谢

解决方案 »

  1.   

    答:一条。
    当执行: Hello a=new Hello();时,将Hello类装入内存时,执行类的初始化,从而:执行
    static
        {
            System.out.println("Hello ,World");
        }  当执行第二条的:Hello b=new Hello();时,由于Hello类已在内存,就不用再装入了,从而:不再执行
    那个static{...}
      

  2.   

    2条。
    第一条是Hello a=new Hello();执行输出语句;
    第二条是Hello b=new Hello();执行输出语句。
      

  3.   

    楼上说得对。
    而且用Class.forName()加载类也会触发类初始化。所以下面代码会也会打印。public class HelloWorld{
      public static void main(String[] args) throws ClassNotFoundException{
        Class.forName("Hello");
      }
    }class Hello{
      static {
        System.out.println("Hello ,World");
      }
    }
      

  4.   

    被插楼了~~~~ 
    再多说两句。类的加载和类的初始化不是同一件事。这里其实是类初始化的问题。
    用new去新建一个类对象的时候有两种情况。
    1. 如果类没有被加载,这时候类会被加载并初始化。
    2. 如果类已经加载,但是没有初始化,就会进行初始化。
    3. 类已经加载并初始化。那就会不在加载,当然也不在执行初始化。而初始化工作里面其中一项就是执行静态语句块里面的代码。这样明白啦吗?
      

  5.   

    就1条呗!
    Class.forName()加载类也会触发类初始化,访问运行时常量也会触发类初始化。
      

  6.   

    静态块。只输出一次。static关键字所描述的代码均在编译时就已经决定了内存位置,在第一次加载类时(注意:第一次加载类并不一定意味着你在实例化这个类)被加载到固定的内存地址,静态块就在第一次加载时被运行,之后不再被运行,而静态方法与静态变量(常量)均可以使用类名直接调用。由于static所描述的代码在编译时就已经决定了内存地址,所以它们常常表现为类公有状态。更多信息,请参考网络相关资料,谢谢。
      

  7.   

    lz错啦,我说过啦,初始化和加载不是一起进行的。例如下面的代码。
    public class HelloWorld{
      Hello hello;
      public static void main(String[] args) throws ClassNotFoundException{
        // 类Hello已经被加载啦,但是没有初始化,所以静态语句并没有运行。
        System.out.println(Hello.HELLO_WORLD);
        // 接触下面这行的注释后,静态语句块就会被执行
        //Hello a = new Hello();
      }
    }class Hello{
      public static final String HELLO_WORLD = "Hello ,World";  static {
        System.out.println(HELLO_WORLD);
      }
    }
      

  8.   


      既然是初始化时执行static代码块, Hello a=new Hello();
     Hello b=new Hello(); 那为什么对b初始化时不执行static代码块呢?
      

  9.   

    类字节码被加载的2个方法 new className() 和 Class.forName(className)
    当加载类字节码时,会立即执行static代码块里的代码,
    当第二次用到className时,因为字节码已经加载,所以直接实例化就行了
    所以只会打印1次
      

  10.   

    估计lz是混淆了类初始化和对象的初始化。
    类加载和类初始化都是只会做一次。对象初始化可以有多次。
    你那两个new语句,实际上是初始化了两个对象。
      

  11.   

    答:
    // 类Hello已经被加载啦,但是没有初始化,所以静态语句并没有运行。
        System.out.println(Hello.HELLO_WORLD);
    错了!
    执行System.out.println(Hello.HELLO_WORLD);这条语句,并没有将类Hello加载
    这是因为:编译器已经将System.out.println(Hello.HELLO_WORLD);优化成了
    System.out.println("Hello ,World");了。
    什么情况下类会装载而不会进行类的初始化?如下就是一例:
    Class  hello_c=Hello.class;
    它会装入类Hello而不会对类Hello进行类的初始化。
    不过这个与楼主的问题有什么关系呢?楼主用的是new Hello();作用就是:当它发现类Hello没有装载或已装载而没有初始化,new总是要对类Hello进行装载并初始化的[类的初始化,永远只做一次]。
      

  12.   

    16楼的说的对,受教啦。的确是这样的。 其实那个成员变量已经说明类被加载啦,要不不可能声明一个类型为Hello的成员变量。
      

  13.   

    static构造只会执行一次啊
    书上有说的..