Java继承与组合

重新认识java(四) — 组合、聚合与继承的爱恨情仇 有人学了继承,认为他是面向对象特点之一,就在所有能用到继承的地方使用继承,而不考虑究竟该不该使用,无疑,这是错误的。那么,究竟该如何使用继承呢? 阅读详情

参考资料

[1]. 疯狂Java讲义(第三版) 李刚

继承与组合

继承是实现类复用的重要手段,但继承带来了一个最大的坏处,破坏封装。相比之下,组合也是实现类复用的重要方式,而采用组合方式来实现类复用则能提供更好的封装性。

使用继承的注意点

为了保证父类有良好的封装性,不会被子类随意改变,设计父类通常应该遵循如下规则:
1. 尽量隐藏父类的内部数据。例如成员变量使用private修饰。
2. 不要让子类可以随意访问、修改父类的方法。例如父类中作为辅助和工具的方法设置为private;需要被外部类调用,又不希望被修改的方法,使用final修饰符;希望被重写,又不希望被其他类访问,则可以使用protected修饰符。
3. 尽量不要在父类中调用将要被子类重写的方法。
如果在子类中重写了父类在构造器中调用的方法,那么在实例化的时候父类会调用子类的重写的扩展方法。代码如下:

/**
 * 父类
 */
public class Base {
    /**
     * 构造器
     */
    public Base()
    {
        test();
    }

    public void test()           // ①号test()方法
    {
        System.out.println("将被子类重写的方法");
    }
}

子类


/**
 * 子类
 */
public class Sub extends Base{
    private String name;

    /**
     * 因为继承了父类
     * 所以父类在构造器中会调用此方法
     */
    public void test()         // ②号test()方法
    {
        System.out.println("子类重写父类的方法,"
                + "其name字符串长度" + name.length());
    }
    public static void main(String[] args)
    {
        // 下面代码会引发空指针异常
        // 直接父类会调用被子类重写的test方法
        Sub s = new Sub();
    }
}

类图如下:
这里写图片描述

利用组合实现复用

如果需要复用一个类,除了把这个类当成基类来继承之外,还可以把该类当成另一个类的组合成分,从而允许新类直接复用该类public方法。不管是继承还是组合,都允许在新类(对于继承就是子类)中直接复用旧类的方法。
Animal、Wolf、Bird三个类的代码如下:

class Animal
{
    private void beat()
    {
        System.out.println("心脏跳动...");
    }
    public void breath()
    {
        beat();
        System.out.println("吸一口气,吐一口气,呼吸中...");
    }
}
// 继承Animal,直接复用父类的breath()方法
class Bird extends Animal
{
    public void fly()
    {
        System.out.println("我在天空自在的飞翔...");
    }
}
// 继承Animal,直接复用父类的breath()方法
class Wolf extends Animal
{
    public void run()
    {
        System.out.println("我在陆地上的快速奔跑...");
    }
}
public class InheritTest
{
    public static void main(String[] args)
    {
        Bird b = new Bird();
        b.breath();
        b.fly();
        Wolf w = new Wolf();
        w.breath();
        w.run();
    }
}

类图如下:
这里写图片描述

现在使用组合的方式重写上面的类。



/**
 * Description:
 * <br/>网站: <a href="http://www.crazyit.org">疯狂Java联盟</a>
 * <br/>Copyright (C), 2001-2016, Yeeku.H.Lee
 * <br/>This program is protected by copyright laws.
 * <br/>Program Name:
 * <br/>Date:
 * @author Yeeku.H.Lee kongyeeku@163.com
 * @version 1.0
 */
class Animal
{
    private void beat()
    {
        System.out.println("心脏跳动...");
    }
    public void breath()
    {
        beat();
        System.out.println("吸一口气,吐一口气,呼吸中...");
    }
}
class Bird
{
    // 将原来的父类组合到原来的子类,作为子类的一个组合成分
    private Animal a;
    public Bird(Animal a)
    {
        this.a = a;
    }
    // 重新定义一个自己的breath()方法
    public void breath()
    {
        // 直接复用Animal提供的breath()方法来实现Bird的breath()方法。
        a.breath();
    }
    public void fly()
    {
        System.out.println("我在天空自在的飞翔...");
    }
}
class Wolf
{
    // 将原来的父类组合到原来的子类,作为子类的一个组合成分
    private Animal a;
    public Wolf(Animal a)
    {
        this.a = a;
    }
    // 重新定义一个自己的breath()方法
    public void breath()
    {
        // 直接复用Animal提供的breath()方法来实现Wolf的breath()方法。
        a.breath();
    }
    public void run()
    {
        System.out.println("我在陆地上的快速奔跑...");
    }
}
public class CompositeTest
{
    public static void main(String[] args)
    {
        // 此时需要显式创建被组合的对象
        Animal a1 = new Animal();
        Bird b = new Bird(a1);
        b.breath();
        b.fly();
        // 此时需要显式创建被组合的对象
        Animal a2 = new Animal();
        Wolf w = new Wolf(a2);
        w.breath();
        w.run();
    }
}

类图如下所示:
这里写图片描述

步进电机原理及梯形加速算法 步进电机重理解与梯形加速算法 阅读详情

相关推荐

实测有效!易灵思FPGA工程如何正确配置Efinity+Modelsim仿真环境

本文详细介绍了易灵思FPGA工程中如何高效配置Efinity与Modelsim联合仿真环境,包括软件版本匹配、系统环境变量设置、工程文件结构优化及仿真脚本深度优化等实战经验。通过实测数据验证,该方案可显著提升仿真效率,适用于不同规模的设计验证,帮助工程师快速搭建稳定高效的联仿环境。

m2n3b4v5c6的博客 405

java实体对象合并方法

在实际的开发工作中java对象合并还是比较实用的的一个功能,尤其是在牵扯到数据的更新和业务对象之间的转换的时候更是必要。在这里给大家分享一下我常用的合并对象的方法。 这个方法的逻辑就是以数据源对象的值为主进行更新的,对双方对象的顺序和数量没有要求,但是两个属性的名称必须一致。...

weixin_43829645的博客 6411

openEuler在虚拟机的网络配置

ethernet0.virtualDev 可以配置成其他类型的虚拟网络适配器。常见的选项包括:vlance - 用于模拟 AMD PCnet32 LANCE 网络适配器,支持10Mbps。e1000 - 用于模拟 Intel E1000 千兆网络适配器,支持1Gbps。e1000e - 用于模拟更现代的 Intel E1000e 千兆网络适配器。vmxnet - 用于 VMware 的自定义网络适配器,性能更好但需要安装 VMware Tools。

FHY1221的博客 2933

Java——继承和组合

java的重要特点——继承,快来学习!!!

2301_81375781的博客 1743

实战:如何用MIPI CSI-2高效传输RAW10图像数据(附带宽优化技巧)

本文深入探讨了MIPI CSI-2协议在RAW10图像数据传输中的高效应用,详细解析了4像素5字节打包机制及其带宽优化技巧。通过动态Lane分配、位深度自适应压缩和虚拟通道交错传输等实战方法,显著提升传输效率,适用于IoT摄像头开发等低功耗场景。

css33的专栏 732

「深度学习之优化算法」笔记(二)优化算法的分类

但是由于生物的局限性,人们所创造出的算法也会有局限性:我们所熟知的生物都生存在三维空间,在这些环境中,影响生物生存的条件比较有限,反应到算法中就是这些算法在解决较低维度的问题时效果很好,当遇到超高维(维度>500)问题时,结果可能不容乐观,没做过实验,我也不敢乱说。当然,他们的目的不是在最佳狩猎位置集合,他们的目的是在过去的途中看是否能发现更加好的狩猎位置,去往已经到过的狩猎地点再次狩猎是没有意义的,因为每个位置获取食物的难易程度是固定的。如果他们的策略是“不跟随最优解”,那么他们的策略是什么呢?

quanzhan_King的博客 1371

继承与组合(Java详解)

继承,super,组合,重写,转型

m0_61359105的博客 2094

9、工业数据管理:Historian、ERP、MES与资产模型解析

本文深入解析了工业数据管理中的核心概念与技术,包括Historian数据库、ERP和MES系统以及资产模型。文章详细介绍了Historian数据库的特性、架构分类、数据采集方式及时间序列处理能力,同时探讨了ERP和MES系统的功能与优势,特别是MES在生产执行中的重要作用。资产模型部分结合ISA-95和ISA-88标准,阐述了工业资产的层次化建模方法。此外,文章还分析了各系统之间的协同关系、面临的挑战及应对策略,并展望了未来工业数据管理的发展趋势,如云原生技术、人工智能融合和工业物联网的应用。

pz89012345的博客 144

java组合 继承_Java组合与继承

在本小节中,我们将学习java多重继承,比较组合和继承。java中的多重继承是创建具有多个超类的单个类的功能。与其他一些流行的面向对象编程语言(如C++)不同,java不支持类中的多重继承。Java不支持一个类中的多个继承,因为它可能产生一些问题(钻石问题),Java有更好的方法可以实现与多重继承相同的结果。1. Java中的钻石问题为了方便理解钻石问题,首先假设java中支持多个继承。在这种情况...

weixin_42356378的博客 348

索尼IMX316 标定_ToF模块相机校准

很多东西一开始给出去的并不是最优的方案,而是在客户端支持中,以及在持续不断的芯片验证中,发现还可以这么做,还能够再提升Sensor的性能,所以说这是一个持续的过程。曾经听说过一个故事,在某厂里ST产品一直作为第一供应商多年,然后近段时间即将被新兴公司的ToF产品所打败,性能报告已经出来,但是ST并没有更新产品,而是在原有产品更新了固件以及标定流程,此时产品的性能又是超越其他供应商的产品。相机矩阵不考虑镜头失真,因为理想的针孔相机没有镜头。为了准确地代表一个真实的相机,相机模型包括径向和切向的镜头畸变。

dream it possible 1155

请举手回答,LDO和DC-DC有什么不同?

文章目录1 LDO是什么2 LDO典型电路3 DC-DC是什么4 DC-DC典型电路5 LDO和DC-DC区别10.2.6 小结一下 大家好,我是记得诚。 DC-DC和LDO都是电源芯片,两者差异很大,用法也不同,这篇博客讲述LDO和DC-DC的一些差异,帮助更好的认识LDO和DC-DC并进行选型。 1 LDO是什么 LDO是low dropout regulator的简称,即低压差线性稳压器,这是相对于传统的线性稳压器来说的,传统的稳压器,输入比输出要高出很多,否则无法工作,LDO可能输入比输出高1~2V

记得诚 1万+

java组合 继承_Java中的继承与组合

本文主要说明Java中继承与组合的概念,以及它们之间的联系与区别。首先文章会给出一小段代码示例,用于展示到底什么是继承。然后演示如何通过“组合”来改进这种继承的设计机制。最后总结这两者的应用场景,即到底应该选择继承还是组合。1、继承假设我们有一个名为Insect(昆虫)的类,这个类包含两个方法:1)移动move(); 2)攻击attack()。代码如下:现在,你想要定义一个名为Bee(蜜蜂)的类。...

weixin_33835368的博客 539

Arcgis使用NDVI值遥感反演叶面积指数(LAI)

经验模型反演操作不难,主要是要多看文献,了解公式。本文中的公式我也不清楚是哪个作物的NDVI和LAI的关系(别人提供的),继续看文献整理吧。后续会在下面罗列更新一下主要公式。

所有专家都曾始于新手 8430

Java组合与继承

前言 注:本文内容总结自Java编程思想第7章。 复用代码是Java众多引人注目的功能之一。 此方法的窍门在于使用类而不破坏现有的程序代码。有两种达到这一目的的方法: 1.在新的类中产生现有类的对象。由于新的类是由现有类的对象所组成,所以这种方法称为组合。该方法只是复用了现有程序代码的功能,而非它的形式。 2.按照现有的类型来创建新类。无需改变现有类的形式,采用其形式并在其中添加新代码。这种神奇的...

lecoboy的博客 5398

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java可以多重继承吗_Java中的多重继承与组合vs继承

java可以多重继承吗 有时我写了几篇有关Java继承,接口和组成的文章。 在这篇文章中,我们将研究多重继承,然后了解组成优于继承的好处。 Java中的多重继承 多重继承是创建具有多个超类的单个类的能力。 与其他一些流行的面向对象的编程语言(例如C ++)不同, java不提供对类中多重继承的支持。 Java不支持类中的多重继承,因为它可能导致钻石问题,而不是提供一些复杂的方法来解决它,而是有更...

cunfeng7797的博客 4015

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java中继承与组合的区别

组合和继承是Java中实现系统功能的重用和代码的复用的两种方式。两者在实现和使用上存在一些区别: 区别1、在类之间的关系上,继承强调的是is-a的关系,即子类是父类的一种,例如:人和动物,人是动物的一种,那么人和动物之间就存在继承的关系,人为子类,动物为父类。而组合强调的是have-a的关系,即类内部被使用的那个类是该类所拥有的东西,例如:人和心脏,心脏为人所拥有的东西,那么人和心脏之间就存在组合的关系,在人这一个类的内部可以定义一个心脏类型的变量。 区别2、子类继承父类后,父类的所有属性和方法都可以被子类

damon000的博客 2279

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java继承与组合详解

1、详细讲解继承中出现的各种问题 2、了解继承和组合的用法和区别

2303_76875404的博客 880

java中为什么要少用继承多用组合

最近的接收的一套代码,真是吐血,我在代码审查的时候发现系统代码一大堆问题,阅读起来非常艰涩难懂,主要是系统代码中使用了大量得到继承,什么都是继承。而且是嵌套多层。这种设计真的很垃圾。继承在代码中本来是好事,但是用的多了就是坏事了,特别是嵌套层次多的继承。

JAVA领域优质创作者,基于分片网络查询方法专利发明者。 1786

Java 编程中的组合与继承:为何建议多用组合少用继承?

在 Java 编程中,建议多用组合少用继承,这是基于软件设计原则和实际应用经验的最佳实践。组合提供了更好的灵活性、松耦合和易于维护的代码结构,而继承虽然提供了代码复用和多态性,但也带来了强耦合和脆弱基类问题。理解组合与继承的优缺点,并在实际编程中灵活应用,有助于编写更健壮、可维护和可扩展的代码。希望通过本文的详细解释和代码示例,你已经对组合与继承的优缺点及实际应用有了更深入的理解。如果你有任何问题或需要进一步的解释,请随时提问!

xycxycooo的博客 948

java组合与继承始示例_Java示例中的组合

java组合与继承始示例Composition in java is the design technique to implement has-a relationship in classes. We can use java inheritance or Object composition in java for code reuse. Java中的组合是在类中实现has-a关系的设计技术...

从零开始的教程世界 456

Java SE继承和组合

继承和组合 JavaSe

m0_54470078的博客 1539

java的组合与继承_java的组合和继承

其实我第一次学习java 的时候根本没有听说过组合这个名词,老师也更没有讲解过,我一直以为是我自己落掉了什么知识点,其实不是的,组合这个名词暂且把它定义为一个思维性的东西吧,相信读者都接触过了,但是并不知道它还有这个名字。其实所谓的组合就是创建一个新类去调用已经创建并且调试好的类,那么这个新类就可以把它叫做是一个组合例如我创建一个Peoplepublic class People {private...

weixin_34479122的博客 210

Java 继承和组合

总结:成员⽅法没有同名时,在⼦类⽅法中或者通过⼦类对象访问⽅法时,则优先访问⾃⼰的,⾃⼰ 没有时再到⽗类中找,如果⽗类中也没有则报错。为Animal的⼦类/派⽣类,继承之后,⼦类可以复⽤⽗类中成员,⼦类在实现时只需关⼼⾃⼰新增加的成员即可。通过派⽣类对象访问⽗类与⼦类同名⽅法时,如果⽗类和⼦类同名⽅法的参数列表不同(重载),根。在继承体系中,⼦类将⽗类中的⽅法和字段继承下来了,那在⼦类中能否直接访问⽗类中继承下的。通过⼦类对象访问⽗类与⼦类中不同名⽅法时,优先在⼦类中找,找到则访问,否则在⽗类中找,

2402_88652615的博客 927

java组合 继承_java的继承与组合的区别

java的继承与组合的区别继承和组合的概念在新类里简单地创建原有类的对象。我们把这种方法叫作“组合”,因为新类由现有类的对象合并而成。我们只是简单地重复利用代码的功能,而不是采用它的形式。第二种方法是创建一个新类,将其作为现有类的一个“类型”。我们可以原样采取现有类的形式,并在其中加入新代码,同时不会对现有的类产生影响。这种魔术般的行为叫作“继承”(Inheritance),涉及的大多数工作都是由...

weixin_39822184的博客 231

java组合 继承_Java继承和组合

为了保证父类有良好的封装性,不会被子类随意修改,设计父类通常应该遵循以下规则:1、尽量隐藏父类的内部数据,尽量把父类的所有成员变量设置为 private 访问类型,不要让子类直接访问父类的成员变量;2、不要让子类可以随意访问和修改父类方法,父类中仅为辅助其他工具的方法,应该使用private访问控制符修饰,让子类无法访问该方法;如果父类中的方法需要被外部类调用,则必须设置为 public 修饰...

weixin_35985795的博客 146
上一篇: Java多态
下一篇: Java初始化块
lamp113
博客等级 码龄11年 16粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值