继承和组合

一、继承
继承是面向对象的三大特征之一,也是实现软件复用的重要手段,Java的继承具有单继承的特点,每个类只有一个直接父类,可以有多个间接父类。继承是一种"is-a"的关系。
    优点:
代码复用
子类可重写父类的方法
创建子类对象时,无需创建父类的对象,子类自动拥有父类的成员变量和方法。
子类在父类的基础上可根据自己的业务需求扩展,新增属性和方法
   缺点:
破坏封装
封装:通过公有化方法访问私有化属性,使得数据不容易被任意窜改,常用private修饰属性;
继承:通过子类继承父类从而获得父类的属性和方法,正常情况下,用protected修饰属性,专门用 于给子类继承的,权限一般在本包下和子类里;
继承破坏了封装:是因为属性的访问修饰符被修改,使得属性在本包和子类里可以任意修改属性的数 据,数据的安全性从而得不到保障。
如下例子中父类Fruit中有成员变量weight。Apple继承了Fruit之后,Apple可直接操作Fruit类的 成员变量,因此破坏了封装性!
public class Fruit {
//成员变量
// private double weight;为了让子类继承,改为了:
protected double weight;

public void info(){
System.out.println(“我是一个水果!重” + weight + “g!”);
}
}

/**

  • 继承–子类
    */
    public class Apple extends Fruit {
    public static void main(String[] args){
    Apple a = new Apple();
    a.weight = 10;
    a.info();
    }
    }

二、什么是组合?
public class Animal {
public void breath(){
System.out.println(“呼吸中…”);
}
}
/**

  • 组合
    */
    public class Bird {
    //将Animal作为Bird的成员变量
    private Animal a;
    public Bird(Animal a){
    this.a = a;
    }
    public void breath(){
    a.breath();
    }
    public void fly(){
    System.out.println(“我在飞…”);
    }

    public static void main(String[] args){
    Animal animal = new Animal();
    Bird b = new Bird(animal);
    b.breath();
    b.fly();
    }
    }
    优点
    不破坏封装,松耦合
    具有可扩展性
    支持动态组合
      缺点
    整体类不能自动获得和局部类同样的接口

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


版权声明:本文为weixin_50179223原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。