这个是THINKING IN JAVA 里的一道题!
程序如下://: reusing/Bath.java
// Constructor initialization with composition.
import static net.mindview.util.Print.*;class Soap {
  private String s;
  Soap() {
    print("Soap()");
    s = "Constructed";
  }
  public String toString() { return s; }
} public class Bath {
  private String // Initializing at point of definition:
    s1 = "Happy",
    s2 = "Happy",
    s3, s4;
  private Soap castille;
  private int i;
  private float toy;
  public Bath() {
    print("Inside Bath()");
    s3 = "Joy";
    toy = 3.14f;
    castille = new Soap();
  }
  // Instance initialization:
  { i = 47; }
  public String toString() {
    if(s4 == null) // Delayed initialization:
      s4 = "Joy";
    return
      "s1 = " + s1 + "\n" +
      "s2 = " + s2 + "\n" +
      "s3 = " + s3 + "\n" +
      "s4 = " + s4 + "\n" +
      "i = " + i + "\n" +
      "toy = " + toy + "\n" +
      "castille = " + castille;
  }
  public static void main(String[] args) {
    Bath b = new Bath();
    print(b);
  }
} /*输出答案是这个
Inside Bath()
Soap()
s1 = Happy
s2 = Happy
s3 = Joy
s4 = Joy
i = 47
toy = 3.14
castille = Constructed
*///:~
问题:程序入口是 首先是构造方法了一个Bath对象,按照构造方法初始化应该是先对成员变量初始化,也就是说先给这些成员变量初始化,
private String 
    s1 = "Happy",
    s2 = "Happy",
    s3, s4;
  private Soap castille;
  private int i;
  private float toy;
  public Bath()
这里有一个private Soap castille 的构造方法,所以,结果应该是先输出Soap()才对吧,为什么结果是先输出这个 Inside Bath()。
不是先初始化成员变量再构造方法的吗???
 

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【xujiaxiang】截止到2008-07-15 21:17:44的历史汇总数据(不包括此帖):
    发帖的总数量:1                        发帖的总分数:20                       每贴平均分数:20                       
    回帖的总数量:4                        得分贴总数量:0                        回帖的得分率:0%                       
    结贴的总数量:1                        结贴的总分数:20                       
    无满意结贴数:0                        无满意结贴分:0                        
    未结的帖子数:0                        未结的总分数:0                        
    结贴的百分比:100.00%               结分的百分比:100.00%                  
    无满意结贴率:0.00  %               无满意结分率:0.00  %                  
    敬礼!
      

  2.   

    一个类要调用他的构造方法 必须把这个类实例化才会调用 而不仅仅是用private Soap castille它声明一下举个例子来说:
    public class A()
    {
       public A()
       {
          System.out.prinln("调用了构造方法");
       }
    }public static void main(Strig[] args)
    {
         private A a;//这句话不会打印出“调用了构造方法这句话”,也就是不会调用构造方法
         private A a=new A();//这样写才会调用构造方法
    }
      

  3.   

    prinln写错了 不好意思 是println
      

  4.   

    感谢 luote19861228  
    终于明白了!!太感谢了!!