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是一个类成员,可以在 构造器运行之前运行, 
 
    我就是不知道什么时候像上面的会执行。什么时候不会执行?  可以帮我举一些例子说明一下吗?       谢谢!!!!!!!!!!!

解决方案 »

  1.   

    因为 C c = new C();是实例化了C类,而C的构造方法中,包括了输出语句。所以 new sadf();时就会打印C阿
    但后面那个问题我没明白,你能把第二个程序写的和第一个那样详细点吗,我好看清楚点。
      

  2.   

    new 子类就会创建一个父类,所以new sadf();时就会先执行super("B"); 这个,执行这个时就相当于创建了一个对象A,所以就又会先执行 C c = new C();这个,再调用构造函数,所以打印出来就是CBB
    new一个子类就会先new一个父类,还一个类的创建的顺序是先给成员属性赋值,再执行构造函数而如果有static关键字的地方则是在类加载时进行初始化
      

  3.   

    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[]){  }
    }
    谢谢, 但还是不能明白.
      

  4.   

    这个里面也有一个    C dd = new C(); 但是不会有C 输出.
      

  5.   

    第二个没有输出是因为没有new出对象,当然就没有输出了
      

  6.   

    public static void main(String args[]){ 
      NewClass aa = new NewClass();加这句话进去后 ,会有输出,是不是因为上面说的
     }
    一个类的创建的顺序是先给成员属性赋值,再执行构造函数呀
      

  7.   

    //但是将这句改为 static  C dd = new C();  会打印出 C 来
    这是因为类加载时会首先初始化static部分,你运行时是执行了 java NewClass 这个命令,加载了NewClass这个类,加载时会先执行static部分的代码,所以会打印出C来
    你可以试验一下,任意写一个类,加上表态初始化块,运行时就会执行
    public class NewClass {
     static {
      System.out.println("1");
     }
     
     public static void main(String args[]){  }

    }
      

  8.   

    构造顺序->
    请求类的时候,static的成员初始化执行,然后是static{}块执行。
    调用构造函数的时候,因为先引用了类,所以先进行静态部分的初始化,然后进行下面步骤:
    非静态成员初始化执行,然后是构造函数执行。在类中声明非静态成员变量C dd = new C(),这里的new操作在调用构造函数的时候、构造函数执行体调用之前执行。也就是说,你需要调用new NewClass()(在这里是默认构造函数,因为你没有声明构造函数:-|),才能对这个dd进行初始化——如果没有new C(),初始化为null;有了new C(),初始化为C()。最后才是对NewClass()的调用。啰唆了一点,明白了没有?关键是初始化顺序。