Java学习笔记(二)--组合与继承
2018-03-05 15:08
246 查看
继承是面向对象的三大特征之一,也是实现软件复用的重要手段,Java的继承具有单继承的特点,每个类只有一个直接父类,可以有多个间接父类。继承是一种"is-a"的关系。
优点:
代码复用
子类可重写父类的方法
创建子类对象时,无需创建父类的对象,子类自动拥有父类的成员变量和行为。
子类在父类的基础上可根据自己的业务需求扩展
缺点:
破坏封装
为什么破坏了封装呢?仔细思考后,想起上篇博客中提到的封装,封装是指将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部的信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。如下例子中父类Fruit中有成员变量weight。Apple继承了Fruit之后,Apple可直接操作Fruit类的成员变量,因此破坏了封装性!/**
* Created by huan on 2018/3/5.
* 继承--父类
*/
public class Fruit {
//成员变量
public double weight;
public void info(){
System.out.println("我是一个水果!重" + weight + "g!");
}
}
不支持动态继承,在运行时,子类无法选择不同的父类
紧耦合
当子类继承了父类,需要修改父类接口名称时,出现一旦修改了接口名称,子类都会报错,如果是同一个人维护,可能还可以修改,如果由多个人修改,后果不敢想象呀!
* Created by huan on 2018/3/5.
* 组合
*/
public class Animal {
private void beat(){
System.out.println("心脏跳动...");
}
public void breath(){
beat();
System.out.println("呼吸中...");
}
不破坏封装,松耦合
具有可扩展性
支持动态组合
缺点
整体类不能自动获得和局部类同样的接口
继承模式是单继承,不支持动态继承,组合模式可以支持动态组合
继承结构中,子类可以回溯父类,直到Object类,这样就可以根据业务实现多态(向上转型和向下转型) ,组合中不可以实现多态
在开发 过程中,如果复用的部分不会改变,为了安全性和封装的本质,应该使用组合,当我们不仅需要复用,而且还可能要重写或扩展,则应该使用继承
当需要被复用的类一定不会改变时,应该使用组合,否则,应该使用继承
相关文章推荐:http://blog.csdn.net/qq_31655965/article/details/54645220
继承
有开发经验的人都知道继承该怎么写,我就不再重复造轮子了!优点:
代码复用
子类可重写父类的方法
创建子类对象时,无需创建父类的对象,子类自动拥有父类的成员变量和行为。
子类在父类的基础上可根据自己的业务需求扩展
缺点:
破坏封装
为什么破坏了封装呢?仔细思考后,想起上篇博客中提到的封装,封装是指将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部的信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。如下例子中父类Fruit中有成员变量weight。Apple继承了Fruit之后,Apple可直接操作Fruit类的成员变量,因此破坏了封装性!/**
* Created by huan on 2018/3/5.
* 继承--父类
*/
public class Fruit {
//成员变量
public double weight;
public void info(){
System.out.println("我是一个水果!重" + weight + "g!");
}
}
/** * Created by huan on 2018/3/5. * 继承--子类 */ public class Apple extends Fruit { public static void main(String[] args){ Apple a = new Apple(); a.weight = 10; a.info(); } }支持扩展,但往往以增加复杂度为代价
不支持动态继承,在运行时,子类无法选择不同的父类
紧耦合
当子类继承了父类,需要修改父类接口名称时,出现一旦修改了接口名称,子类都会报错,如果是同一个人维护,可能还可以修改,如果由多个人修改,后果不敢想象呀!
组合
什么是组合?学过设计模式的都知道,组合是一种较弱的关系,是has-a的关系。组合在代码中如何体现呢?如下:/*** Created by huan on 2018/3/5.
* 组合
*/
public class Animal {
private void beat(){
System.out.println("心脏跳动...");
}
public void breath(){
beat();
System.out.println("呼吸中...");
}
/** * Created by huan on 2018/3/5. * 组合 */ 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类,这样就可以根据业务实现多态(向上转型和向下转型) ,组合中不可以实现多态
在开发 过程中,如果复用的部分不会改变,为了安全性和封装的本质,应该使用组合,当我们不仅需要复用,而且还可能要重写或扩展,则应该使用继承
如何选择?
两个类之间,明显的存在整体和部分的关系,则应该使用组合来实现复用,当我们需要对已有类做一番改造,从而得到新的符合需求的类,则应该使用继承当需要被复用的类一定不会改变时,应该使用组合,否则,应该使用继承
相关文章推荐:http://blog.csdn.net/qq_31655965/article/details/54645220
相关文章推荐
- java 继承与组合学习笔记
- 0022 Java学习笔记-面向对象-继承、多态、组合
- [java学习笔记]继承和组合
- Java菜鸟学习笔记--面向对象篇(十四):继承与组合
- JAVA学习笔记12——super关键字+继承的内存分析+组合
- Java菜鸟学习笔记(23)--继承篇(二):继承与组合
- java编程思想学习笔记:如何选择继承与组合
- java学习笔记<六>继承与组合
- Objective-C 学习笔记(二) 类继承,组合,多态等
- C\C++ 程序员从零开始学习Android - 个人学习笔记(八) - java基础 - 继承、抽象类、接口、内部类(待续)
- java学习笔记《java面向对象编程》——继承
- java 设计模式学习笔记八 composite组合模式
- Java学习笔记之六——Java类的继承和多态(1)
- Objective-C 学习笔记(二) 类继承,组合,多态等
- Java学习笔记003——继承、抽象类、类相等测试、泛型数组列表、可变参数方法
- java核心技术学习笔记7---继承与多态
- C\C++ 程序员从零开始学习Android - 个人学习笔记(八) - java基础 - 继承、抽象类、接口、内部类(待续)
- objective-c学习笔记第五章《objective-c 继承与java中的区别》
- java学习笔记(二十一)继承
- 黑马程序员学习笔记四——Java 面向对象 特点之 继承