疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java复用类之组合语法的使用


 

   

  前言

  复用代码是Java众多引人注目的功能之一。但是要想成为极具革命性的语言,仅仅能够复制代码并对之加以改变是不够的,它还必须能够做更多的事情。

  上述方法常为C这类过程型语言所使用,但收效并不是很好。正如Java中所有事物一样,问题解决都是围绕类展开的。可以通过创建新类来复用代码,而不必再从头开始编写。可以使用别人业已开发并调试好的类。

  此方法的窍门在于使用类而不破坏现有程序代码。读者将会在接下来的文章中看到两种达到这一目的的方法。第一种方法非常直观,只需在新的类中产生现有类的对象。由于新的类是由现有类的对象所组成,所以这种方法称为组合。该方法只是复用了现有程序代码的功能,而非它的形式。(本文便是对这种组合方法的解析)

  第二种方法则更细致一些,它按照现有类的类型来创建新类。无需改变现有类的形式,采用现有类的形式并在其中添加新的代码。这种神奇的方式称为继承,而且编译器可以完成其中大部分工作。继承是面向对象程序设计的基石之一,下一节将会对此做必要的解析。

  就组合和继承而言,其语法和行为大多是相似的。由于它们是利用现有类型生成新类型,所以这样做极富意义。在接下来的两节中,读者将会了解到这两种代码重用机制。

  示例源码

  其实在我们日常的程序编写中我们会经常用到组合技术,只是我们没有留意而已。只需将对象引用置于新类中即可。例如,假设你需要某个对象,它要具有多个String对象、几个基本类型数据,以及另一个类的对象。对于非基本类型的对象,必须将其引用置于新的类中,但可以直接定义基本类型数据:

  package com.mufeng.theseventhchapter;

  public class WaterSource {

  private String s;

  public WaterSource() {

  System.out.println("WaterSource()");

  s = "Constructed";

  }

  @Override

  public String toString() {

  return s;

  }

  }

  [java] view plain copy 在CODE上查看代码片派生到我的代码片

  package com.mufeng.theseventhchapter;

  public class SprinklerSystem {

  private String valve1, valve2, valve3, valve4;

  private WaterSource source = new WaterSource();

  private int i;

  private float f;

  @Override

  public String toString() {

  return "valve1=" + valve1 + " valve2=" + valve2 + " valve3=" + valve3

  + " valve4=" + valve4 + " " + "i=" + i + " f=" + f + " "

  + "source=" + source;

  }

  public static void main(String[] args) {

  SprinklerSystem sprinklerSystem = new SprinklerSystem();

  System.out.println(sprinklerSystem);

  }

  }

  输出结果

  [java] view plain copy 在CODE上查看代码片派生到我的代码片

  WaterSource()

  valve1=null valve2=null valve3=null valve4=null

  i=0 f=0.0

  source=Constructed

  源码解析

  在上面两个类所定义的方法中,有一个很特殊:toString()。每一个非基本类型的对象都有一个toString()方法,而且当编译器需要一个String而你却只有一个对象时,该方法便会被调用。所以在SprinklerSystem.toString()的表达式中:

  [java] view plain copy 在CODE上查看代码片派生到我的代码片

  "source=" + source

  编辑器将会得知你想要将一个String对象("source=")同WaterSource相加。由于只能将一个String对象和另一个String对象相加,因此编译器会告诉你:“我将调用toString(),把source转换成为一个String!”这样做之后,它就能够将两个String连接到一起并将结果传递给System.out.println()。每当想要使所创建的类具备这样的行为时,仅需要编写一个toString()方法即可。