Java 代码复用(组合与继承)

      java中的类都是围绕着类进行的。可以通过创建新类来复用代码,而不必从头编写。可以使用别人已经开发并调试好的类。此方法使用的窍门在于使用类而不破坏现有的程序代码。达到这一目的的方法有两种:

      第一种方法非常直观:在新类中创建现有类的对象,通过现有类的对象调用其中的成员,来达到复用代码的目的。由于新类是由现有类的对象所组成的,所以这种方式称为组合。该方式只是复用了现有程序的代码,而并非它的形式。

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

      组合和继承之间的选择:

      组合和继承都允许在新类中放置子对象,组合是显式的这样做,而继承则是隐式的这样做。二者之间的区别何在,以及怎样选择呢?

      组合技术通常用于想在新类中使用现有类的功能而非它的接口的形式。即,在新类中嵌入某个对象,让其实现所需要的功能,但新类用户看到的只是为新类所定义的接口,而非嵌入对象的接口。为取得此效果,需要在新类中嵌入一个现有类的private对象。

      有时,也许类的用户直接访问类的组成部分是极具意义的;也就是说,将成员对象声明为public。如果成员对象自身都隐藏了具体的实现,那么这样做是安全的。当用户能够了解到你正在组装一组部件时,会使得端口更加易于理解。car对象即为一个很好的例子:

//发动机
class Engine {
	public void start(){}
	public void stop(){} 
}
//车轮
class Wheel {
	public void start(){}
	public void stop(){} 
}
//车门
class Door {
    public void open(){}
    public void close(){} 
}
class Car {
    Engine engine=new Engine();           
    Wheel [] wheel =new Wheel [4];
    Door[] door=new Door[4];
    pulbic void run(){
    	//具体实现
    }
}
      上面的例子只是我们分析问题的一部分,不是具体的底层实现,所以我们使Car中的成员声明为public,这将有助于客户端程序员了解怎样去使用类,而且也降低了类开发者所面临的代码复杂度。但务必要记住,这仅仅只是一个特例,一般情况下应该使域成为private。

      在继承的时候,使用某个现有类,并开发出它的一个特殊版本。通常,这意味着你在使用一个通用类,并为了某种特殊需要而将其特殊化。略微思考一下就会发现,用一个"交通工具"对象去构成一部"车子"是毫无意义的,因为"车子"不包括"交通工具","车子"仅仅是"交通工具"的一种(is-a)。is-a(是一个)用来表示继承关系,而has-a(有一个)用来表示组合关系。

      在面向对象中编程中,生成和使用程序代码最有可能采用的方法就是直接将数据和方法包装进一个类中,并使用该类的对像。也可以使用组合技术使用现有类来开发新的类。而继承技术其实是不太常用的。尽管我们在学习OOP的过程中多次强调继承,但这不意味着要尽可能的使用它。相反,应当谨慎使用这一技术,使其使用场合仅限于你确信该使用这一技术的情况下。那到底该使用组合还是继承?一个最清晰的判断方法就是问一问你自己是否要从新类型向基类向上转型。需要的话继承则是必须的,如果不需那应当好好考虑是否使用继承。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值