WaterSource source;    //问题1:当程序执行到这儿时,应该调用
                         //WaterSource类
                         //的构造函数,但结果中为什么没有
                         //“WaterSource()”??
这里是不会调用构造函数的,只是把source初始化为null.
WaterSource source = new WaterSource();
这样才调用初始化函数

解决方案 »

  1.   

    1,WaterSource source;    //当程序执行到这儿时,只是声明了一个WaterSource的引用,并未调用其构造函数。如果要调用的话,应该WaterSource source= new WaterSource();
    2, 原因同上,WaterSource()并未执行,s 没有初始化,所以为null。
    3, 在System.out.println()方法中,会自动调用对象的toString方法。
    4,有的。只要是类,都是从Object这个类继承出来的,都会继承Object的toString方法。
    5,WaterSource类中定义的toString 方法会把从Object类中继承来的toString方法覆盖掉。
       可以改名字,想定义成什么名字都行,只要符合java命名规约。
      

  2.   

    呵呵//
    不调用new ,jvm不会给你的class生成实例,也不会分配空间,更不要说初始化了,所以你的构造函数不会被调用。
    在java里面所有的类都是从Object继承下来的,你如果看过Object这个类的原码就会非常清楚。Object里面已经定义了一个toString方法。
    再有,如果你看过String 这个类的原码就会彻底搞清楚toString的涵义和用法。。因为String类已经实装了toString这个方法。
    还有,当你执行比如System.out.println(Object)的时候,就会自动调用Object的toString方法,所以,当你的object不初始化,就是null,如果初始化了但没有自己实装toString方法,就会默认调用父类的toString,如果父类也没有实装,就会一直调用到Object的toString方法,打出来的是对象实例的hash code。
      

  3.   

    1)WaterSource source;    //问题1:当程序执行到这儿时,应该调用
                             //WaterSource类
                             //的构造函数,但结果中为什么没有
                             //“WaterSource()”??
       这个理解不对,因为这只是定义的变量,并没有创建对象,也就是没有new对象
    2)也是因为没有new原因,所以没有执行s = new String("Constructed");
    3)如System.out.println(obj)这个时候会自动调用toString方法
    4)这个toString是父类(Object)的方法,不写的话,调用父类的toString(),自己写就重载了这个方法。
    5)改当然可以改名,只是没有重载父类的方法了
      

  4.   

    楼主看来是一个C++程序员,我开始也犯过同样的错误。java中的所有对象都是建立在堆上的,永远忘掉我们在栈上创建的对象吧,cry。这和vcl的理念是类似的。  private String s;如上s,所有的java对象变量都是引用,就是我们爱恨交加的对象指针。建议楼主看看C++和java区别的书,这样能快速澄清概念。