代码如下:
class WaterSourse
{
   private String s;
   WaterSourse()
   {
      System.out.println("WaterSourse()");
      s=new String("Constructed");
   }
   public String toString()
   {
      return s;
   }
}public class SprinklerSystem
{
   private String valve1,valve2,valve3,valve4;
   private WaterSourse source;
   private int i;
   private float f;
   public String toString()
   {
      return 
      "valve1="+valve1+"\n"+
      "valve2="+valve2+"\n"+
      "valve3="+valve3+"\n"+
      "valve4="+valve4+"\n"+
      "i="+i+"\n"+
      "f="+f+"\n"+
      "source="+source;
    }
public static void main(String []args)
  {
    SprinklerSystem sprinklers=new SprinklerSystem();
    System.out.println(sprinklers);
   }    
}
能告诉我它的执行过程吗?

解决方案 »

  1.   

    System.out.println(sprinklers)
    //输出toString()的返回字符串,没有人工赋值,所以显示各类型默认值
      

  2.   

    SprinklerSystem类中虽然有包含WaterSourse类,但只是定义,并没有实例化,所以上面的WaterSourse类基本没用到!所以最后的显示如下:
    valve1=null
    valve2=null
    valve3=null
    valve4=null
    i=0
    f=0.0
    source=null
      

  3.   

    they are all right,you do not give their values by yourself ,you can do follow;
    class WaterSourse
    {
       private String s;
       WaterSourse()
       {
       s=new String("Constructed");
       System.out.println("WaterSourse()"+"/n"+s);
         
       }
       public String toString()
       {
          return s;
      }
    }public class fds
    {
       private String valve1,valve2,valve3,valve4;
       private WaterSourse source = new WaterSourse();
      
       private int i;
       private float f ;
      // source =  new WaterSourse();
       public String toString()
       {
         return 
          "valve1="+valve1+"\n"+
          "valve2="+valve2+"\n"+
          "valve3="+valve3+"\n"+
          "valve4="+valve4+"\n"+
          "i="+i+"\n"+
          "f="+f+"\n"+
          "source="+source;
        }
    public static void main(String []args)
      {
        fds sprinklers=new fds();
        System.out.println(sprinklers);
       }    
    }***********this is the result*********
    WaterSourse()/nConstructed
    valve1=null
    valve2=null
    valve3=null
    valve4=null
    i=0
    f=0.0
    source=Constructed
      

  4.   

    其实我真正不明白的是,Sprinklers 并没有调用toString()方法,但是为什么会执行呢?
      

  5.   

    当调用System.out.println输出一个类的对象的时候,
    系统自动调用该类的toString()方法!
      

  6.   

    lz牛X,搞了两天才把自己的真正想法说出来。
      

  7.   

    你自己写了toString 方法把Object的toString 覆盖了,
     System.out.println输出一个对象会自动调用toString,
     你可以不覆盖,在输出对象,这时调用的是Object的toString,是个对象的地址
      

  8.   

    从main函数入手~根据内容一步步往下读你就知道是什么意思了
    1、SprinklerSystem sprinklers=new SprinklerSystem();创建了个SprinklerSystem()的实例
    看SprinklerSystem类中的代码。
    2、分析SprinklerSystem,其中除了定义些参数外还有个方法是public String toString(),
    定义参数应该很好理解,是吗?(参数中有个private WaterSourse source;和下面内容一起讲解)。
    3、现在要搞懂toString()方法的作用,所有的类都是从Object继承而来的,SprinklerSystem因此也继承了toString()方法.public String toString()是重写了继承而来的该方法,toString()方法有什么作用呢?从java提供的帮助文档中得知: 返回该对象的字符串表示。继承而来的toString()方法的字符串是由类名、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。重写只后该类对象的字符串表示就是
          "valve1="+valve1+"\n"+
          "valve2="+valve2+"\n"+
          "valve3="+valve3+"\n"+
          "valve4="+valve4+"\n"+
          "i="+i+"\n"+
          "f="+f+"\n"+
          "source="+source;
    也就是所,在打印语句中你直接输入对象名他就会打印出上面内容的字符串。
    4、搞懂了toString()方法后现在对里面的内容进行分析:前面的部分不说了很容易理解
    关键在source="+source;这时调用了source对象,source是WaterSourse类的对象。
    5、因此现在又分析WaterSourse中的代码:定义参数s,但没被初始化,因此他的内容为空(null).
    6、下一句是“WaterSourse(){...}”语句块,对他进行分析:该语句块是个构造方法,在为类创建类的对象并用new对对象分配空间时自动调用。但在你的代码中只是WaterSourse source;创建了引用而没分配空间,因此构造方法不被调用。对s的赋值语句也被写在构造方法中,但构造方法没被调用所以s值依然为null。假如把private WaterSourse source改为private WaterSourse source= new WaterSourse();那么在分配空间时同时调用该类的构造方法,构造方法中的打印和赋值语句这是被执行。
    7、该类的toString()方法我不多说了结合前面对SprinklerSystem类的分析应该能理解。
    8、System.out.println(sprinklers),从字面理解就是打印sprinklers对象,其实就是调用sprinklers的toString()方法,和sprinklers.toString()是一个意思。
    9、那么现在就又回到了刚才所讲的那些了。全部代码分析完毕。
    不知道你是否能理解,把自己看做是电脑,电脑的运行顺序是什么你就按什么顺序去分析代码。比如电脑从main函数入口,那么你就从main函数作为起点看。
      

  9.   

    上面那篇其实是我昨天晚安就写好了的了~但CSDN的论坛在维护不能回帖所以我只能今天发给你了
      

  10.   

    谢谢兄弟们,谢谢!Pro_Vida() 讲得太好了!
      

  11.   

    呵呵~~hcxy413() 那看来你可以结贴了~
      

  12.   

    就等你再来了,交个朋友吧[email protected]! 呵呵
      

  13.   

    不是把?你没有编译器吗?run 下就知道了,要不自己debug一下