面向对象三大特性一一继承(inheritance)和组合(Composition)

记住2句话(常识),像个正常人思考!

1.“  is-a ”关系 用 继承! 学生是人,学生继承人这个类,

2. “has-a ”关系 用 组合!电脑有显卡,那么我们就在计算机类中增加显卡属性来复用显卡类的代码。

使用继承的代码

 1 /**
 2  *继承的好处
 3  * 1 OOP面向对象 编程          提高代码复用性 
 4  * 2 OOD面向对象 设计          对某一类的抽象 实现对现实世界更好的建模
 5  * 类继承 是单继承 构造方法 不继承         java.lang.object是根基类 如果你继承后边什么不写 他会继承根基类                     接口是多继承
 6  * @author Administrator
 7  * overwrite重写  子类对父类的方法 不满意 重写
 8  *
 9  */
10 public class Animal {
11     String eye;
12     
13     public void run(){
14         System.out.println("跑跑!");
15     }
16     public void eat(){
17         System.out.println("吃吃!");
18     }
19     public void sleep(){
20         System.out.println("睡觉觉!");
21     }
22     /*可以不写 编译器帮我们写
23      * 构造方法  可写可不写,一般不写, 因为Animal是Object的子类    
24      *  因为Object是根基类 所以 Object没有super();
25     public Animal(){
26         super();//super必须在第一行
27         System.out.println("创建一个动物");
28     }*/
29 }
30 
31 class Mammal extends Animal{
32     
33     public void taisheng(){
34         
35         System.out.println("我是胎生");
36     }
37 }
38 
39 class Paxing extends Animal{
40 
41     public void eggsheng(){
42         System.out.println("我是卵生");
43     }
44 }
45 
46 class Bird extends Animal{
47     //不满意可以重写 overwrite
48     public void run(){
49         super.run();//调用的原来父类Animal的run();方法
50         System.out.println("飞啊飞");
51     }
52     
53     public void eggsheng(){
54         System.out.println("我是卵生");
55     }
56     /**
57      * 同上 
58     public Bird(){
59         super();
60         System.out.println("建一个鸟对象");
61     }
62     */
63     
64 }

main方法 

 1 public class Test {
 2 
 3     public static void main(String[] args) {
 4         
 5         Bird b = new Bird();
 6         b.run();
 7         //System.out.println(b.toString());
 8     }
 9 
10 }

控制台

跑跑!
飞啊飞

使用组合的代码

 1 /**
 2  * 组合 的复用性更好 更灵活 继承和组合的区别 1.继承从OOA的层面讲 更容易建模 2.从OOD 的层面 具有复用性 组合 完成了 继承的部分功能 既
 3  * 复用性 但没有继承容易建模
 4  */
 5 public class Computer {
 6     String eye;
 7 
 8     public void run() {
 9         System.out.println("电脑已经开机!");
10     }
11 
12     public void sleep() {
13         System.out.println("关机!");
14     }
15 
16     // 测试组合
17     public static void main(String[] args) {
18 
19         Gpu g = new Gpu();
20         g.computer.run();
21         System.out.println("#####################");
22         g.run();// 空指针异常 为什么呢?
23 
24     }
25 
26 }
27 
28 class Gpu {
29 
30     Computer computer = new Computer();
31 
32     public void run() {
33 
34         computer.run();
35         System.out.println("您的显卡TITAN X,开始工作");
36     }
37 
38 }

控制台

1 电脑已经开机!
2 #####################
3 电脑已经开机!
4 您的显卡TITAN X,开始工作

 类继承和对象组合的优缺点

    类继承和对象是复用的两种最常用的技术。

一:继承

  继承是Is a 的关系,比如说Student继承Person,则说明Student is a Person。继承的优点是子类可以重写父类的方法来方便地实现对父类的扩展。

  继承的缺点有以下几点:

  ①:父类的内部细节对子类是可见的。

  ②:子类从父类继承的方法在编译时就确定下来了,所以无法在运行期间改变从父类继承的方法的行为。

  ③:如果对父类的方法做了修改的话(比如增加了一个参数),则子类的方法必须做出相应的修改。所以说子类与父类是一种高耦合,违背了面向对象思想。

二:组合

  组合也就是设计类的时候把要组合的类的对象加入到该类中作为自己的成员变量。

  组合的优点:

  ①:当前对象只能通过所包含的那个对象去调用其方法,所以所包含的对象的内部细节对当前对象时不可见的。

  ②:当前对象与包含的对象是一个低耦合关系,如果修改包含对象的类中代码不需要修改当前对象类的代码。

  ③:当前对象可以在运行时动态的绑定所包含的对象。可以通过set方法给所包含对象赋值。

  组合的缺点:①:容易产生过多的对象。②:为了能组合多个对象,必须仔细对接口进行定义。

由此可见,组合比继承更具灵活性和稳定性,所以在设计的时候优先使用组合。只有当下列条件满足时才考虑使用继承:

  • 子类是一种特殊的类型,而不只是父类的一个角色
  • 子类的实例不需要变成另一个类的对象
  • 子类扩展,而不是覆盖或者使父类的功能失效
原文地址:https://www.cnblogs.com/PoeticalJustice/p/7616593.html