JAVA成神之路-基础篇——组合和继承


今天看着思维导图想了好久封装继承和多态这里写什么。最后决定写写这个组合和继承吧。这俩货其实在日常开发中还是挺有用的。个人感觉有很多设计上的模式实际都是这两个相护配合产生的。

组合是什么

组合模式,所谓的组合顾名思义,就是组合…举个例子,我们购买了一个电脑,电脑这个对象拥有着很多组件,比如cpu,显卡,内存等等,这些东西相护组合最后构成了一个电脑。对于电脑这个类来说,我们不能说它是显卡,也不能说它是cpu。它只是拥有这些东西。在创建电脑这个对象的时候,我们也就可以更加灵活的根据需要进行组合。

继承是什么

继承,它强调的是我就是它儿子,它能干的我都能干,它不能干的,我也能干。但是这就会存在一个问题,比如我要创建一个电脑的对象,正常来说,电脑是有显卡的。可以显示东西。但是我这电脑就很特别,我就是不想让他有显示器给别人看(好像单片机哈)。这时候创建对象如果使用继承关系会发生什么?这个对象因为是继承的,天生就拥有了显示的能力(暴漏了本不该属于自己的能力)。这不是闹笑话了。所以,继承强调我就是它。

组合与继承之间的区别

关于继承和组合这两个东西总感觉是八竿子打不着关系东西,为什么拿到一起说呢,我觉得更多的是因为他们是构建构建的,构建类不同的想法吧。对于组合,它强调的是has-a。我拥有你。因为有了你我可以更好的工作,别人可能就不需要你了。继承则强调了is-a。我就是你,你可以出现的地方,那我一定可以出现。

组合和继承实用的场景

现在很多场景都强调组合要优于继承的方法。个人觉得这个还是要根据具体的场景具体的分析。例如我们构建一个鸟,它拥有着各种能力,可以飞,可以叫。但是现在我们有一只很特别的鸟,它就是不会叫(天生残疾)。会发生什么?

基础类BIRD

package com.cheche365.dictonary.datatrans.datatrans.study;

/**
 * @author sunyan
 * @date 2022/12/10 22:26
 * @description
 */
public class Bird {
    public void call(){
        System.out.println("啾啾啾啾");
    }

    public void fly(){
        System.out.println("我飞啦");
    }
}

子类残疾的不会叫百灵鸟类 BLBird

package com.cheche365.dictonary.datatrans.datatrans.study;

/**
 * @author sunyan
 * @date 2022/12/10 22:28
 * @description
 */
public class BLBird extends Bird{

}

运行

package com.cheche365.dictonary.datatrans.datatrans.study;

/**
 * @author sunyan
 * @date 2022/12/10 22:29
 * @description
 */
public class Sky {
    public static void main(String[] args) {
        //我要构建一个不会叫的百灵鸟
        Bird bird = new BLBird();
        bird.call();
        //但是这个继承了父类,它居然会叫了。
        bird.fly();
    }
}

很明显这个残疾的不会叫的百灵鸟它叫了出来。这是不对的。那这个时候怎么办,我们只能在重新建一个类,把除了叫之外所有方法都重写。这无疑造成了代码的冗余。
如果换成组合呢?我们定义了翅膀,腿,嗓子这些类。用这些类来组合一个类,此时之前的代码就可以重用了,我们在创建新的类时,只要传入自己需要的部件就可以(其实如果直接把鸟当成一个组件传进来也不是不行,在写方法时不用鸟叫)。这就是组合,has-a。重在了我们写过一次的东西可以多次利用。

但是组合又不是万能的,比如我们在一个方法传入Bird,如果使用组合方式就会导致各种各样的鸟类无法传进去。这时候is-a的想法又显得很重要了。这两种想法各有好坏。在具体使用中,个人觉得在小范围的进行组合,然后在大的概念上进行继承是不错的选择。

今天就这些吧,本人才疏学浅,如果存在什么纰漏还望各位大佬能够指正。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值