public class TextStatic{
  static Y1 y1 = new Y1();
   //Y1 y2 = new Y1();
  public static void main(String[] args){
    }
  }
  class Y1{
  Y1(){
  System.out.println("a");
  }
  }如果注释了那句加上static,运行就会输出2个 a;不加只有个a。
就是这里不加static,这句运行吗?解释下!

解决方案 »

  1.   

    你有两个成员变量,
    一个是静态的,在类加载(即在构造方法调用之前初始化)的时候运行了一次打印出一个a
    另一个是在你new对象的时候打印的a
      

  2.   

    static 在每次类装载的时候都会执行,你两个static就会new两次Y1,所以就输出两次.
      

  3.   

    加了static的话,TextStatic这个类被加载的时候就会执行static Y1 y1 = new Y1(); 所以会打印一个a  没加static的方法只有这个类被new出来的时候才回执行其构造方法 例如在main方法中写Y1 y2 = new Y1(); 才会执行 .
    不知道这样解释你明白不 总之就是有static的方法当类被加载的时候就会执行,楼主说的不加static 的那句是不运行的
      

  4.   

    两个都不加static什么也不输出,因为你的y1是static的所以在TextStatic被加载的时候先初始化static的变量,而且只初始化一次,如果你把注释去掉,在main中加入 System.out.println(“aaaa”);new TestStatic();你试着判断一下会输出什么结果,结合结果思考一下你就能得到答案了!!
      

  5.   

    给你个程序的例子吧class B {
    private static A a = new A(); private A a = new A();
    }class A {
    public A() {
    System.out.println("a");
    }
    }public class Test {
    public static void main(String[] args) {
    B b1 = new B(); //第一次装载类B,static执行.所以输出两次a
    B b2 = new B(); //不是第一次装载类B,static不执行,所以输出一次a
    //总共是输出三次a,这样你应该可以看到过程了吧,一个类第一次被调用的时候,static被加载到内存中的代码区,以后的调用过程中,该类的static不再执行
    }
    }
      

  6.   

    首先区分static field 和non-static field ,对于静态的是加载的时候初始化一次,而且确保只一次。
    非static的,当你创建一个新的对象的时候会进行初始化,这种直接的定义初始化会在构造方法里面的语句之前来执行。
      

  7.   

     5楼的在main方法加new TextStatic();  输出两个a ,
       我理解是,Y1 y2 = new Y1(); 在栈中创建y2,在堆创建new TextStatic();
    当只有在main方法调用new TextStatic();才执行构造方法。
      不知道是不是理解正确?
      

  8.   

    嗨,本人认为,不论你加与不加struts呀,你都会出现这个a的输出的,你加载当前类时,如果调用了成员对象时,也即是说有成员对象生成时,都会引出它构造函数的调用的!可明白呀!