第八章 多态(下)

【即插即用模块】注意力篇 | TGRS 2025 | MFA聚特征+HPDown保细节+HFF融层级,三大模块各司其职,性能翻倍! 本文介绍了MTMLNet网络中的三大核心模块:MFA(多阶段特征聚合)、HPDown(混合池化下采样)和HFF(分层特征融合)。MFA通过双尺度深度卷积和注意力机制增强特征提取能力;HPDown结合平均池化和最大池化,有效保留下采样过程中的特征信息;HFF采用三注意力机制实现自适应特征融合。这三个模块协同工作,在红外小目标检测与分割任务中取得了SOTA效果。实验表明,各模块在特征提取、信息保留和融合方面均优于传统方法,可灵活应用于各类视觉任务中。 阅读详情

           第八章    多态(下)

         本章多态目前就到此介绍完毕,可能还会有些疑问,不过后面还会有很多设计到多态的地方,通过不断学习,最后一定会将这些知识掌握的。同时这一章所讲解的知识也还是比较详细的,多态基本上都会在我们的代码中体现出来,只是之前不知道,不明白而已。

8.4  协变返回类型
      Java SE5中添加了协变返回类型,它表示在导出类中的被覆盖方法可以返回基类方法的返回类型的某种导出类型:
       class Grain{
     public String toString(){
          return "Grain";
     }
}
class Wheat extends Grain{
     public String toString(){
          return "Wheat";
     }
}
class Mill{
     Grain process(){
          return new Grain();
     }
}
class WheatMill extends Mill{
     Wheat process(){
          return new Wheat();
     }
}
public class CovariantReturn {
     public static void main(String[] args) {
          Mill m=new Mill();
          Grain grain = m.process();
          System.out.println(grain);
          m=new WheatMill();
          grain=m.process();
          System.out.println(grain);
     }

}
运行结果:
Grain
Wheat
 
Java SE5与Java较早版本之间的主要差异就是较早的版本将强制process()的覆盖版本必须返回Grain,而不能返回Whear,尽管Wheat是从Grain导出的,因而也应该是一种合法的返回类型。协变返回类型允许返回更具体的Wheat类型。

8.5  用继承进行设计
      学习了多态之后,看起来似乎所有的东西都可以被继承,因为多态是一种如此巧妙的工具。事实上,当我们使用现成的类来建立新类时,如果首先考虑使用继承技术,反倒会加重我们的设计负担,使事情变得不必要地复杂起来。
      更好的方式是首先选择“组合”,尤其是不能十分确定应该使用哪一种方式时。组合不会强制我们的程序设计进入继承的层次结构中。而且,组合更加灵活,因为它可以动态选择类型(因此也就选择了行为);相反,继承在编译时就需要知道确切的类型。下面举例说明这一点:
     class Actor{
     public void act(){}
}
class HappyActor extends Actor{
     public void act(){
          System.out.println("HappyActor");
     }
}
class SadActor extends Actor{
     public void act() {
          System.out.println("SadActor");
     }
}
class Stage{
     private Actor actor= new HappyActor();
     public void change(){
          actor=new SadActor();
     }
     public void performPlay(){
          actor.act();
     }
}
public class Transmogrify {
     public static void main(String[] args) {
          Stage stage = new Stage();
          stage.performPlay();
          stage.change();
          stage.performPlay();
     }
}
运行结果:
HappyActor
SadActor

        一条通用的准则是:“用继承表达行为间的差异,并用字段表达状态上的变化”。在上述例子中,两者都用到了:通过继承得到了两个不同的类,用于表达act()方法的差异;而Stage通过运用组合使自己的状态发生变化。在这种情况下,这种状态的改变也就产生了行为的改变。

8.5.1  纯继承与扩展
         采取“纯粹”的方式来创建继承层次结构似乎是最好的方式。也就是说,只有在基类中已经建立的方法才可以在导出类中被覆盖,如下图所示:
          
        这被称作是纯粹的“is-a”(是一种)关系,因为一个类的接口已经确定了它应该是什么。继承可以确保所有的导出类具有基类的接口,且绝对不会少。按上图那么做,导出类也将具有和基类一样的接口。
         也可以认为这是一种纯替代,因为导出类可以完全代替基类,而在使用它们时,完全不需要知道关于子类的任何额外信息。也就是说,基类可以接受发送给导出类的任何消息,因为二者有着完全相同的接口。我们只需从导出类向上转型,永远不需知道正在处理的对象的确切类型。所有这一切,都是通过多态来处理。

8.5.2  向下转型与运动时类型识别
       由于向上转型(在继承层次中向上移动)会丢失具体的类型信息,所以我们就想,通过向下转型——也就是在继承层次中向下移动——应该能够获取类型信息。然而,我们知道向上转型是安全的,因为基类不会具有大于导出类的接口。因此,我们通过基类接口发送消息保证都能被接受。但对于向下转型,例如,我们无法知道一个“几何形状”它确实就是一个"圆",它可以是一个三角形、正方形或其他一些类型。
      要解决这个问题,必须有某种方法来确保向下转型的正确性,使我们不致于贸然转型到一种错误类型,进而发出该对象无法接受的消息。这样做是及其不安全的。
     在某些程序设计语言(如C++)中,我们必须执行一个特殊的操作来获得安全的向下转型。但是在Java语言中,所有转型都会得到检查!所以即使我们只是进行一次普通的加括弧形式的类型转换,在进入运行时期仍然会对其进行检查,以便保证它的确是我们希望的那种类型。如果不是,就会返回一个ClassCastException(类转型异常)。这种在运行检查的行为称作“运行时类型识别”(RTTI).下面的例子说明RTTI的行为:
     class Useful{
     public void f(){}
     public void g(){}
}
class MoreUseful extends Useful{
     public void f(){     }
     public void g(){}
     public void u(){}
}
public class RTTI {
     public static void main(String[] args) {
          Useful[] x={new Useful(),new MoreUseful()};
          x[0].f();
          x[1].g();
//       x[1].u();                           The method u() is undefined for the type Useful
//       (MoreUseful)x[1].u();       Downcast/RTTI
//       (MoreUseful)x[0].u();       Exception thrown
     }

}
       正如前一个示意图中所示,MoreUseful(更有用的)接口扩展了Useful(有用的)接口;但是由于它是继承而来的,所以它也可以向上转型到Useful类型。我们在main()方法中对数组X进行初始化时可以看到这种情况的发生。既然数组中的两个对象属于Useful类,所以我们可以调用f()和g()这两个方法。如果我们试图调用u()方法(它只存在于MoreUseful),就会返回一条编译时出错消息。
      如果想访问MoreUseful对象的扩展接口,就可以尝试进行向下转型。如果所转类型是正确的类型,那么转型成功;否则,就会返回一个ClassCastException异常。我们不必为这个异常编写任何特殊的代码,因为它指出的是程序员在程序中任何地方都可能会犯的错误。{Throws Exception}注释标签告知本书的构建系统:在运行该程序时,预期抛出一个异常。

RK3399外设驱动之MIPI RK3399外设驱动之MIPI 文章目录RK3399外设驱动之MIPIMIPI命令解析入口代码mipi显示配置实例rk3399mipi驱动rk mipi驱动注册过程rk32_mipi_dsi.c解析 内核版本 Linux4.4 平台 rk3399 作者 nineyole MIPI命令解析入口代码 MIPI的入口代码如下:kernel\drivers\video\rockchip\screen\lcd_mipi.c static int __init rk_mipi_screen_in 阅读详情

相关推荐

【全开源】教育培训微信小程序源码(FastAdmin+ThinkPHP+Unipp)

教育培训微信小程序源码以其便捷性、互动性、安全性等优势,成为了教育培训行业的新宠。随着移动互联网技术的不断发展,教育培训微信小程序源码将继续引领未来学习趋势,为学员提供更加优质、高效的学习体验。同时,教育培训机构也应积极拥抱小程序技术,利用源码打造具有自身特色的学习平台,提升品牌影响力和市场竞争力。

2401_84414018的博客 2095

第八章 多态

文章目录1.向上转型2.转机方法调用绑定(2) 前期绑定(3) 后期绑定(动态绑定/运行时绑定)产生正确行为可拓展性缺陷:“覆盖”私有方法缺陷:域和静态方法3.构造器和多态构造器的调用顺序继承与清理构造器内部的多态方法的行为4.协变返回类型5.用继承进行设计用继承表达行为之间的差异,并用字段表状态上的变化纯继承与拓展向下转型与运行时类型识别 1.向上转型 把对某个对象的引用视为对基类型的的引用(例如:Wind继承于Instrument,在需要传递Instrument类型的时候,也可以传递Wind对象代替

小名同学 22万+

Android 13 Hotseat定制化修改——001 hotseat布局方向

一.背景由于需求是需要自定义修改Hotseat,所以此篇文章是记录如何自定义修改hotseat的,应该可以覆盖大部分场景,修改点有修改hotseat布局方向,hotseat图标数量,hotseat图标大小,hotseat布局位置,hotseat图标禁止形成文件夹,hotseat图标禁止移动到Launcher...

Java_fenxiang的博客 1101

C++第八章:多态性

面向对象的可以分为4类:重载多态、强制多态包含多态和参数多态。前面两种统称为专用多态,而后面两种称为通用多态。包含多态是类族中定义于 不同类中的 同名成员函数 的多态行为,主要是通过来实现。

weixin_71751116的博客 1531

OAK-D-Pro深度解析:从硬件融合到全天候SLAM实战

本文深度解析OAK-D-Pro硬件架构及其在SLAM领域的实战应用。作为SLAM的"六边形战士",OAK-D-Pro融合主动双目摄像头、结构光投射器、6轴IMU等传感器,实现全天候稳定工作。通过实测数据展示其在弱纹理环境、动态光照等复杂场景下的卓越表现,并提供SLAM实战技巧与开发指南,帮助开发者快速部署高效SLAM解决方案。

weixin_27244795的博客 183

MIKE21 教程 3.2 随空间变化的网格文件制作(.dfsu文件制作) 曼宁值网格文件制作

上一节讲解了如何制作时间序列文件。本节讲解如何制作仅随空间变化的文件。 目录 1 数据准备 1.1 基于地形设置 1.2 基于地形水深设置: 2 数据导入 3 数据导出

Hello Word 3940

《Java编程思想》读书笔记:第八章 多态

来为每种特殊类型的几何形状提供单独的行为。RandomShapeGenerator是一种“工厂”(factory),在我们每次调用next()方法时,它可以为随机选择的Shape对象产生一个引用。

Mr_Kian的博客 822

QGis软件 —— 2、QGis加载在线地图两种方式(谷歌地图、天地图)

QGis软件 —— 2、QGis加载在线地图两种方式(谷歌地图)

1万+

thinking in java 笔记 思维导图 第八章 多态

mythling的专栏 602

Hermes 教程 03:Skills 系统

摘要:Hermes Skills是一种自我改进机制,可将解决问题的经验保存为可复用技能文档。v0.13.0版本遵循agentskills.io开放标准,与Claude Skills互通。技能创建流程包括发现问题、创建技能文件、加载使用和优化更新四个阶段。系统提供技能检索和自维护机制(Curator),支持技能媒体路由和多种管理命令。内置技能涵盖开发调试、创意头脑风暴等场景,通过积累技能使Hermes更适应用户需求。

程序猿_三产 725

56、Cortex - M33处理器浮点单元(FPU)的使用与优化

本文详细介绍了Cortex-M33处理器浮点单元(FPU)的使用与优化方法,涵盖单双精度浮点计算的选择、编译器命令行配置、ABI模式对比、特殊FPU模式设置(如Flush-to-Zero、Default NaN)、浮点异常处理机制以及FPU电源管理策略。结合代码示例和流程图,提供了在不同应用场景下的最佳实践建议,并总结了常见问题及解决方案,帮助开发者提升嵌入式系统中浮点运算的性能、精度与能效。

bread的博客 153

第八章:多态

第八章:多态 基类 base = new 子类 ==> base引用指向子类对象,时基类类型 class Instrument { public void play(Note n) { print("Instrument.play()"); } } public class Wind extends Instrument { // Redefine inter...

jue6628的博客 189

如何对TBSS的结果进行统计学的分析,已完成置换检验,如何在最终的TBSS输出结果提取除具体值及如何做进一步相关性分析??

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值。

**My Coding Family** 1437

第八章.多态 什么是多态

导语 输入错误的数字,如何得到正确的结果呢 方法调用tune(Instruments i)  tune(wind)多态通过分离做什么和怎么做,从另一个角度讲接口和实现分离开来。接口就是公开调用的方法,而实现就是具体的方法, 父类(或抽象类,或inteface接口)来声明做什么,子类来实现怎么做。封装 通过合并特征和行为来创建新的数据类型。实现隐藏则通过将细节“私有化”把接口和实现分离开来。

sinat_32955803的博客 566

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

JavaSE 第八章 多态

1.多态 生活中的多态:不同类型的打印机打印效果不同。 同一种事物,由于条件不同,产生的结果也不同 生活中的多态:同一个引用类型,使用不同的实例而执行不同操作 父类的类型指向子类的实例 实现多态的方式称为--动态绑定 指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。 多态的两种表现形式—重载与重写 多态的必要条件: 要有继承 要有重写 父类的引用指向子类对象 父类更通用,子类更具体 Pet pet = new Dog(); Pet pet = new Cat

技术小白 507

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java学习:第八章多态

Win类“向上转换成”player类。

生物医学工程学生的博客 1145

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

第八章 继承和多态

成员方法没有同名时,在子类方法中或者通过子类对象访问方法时,则优先访问自己的,自己没有时再到父类中找,如果父类中也没有则报错。

weixin_45698983的博客 1224

第八章多态

1、多态不但能够改善代码的组织结构和可读性,还能够创建可扩展的程序。 2、“封装”通过合并特征和行为来创建新的数据类型。“实现隐藏”则通过将细节“私有化”把接口和实现分离开来。 3、多态的作用是消除类型之间的耦合关系。 4、继承允许将对象视为它自己本身的类型或其及类型来加以处理。它允许将多种类型(从同一基类导出的)视为同一类型来处理,而同一份代码也就可以毫无差别的运行在这些不同类型之上了。 ...

进阶的小程媛儿 305
上一篇: 第八章 多态(上)
下一篇: Findbugs工具的安装和使用
OODeveloper
博客等级 码龄12年 43粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值