日期:2014-05-20  浏览次数:20795 次

java的一个问题
class Mug {
  Mug(int marker) {
  System.out.println("Mug(" + marker + ")");
  }
  void f(int marker) {
  System.out.println("f(" + marker + ")");
  }
}

public class Mugs {
  Mug c1;
  Mug c2;
  {
  c1 = new Mug(1);
  c2 = new Mug(2);
  System.out.println("c1 & c2 initialized");
  }
  Mugs() {
  System.out.println("Mugs()");
  }
  public static void main(String[] args) {
  System.out.println("Inside main()");
  Mugs x = new Mugs();
  }

为什么输出顺序为
Inside main()
Mug(1)
Mug(2)
c1&c@ initialized
Mugs()
我自己想的与运行的不一样啊!


------解决方案--------------------
程序先从main()函数开始执行,所以要加载Mugs.class,静态初始化在此进行,故先输出Inside main()。
然后是初始化基本类型和引用。
{ c1 = new Mug(1);
c2 = new Mug(2); 
System.out.println("c1 & c2 initialized"); 
 } 
是一个静态初始化块。
最后执行构造器。
thinking in java 第四章有介绍,可以参考一下。
------解决方案--------------------
顺序是从main()进去,输出Inside main(),如果有静态块必须先执行,没有执行方法外的程序块,执行Mug c1; Mug c2; ->再执行c1 = new Mug(1); 构造输出Mug(1) ,->c2 = new Mug(2);构造输出Mug(2) ,再执行 System.out.println("c1 & c2 initialized"); 最后自己的
构造函数.因为上面的类除了方法就是构造函数,没有其他的东西.



------解决方案--------------------
程序从main函数开始执行,
System.out.println("Inside main()"); --> Inside main() //1

Mugs x = new Mugs(); //这一句有的麻烦.

1、类只有在使用New调用创建的时候才会被JAVA类装载器装入,不要认为在这句之前内存中已经有了Mugs类了.
2、JAVA类首次装入时,会对静态成员变量或方法进行一次初始化,但方法不被调用是不会执行的.
静态成员变量和静态初始化块级别相同,非静态成员变量和非静态初始化块级别相同。
先初始化父类的静态代码--->初始化子类的静态代码-->初始化父类的非静态代码--->初始化父类构造函数--->初始化子类非静态代码--->初始化子类构造函数


有了这个初始化顺序,应该就能推出这样的结果了.你可以添加一个静态的代码块看看效果.在代码块前加static关键字就是静态代码块.
------解决方案--------------------
to zcyjava
Java code

程序先从main()函数开始执行,所以要加载Mugs.class,静态初始化在此进行,故先输出Inside   main()。 
然后是初始化基本类型和引用。 
{   c1       =       new       Mug(1); 
    c2       =       new       Mug(2);   
    System.out.println("c1       &       c2       initialized");   
  }   
是一个静态初始化块。 
最后执行构造器。 
thinking   in   java   第四章有介绍,可以参考一下。

------解决方案--------------------
这里有点不懂,难道用大括号括来就是静态代码块吗?
------解决方案--------------------
不好意思,之前我的回答有点问题.

1、类只有在使用New调用创建的时候才会被JAVA类装载器装入,不要认为在这句之前内存中已经有了Mugs类了.

启动类(含main方法的类),在命令行中执行命令 :java Mugs 时就加载了.这句话只针对非启动类而言.
------解决方案--------------------
大家研究一下类的初始化顺序,修改后的代码.
Java code

class   Mug   { 
    Mug(int   marker)   { 
        System.out.println("Mug("   +   marker   +   ")"); 
    } 
    void   f(int   marker)   { 
        System.out.println("f("   +   marker   +   ")"); 
    } 
} 

class   Mugs   { 
    public   static   void   main(String[]   args)   { 
        System.out.println("Inside   main()"); 
        Mugs   x   =   new   Mugs(); 
    } 
    Mugs()   { 
        System.out.println("Mugs()"); 
    } 
    { 
        c1 = new Mug(3);
        c2 = new Mug(4);
        c3 = new Mug(5);
        System.out.println("c1   &   c2   initialized");
    }    
    Mug c1 = new Mug(1);
    Mug c2 = new Mug(2);
    Mug c3 = new Mug(6);
    static{System.out.println("Outside main()");}
    static Mug c0=new Mug(0);
}