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

为什么有的时候像下面的会执行。什么时候不会执行? 请教? 谢谢,急! 谢谢 !急
class   C
{
C()
{
System.out.print( "C ");
}
}

class   A  
{
              C   c   =   new   C();//这里print   a   string   "C "           why????
A()  
{
this( "A ");  
System.out.print( "A ");  
}

                A(String   s)  
{
  System.out.print(s);  
}
}

class   sadf   extends   A  
{

                sadf()  
{  
super( "B ");  
System.out.print( "B ");  
}

                public   static   void   main(String[]   args)  
{
                                new   sadf();
                }

}
打印结果是CBB,   为什么会打印C;
class   A  
{
              C   c   =   new   C();//这里print   a   string   "C "           why????


而下面的一个却不打印

class   C
{
C()
{
System.out.print( "C ");
}
}

public   class   NewClass   {
      C   dd   =   new   C();   //不打印出     C   来;
              //但是将这句改为   static     C   dd   =   new   C();     会打印出   C   来。
                                              //为什么呀?
  public   static   void   main(String   args[]){     }
}

  我知道static是一个类成员,可以在   构造器运行之前运行,  
 
        我就是不知道什么时候像上面的会执行。什么时候不会执行?     可以帮我举一些例子说明一下吗?

              谢谢!!!!!!!!!!!




------解决方案--------------------
第二个没有输出是因为没有new出对象,当然就没有输出了
------解决方案--------------------
构造顺序->
请求类的时候,static的成员初始化执行,然后是static{}块执行。
调用构造函数的时候,因为先引用了类,所以先进行静态部分的初始化,然后进行下面步骤:
非静态成员初始化执行,然后是构造函数执行。

在类中声明非静态成员变量C dd = new C(),这里的new操作在调用构造函数的时候、构造函数执行体调用之前执行。也就是说,你需要调用new NewClass()(在这里是默认构造函数,因为你没有声明构造函数:-|),才能对这个dd进行初始化——如果没有new C(),初始化为null;有了new C(),初始化为C()。最后才是对NewClass()的调用。

啰唆了一点,明白了没有?关键是初始化顺序。