热闹热闹,给大家送分:
凡进者均有分,直到分分完。
思考下例(请不要用工具运行后再回答):
public class TestInitial {
 private int x=1;//数据成员初始化
 
 {//对象初始化块
     x=2;
 }
 public TestInitial()//这是构造器
 {
     this(x);//若你认为:先做对象初始化块,再做构造器。那么问:此处的实参x的值是什么?
 }
 public TestInitial(int y)
 {}
}若你认为:先做对象初始化块,再做构造器。那么问:上述的实参x的值是什么?
选择:
  A:x值是2
  B:x值是1
  C:x值是0
  D: 根本不行,编译出错。你选哪一个?

解决方案 »

  1.   

    我个人认为!
     this(x);//因为this(...)这么调用其他的构造方法的这个代码,必须出现在构造方法的第一行,书上是有的!有这样的说话,最后执行构造方法内部代码,但是
    public TestInitial()//实例化的时候首先进来这里,之后第一行有this(..)代码,就会执行这代码,假如没有,从块代码和成员变量实例化.假如没有这this(..)代码就会直接执行块代码和成员变量实例化!都这写结束了,回到构造方法的第一行代码之处(假如没有this(..)代码)或者第二行代码之处,继续执行期于的操作! { 
         this(x);//所以说,初始化的时候不是不进来这个方法块,而是说近来之后先判断有没有this(..)这个代码!
     } 纯属个人理解!
      

  2.   


    //写的很清楚了
    public class TestInitial { 
     static  private int x=1; //第四步
      
     {
         x=2; //第五步
     } 
     public TestInitial() //第二步
     {
     this(x);//第三步
     System.out.println("TestInitial()");//第七步
     } 
     public TestInitial(int y) //第三步
     {
     System.out.println("TestInitial(int y)");//第六步
     } 
     public static void main(String[] args) {
     new TestInitial();//第一步
     }

      

  3.   


    //有重复的编号了...不好意思public class TestInitial { 
     static  private int x=1; //第五步
      
     {
         x=2; //第六步
     } 
     public TestInitial() //第二步
     {
     this(x);//第三步
     System.out.println("TestInitial()");//第八步
     } 
     public TestInitial(int y) //第四步
     {
     System.out.println("TestInitial(int y)");//第七步
     } 
     public static void main(String[] args) {
     new TestInitial();//第一步
     }

      

  4.   

    D: 根本不行,编译出错。  如果将private int x=1;改为static的话就是 B:x值是1 
      

  5.   

    让我想起了这个帖:
    http://topic.csdn.net/u/20080509/11/ad3f755d-9813-4a0c-9271-d4a9006e8476.html
    害我又回去复习了一遍
      

  6.   

    既然是要实例化一个对象,除了static变量以外肯定就得先执行该对象得构造函数了,不然怎么构造一个对象,然后会对如果要执行其他变量或方法时,就会先做私有的初始化了.
    除非你的初始化也是static的,才会在加载该class时就执行.
      

  7.   

    总结一下:
    如果是楼主那样的,答案是D
    如果x前加上static,答案是B
    如果初始化前面也加上static,答案是A.
      

  8.   

    引用“lovingprince”给出的答案: 这是因为在调用构造函数的时候,他会直接追述到父类的第一个构造函数,如果没有,就是自己的第一个需要执行的构造函数,这里的this(XX)带参数的就是第一个需要执行的构造函数,这个时候还没有执行
       {//对象初始化块
         x=2;
       } ,此时传递的参数X=1会保留下来,执行上面这一段初始化代码,之后再执行this(XX),由于之前参数X=1已经保留下来了    只有在第一个构造函数执行之前,才会去初始化非静态初始化,如果这第一个构造函数有参数,这个参数会放在栈中,之后的修改不会影响栈中的内容。
      

  9.   

    ....学习...不过没有MAIN方法..程序会执行么
      

  10.   

      D: 根本不行,编译出错。 
    Cannot refer to an instance field x while explicitly invoking a constructor
      

  11.   

    不能这样调用.这是java的一个规则问题
      

  12.   

    说两句扫兴的。这个问题在另一个帖子里讨论的很清楚了,也很辛苦你花了很大篇幅解释,怎么在这里又搞起来了,我晓得你知道茴香豆的"茴“字有九种写法!Java中有很多值得或需要深入探讨的地方,如果你确实比较牛,对Java掌握的比较深,你可以引导大家多探讨一些比较深入的话题,怎么老是搞这个话题?让人有点想不通了!恕我直言!抱歉!
      

  13.   

    选择D
     public TestInitial()//这是构造器 
     { 
         this(x);//若你认为:先做对象初始化块,再做构造器。那么问:此处的实参x的值是什么? 
     } x并非类变量(非static)不能直接调用。
      

  14.   

    这个题在论坛里有答案,我都看到好几个了的
    最先执行的是{}里的语句,且在new 一个新对象的时候都会执行一次
      

  15.   

    我认为先执行构造器在数据出事——在对象初始化
    本题main得有static 与题意不符
      

  16.   

    D:根本不行,编译出错
    应该将private的x指定为static的,那样才能在调用构造器之前得到初始化,构造器中的参数才有值,否则就会报错...