toString

//: reusing/SprinklerSystem.java
// Composition for code reuse.


class WaterSource {
  private String s;
  WaterSource() {
    System.out.println("WaterSource()");
    s = "Constructed";
  }
  public String toString() { return s; }
}


public class SprinklerSystem {
  private String valve1, valve2, valve3, valve4;
  private WaterSource source = new WaterSource();
  private int i;
  private float f;
  public String toString() {
    return
      "valve1 = " + valve1 + " " +
      "valve2 = " + valve2 + " " +
      "valve3 = " + valve3 + " " +
      "valve4 = " + valve4 + "\n" +
      "i = " + i + " " + "f = " + f + " " +
      "source = " + source;
  }
  public static void main(String[] args) {
    SprinklerSystem sprinklers = new SprinklerSystem();
    System.out.println(sprinklers);
  }
} /* Output:
WaterSource()
valve1 = null valve2 = null valve3 = null valve4 = null
i = 0 f = 0.0 source = Constructed

*///:~


WaterSource内定义的一个方法是比较特别的:toString()。大家不久就会知道,每种非基本类型的对象都
有一个toString()方法。若编译器本来希望一个String,但却获得某个这样的对象,就会调用这个方法。所
以在下面这个表达式中: 
System.out.println("source = " + source) ; 
编译器会发现我们试图向一个WaterSource 添加一个String 对象("source =")。这对它来说是不可接受
的,因为我们只能将一个字串“添加”到另一个字串,所以它会说:“我要调用toString(),把source 转
换成字串!”经这样处理后,它就能编译两个字串,并将结果字串传递给一个System.out.println()。每次
随同自己创建的一个类允许这种行为的时候,都只需要写一个 toString()方法。 
如果不深究,可能会草率地认为编译器会为上述代码中的每个句柄都自动构造对象(由于Java 的安全和谨慎
的形象)。例如,可能以为它会为 WaterSource调用默认构建器,以便初始化 source。打印语句的输出事实
上是: 

 
valve1 = null 
valve2 = null 
valve3 = null 
valve4 = null 
i = 0 
f = 0.0 
source = null 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值