继承和组合

转自https://blog.youkuaiyun.com/zh15732621679/article/details/79443757

       继承是面向对象的三大特征之一,也是实现软件复用的重要手段,Java的继承具有单继承的特点,每个类只有一个直接父类,可以有多个间接父类。继承是一种"is-a"的关系。

继承

    有开发经验的人都知道继承该怎么写,我就不再重复造轮子了!

    优点:

  • 代码复用
  • 子类可重写父类的方法
  • 创建子类对象时,无需创建父类的对象,子类自动拥有父类的成员变量和行为。
  • 子类在父类的基础上可根据自己的业务需求扩展

   缺点:

  •  破坏封装

为什么破坏了封装呢?仔细思考后,想起上篇博客中提到的封装,封装是指将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部的信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。如下例子中父类Fruit中有成员变量weight。Apple继承了Fruit之后,Apple可直接操作Fruit类的成员变量,因此破坏了封装性!


   
  1. /**
  2. * Created by huan on 2018/3/5.
  3. * 继承--父类
  4. */
  5. public class Fruit {
  6. //成员变量
  7. public double weight;
  8. public void info(){
  9. System.out.println( "我是一个水果!重" + weight + "g!");
  10. }
  11. }

  
  1. /**
  2. * Created by huan on 2018/3/5.
  3. * 继承--子类
  4. */
  5. public class Apple extends Fruit {
  6. public static void main(String[] args){
  7. Apple a = new Apple();
  8. a.weight = 10;
  9. a.info();
  10. }
  11. }
  • 支持扩展,但往往以增加复杂度为代价
  • 不支持动态继承,在运行时,子类无法选择不同的父类
  • 紧耦合
当子类继承了父类,需要修改父类接口名称时,出现一旦修改了接口名称,子类都会报错,如果是同一个人维护,可能还可以修改,如果由多个人修改,后果不敢想象呀!

组合

    什么是组合?学过设计模式的都知道,组合是一种较弱的关系,是has-a的关系。组合在代码中如何体现呢?如下:


  
  1. /**
  2. * Created by huan on 2018/3/5.
  3. * 组合
  4. */
  5. public class Animal {
  6. private void beat(){
  7. System.out.println( "心脏跳动...");
  8. }
  9. public void breath(){
  10. beat();
  11. System.out.println( "呼吸中...");
  12. }

  
  1. /**
  2. * Created by huan on 2018/3/5.
  3. * 组合
  4. */
  5. public class Bird {
  6. //将Animal作为Bird的成员变量
  7. private Animal a;
  8. public Bird(Animal a){
  9. this.a = a;
  10. }
  11. public void breath(){
  12. a.breath();
  13. }
  14. public void fly(){
  15. System.out.println( "我在飞..");
  16. }
  17. public static void main(String[] args){
  18. Animal animal = new Animal();
  19. Bird b = new Bird(animal);
  20. b.breath();
  21. b.fly();
  22. }
  23. }

  优点

  • 不破坏封装,松耦合
  • 具有可扩展性
  • 支持动态组合

  缺点

  • 整体类不能自动获得和局部类同样的接口

组合对比继承

  • 继承结构,子类可以获得父类内部实现细节,破坏封装。组合结构:整体不能看到部分的内部实现细节,不会破坏封装
  • 继承模式是单继承,不支持动态继承,组合模式可以支持动态组合
  • 继承结构中,子类可以回溯父类,直到Object类,这样就可以根据业务实现多态(向上转型和向下转型)  ,组合中不可以实现多态
  • 在开发 过程中,如果复用的部分不会改变,为了安全性和封装的本质,应该使用组合,当我们不仅需要复用,而且还可能要重写或扩展,则应该使用继承

如何选择?

  • 两个类之间,明显的存在整体和部分的关系,则应该使用组合来实现复用,当我们需要对已有类做一番改造,从而得到新的符合需求的类,则应该使用继承
  • 当需要被复用的类一定不会改变时,应该使用组合,否则,应该使用继承
相关文章推荐:http://blog.youkuaiyun.com/qq_31655965/article/details/54645220

       继承是面向对象的三大特征之一,也是实现软件复用的重要手段,Java的继承具有单继承的特点,每个类只有一个直接父类,可以有多个间接父类。继承是一种"is-a"的关系。

继承

    有开发经验的人都知道继承该怎么写,我就不再重复造轮子了!

    优点:

  • 代码复用
  • 子类可重写父类的方法
  • 创建子类对象时,无需创建父类的对象,子类自动拥有父类的成员变量和行为。
  • 子类在父类的基础上可根据自己的业务需求扩展

   缺点:

  •  破坏封装

为什么破坏了封装呢?仔细思考后,想起上篇博客中提到的封装,封装是指将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部的信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。如下例子中父类Fruit中有成员变量weight。Apple继承了Fruit之后,Apple可直接操作Fruit类的成员变量,因此破坏了封装性!


   
  1. /**
  2. * Created by huan on 2018/3/5.
  3. * 继承--父类
  4. */
  5. public class Fruit {
  6. //成员变量
  7. public double weight;
  8. public void info(){
  9. System.out.println( "我是一个水果!重" + weight + "g!");
  10. }
  11. }

  
  1. /**
  2. * Created by huan on 2018/3/5.
  3. * 继承--子类
  4. */
  5. public class Apple extends Fruit {
  6. public static void main(String[] args){
  7. Apple a = new Apple();
  8. a.weight = 10;
  9. a.info();
  10. }
  11. }
  • 支持扩展,但往往以增加复杂度为代价
  • 不支持动态继承,在运行时,子类无法选择不同的父类
  • 紧耦合
当子类继承了父类,需要修改父类接口名称时,出现一旦修改了接口名称,子类都会报错,如果是同一个人维护,可能还可以修改,如果由多个人修改,后果不敢想象呀!

组合

    什么是组合?学过设计模式的都知道,组合是一种较弱的关系,是has-a的关系。组合在代码中如何体现呢?如下:


  
  1. /**
  2. * Created by huan on 2018/3/5.
  3. * 组合
  4. */
  5. public class Animal {
  6. private void beat(){
  7. System.out.println( "心脏跳动...");
  8. }
  9. public void breath(){
  10. beat();
  11. System.out.println( "呼吸中...");
  12. }

  
  1. /**
  2. * Created by huan on 2018/3/5.
  3. * 组合
  4. */
  5. public class Bird {
  6. //将Animal作为Bird的成员变量
  7. private Animal a;
  8. public Bird(Animal a){
  9. this.a = a;
  10. }
  11. public void breath(){
  12. a.breath();
  13. }
  14. public void fly(){
  15. System.out.println( "我在飞..");
  16. }
  17. public static void main(String[] args){
  18. Animal animal = new Animal();
  19. Bird b = new Bird(animal);
  20. b.breath();
  21. b.fly();
  22. }
  23. }

  优点

  • 不破坏封装,松耦合
  • 具有可扩展性
  • 支持动态组合

  缺点

  • 整体类不能自动获得和局部类同样的接口

组合对比继承

  • 继承结构,子类可以获得父类内部实现细节,破坏封装。组合结构:整体不能看到部分的内部实现细节,不会破坏封装
  • 继承模式是单继承,不支持动态继承,组合模式可以支持动态组合
  • 继承结构中,子类可以回溯父类,直到Object类,这样就可以根据业务实现多态(向上转型和向下转型)  ,组合中不可以实现多态
  • 在开发 过程中,如果复用的部分不会改变,为了安全性和封装的本质,应该使用组合,当我们不仅需要复用,而且还可能要重写或扩展,则应该使用继承

如何选择?

  • 两个类之间,明显的存在整体和部分的关系,则应该使用组合来实现复用,当我们需要对已有类做一番改造,从而得到新的符合需求的类,则应该使用继承
  • 当需要被复用的类一定不会改变时,应该使用组合,否则,应该使用继承
### 实现继承组合的英文术语 在面向对象编程中,实现继承组合是两种重要的设计机制。以下是对这两种机制的详细解释及其对应的英文术语: #### 1. **实现继承 (Implementation Inheritance)** 实现继承是指一个类通过继承另一个类来重用其方法属性。这种机制允许子类直接访问父类中的方法字段,从而减少代码重复并提高代码复用性。在 Java 其他单继承语言中,实现继承通过 `extends` 关键字完成[^1]。 - **英文术语**: Implementation Inheritance - **描述**: 当类 A 继承自类 B 时,类 A 获得了类 B 的所有非私有方法字段。这种方式适用于需要扩展现有类功能的场景。 - **示例**: ```java class Parent { public void methodA() { System.out.println("Method A in Parent"); } } class Child extends Parent { // 子类继承父类 public void methodB() { System.out.println("Method B in Child"); } } public class Main { public static void main(String[] args) { Child child = new Child(); child.methodA(); // 调用从 Parent 继承的方法 child.methodB(); // 调用 Child 自己的方法 } } ``` #### 2. **组合 (Composition)** 组合是一种通过将一个类的对象作为另一个类的成员变量来实现代码复用的方式。与实现继承不同,组合不依赖于类层次结构,而是通过对象之间的关联关系实现功能扩展。这种方式更加灵活,并且可以避免因多层继承带来的复杂性脆弱性[^2]。 - **英文术语**: Composition - **描述**: 在组合中,一个类通过持有另一个类的实例来使用其功能。这种方式适用于需要动态调整行为或避免紧耦合的场景。 - **示例**: ```java class Component { public void operation() { System.out.println("Operation in Component"); } } class Composite { private Component component; // 持有 Component 的实例 public Composite(Component component) { this.component = component; } public void performOperation() { if (component != null) { component.operation(); // 委托调用 Component 的方法 } } } public class Main { public static void main(String[] args) { Component component = new Component(); Composite composite = new Composite(component); composite.performOperation(); // 调用 Component 的方法 } } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值