软件构造学习笔记-第六周

这周的重点是重载和重写。重载要求两方法的签名必须不同,而重写则要求两方法的签名必须相同。重载可以发生在同一个类中,也可以发生在父类和子类中;重写必须发生在父类和子类中。接口/抽象类不具有构造方法,只有将内部的抽象方法全部实现后的子类才能创造对象。每个子类都是父类,父类能做的事子类必须能做,还要做的更好。

ADT不变量替换前置条件

用ADT不变量取代复杂的前置条件,相当于将复杂的前置条件封装到ADT内部。如果对输入数据的检测代价较高,则将约束传递给用户,即前置条件。

接口

1.实际中更倾向于使用接口定义变量,因为对于接口的多种实现都满足条件。

2.接口中不能含有构造函数,因为接口不能被实例化。接口不能含有具体的实现(比如返回值不能为ArraySet类型)。
3.可以在接口中定义静态方法,在静态方法中返回实现接口的实例化对象。

继承、重载和重写

1.严格继承:子类只能添加新方法,不重写父类中的方法。
2.final修饰的类不可以被继承,final修饰的方法不能被重写,final修饰的属性不能被继承。
3.如果父类中的某个函数实现体为空,则说明其子类都具有这个功能,但是各有差异,没有共性,在每个子类中都需要重写。
4.用super调用父类中被重写的方法。在构造方法中调用父类的构造方法,super语句必须在第一句。
5.含有抽象方法的类是抽象类。接口是一种特殊的抽象类。
6.多态
特殊多态:相同的方法名,不同的参数列表或返回值类型(方法重载)。
参数化多态:泛型。
子类型多态:用接口(父类型)声明变量,用具体的实现赋值。
7.重载方法在编译阶段时决定具体调用哪个方法(静态类型检查),重写在运行时决定具体调用哪个方法(动态类型检查)。
8.重载必须有不同的参数列表;返回值、修饰词、异常可相同可不同;可以在本类或者子类中重载。
9.重载调用例子。具体调用哪个方法,取决于变量被声明的类型。
第二行:如果声明的是子类型,赋值也是子类型。方法调用时不满足子类方法参数要求,满足了父类方法参数要求,则调用父类方法。(重载时父类方法在子类中有备份)

10.重载和重写的区别

泛型

1.通配符:只能在使用时出现,不能在定义中出现。

2.运行时泛型会被擦除,不能使用instanceof()检查泛型种类。
3.不能创建泛型的数组。

子类型

1.子类型的规约不能弱化父类型的规约(从集合角度,子类是父类的真子集)。父类型能做的事子类型同样能做。
2.将子类型转化成父类型是安全的。因为任意的子类都是父类。

不可变类

1.写不可变类的要求
-没有mutator方法
-保证没有方法可以被重写
-成员域用private、final修饰
-防止表示暴露
-重写toString()、hashCode()、clone()、equals()等
2.一般将小的“值类型”设置成不可变类。如实验2的Position类、Piece类。

不可变类型的相等关系

1.相等是一种等价关系。等价关系的性质:自反、对称、传递。
2.用户角度:AF映射到同样的结果,则两个对象等价。
3.外部观察者角度:对两个对象调用任何相同的操作,都得到相同的结果,则认为两对象等价。
4.Java有两种操作判断相等:
-引用等价性(==)指向同一内存区域。一般用来判断基本数据类型。
-对象等价性(equals()),如果不被重写,和引用等价性相同。所以自定义ADT时要重写Object的equals。

5.尽量避免instanceof方法
重写equals方法时,使用继承避免调用instanceof

6.“相等”的对象,其hashCode()的结果必须相等。
7.哈希表工作原理
相等对象的哈希值一定相同,不同对象的哈希值可以相同,但是要尽量避免哈希冲突。

可变类型的相等关系

1.观察等价性:在不改变状态的情况下,两个对象是否看起来一致。
2.行为等价性:调用对象任何方法都展示出一致的结果。
3.可变类相等一般不需要重写equals方法,因为相等即意味着指向同一对象。
4.如果某个可变类对象包含在Set集合类中,当其发生改变时,集合类的行为不确定。就像照完身份证照片再整容。

重写equals方法参考:
List的contains()方法详解以及重写equals()方法时需要注意的地方

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/307232.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云原生时代,.NET5必将称王!

“ 随着互联网持续高歌猛进,相关技术名词也是层出不穷。微服务、容器化、DevOps、ServerLess、FaaS,这两年最火的,当属云原生Cloud Native!当下大部分企业还在追逐微服务架构落地,而下一代的架构云原生已如火如荼。程序…

软件构造学习笔记-实验2

P1 1.设计目标 首先对图的ADT进行两种实现(从边和顶点出发),然后选择一种实现的ADT,根据输入的文件构建语料库,再利用构建的语料库,对输入字符串进行插入操作,并返回修改后的字符串。 2.有关AF…

海棠读社小程序研发(.Net Core版)

今天这篇博文是介绍海棠读社小程序开发的技术博文,由于博主是技术出身,开发过小程序和公众号,所以从决定做海棠读社开始就写代码了。因为只有技术和文化相结合,更能使传统文化大放异彩,更好地传播、讲好中国故事。漓江…

软件构造学习笔记-第七周

本周只有一节课,内容较少。对于不可变类型的相等比较,需要重写equals和hashCode方法,实现观察等价性。对于可变类型,不建议重写以上两方法,按照默认比较方式(比较内存地址)即可。 可变类型的相…

asp.net core监控—引入Prometheus(五)

上一篇博文中说到Prometheus有四种指标类型:Counter(计数器)、Gauge(仪表盘)、Histogram(直方图)、Summary(摘要),并且我们做了一个Counter的Demo&#xff0c…

软件构造学习笔记-第八周

本周重点是Liskov可替换原则。它要求父类和子类的行为一致性,子类要有更强的不变量、更弱的前置条件、更强的后置条件。在该原则的要求下,每个子类都可以对父类进行替换。这在开发过程中会带来极大的便利,在实验3中学习并运用该原则。 有关复…

C# 中的只读结构体(readonly struct)

翻译自 John Demetriou 2018年4月8日 的文章 《C# 7.2 – Let’s Talk About Readonly Structs》[1]在本文中,我们来聊一聊从 C# 7.2 开始出现的一个特性 readonly struct。任一结构体都可以有公共属性、私有属性访问器等等。我们从以下结构体示例来开始讨论&#x…

软件构造学习笔记-第九周、第十周

因为本周五开始五一假期,所以只有一节软件构造课。因为内容还属于创建模式、结构模式、行为模式。将该堂课的内容整合到本博客中。本周的重点是程序开发模式,在写代码之前首先充分考虑采用哪种模式更有利于开发、维护。采用合适的设计模式帮助理清思路&a…

回顾 | 使用Visual Studio Code进行端到端应用程序开发

点击蓝字关注我们,获得更多课程吧~微软Reactor 为帮助广开发者,技术爱好者,更好的学习 Python,数据科学,机器学习,AI,区块链等技术,将每周三到周六,组织 3~5 场线上分享活…

软件构造学习笔记-第十一周

本周的内容是,比较各个设计模式的区别和联系,并介绍了状态模式和备忘录模式,以及正则表达式。正则表达式用于对文本文件的处理。在实验3中有一项要求是对输入文本进行解析,构造航班。要求表达式不仅要读入合法数据,还要…

实现 OutOfMemory​

通过代码实现 OutOfMemoryIntro来尝试写一个发生 OutOfMemoryException 的代码吧,开启煞笔代码第三篇 —— OutofMemoryOutOfMemoryOutOfMemory 顾名思义就是内存不足,在 .NET 中当内存不足的时候就会抛出 OutOfMemoryException 的异常。想要触发 OutOfM…

软件构造学习笔记-实验3

本次实验要求从五项要求(航班管理、高铁车次管理、操作系统进程管理、大学课表管理、学习日程管理)里完成三项要求,并且尽量实现复用。 面向可复用性和可维护性的设计:PlanningEntry 1.首先设计一个类CommonPlanningEntry来实现…

用 Span 对 C# 进程中三大内存区域进行统一访问 ,太厉害了!

一:背景 1. 讲故事前段时间写了几篇 C# 漫文,评论留言中有很多朋友多次提到 Span,周末抽空看了下,确实是一个非常????????的新结构,让我想到了当年的WCF,它统一了.NET下各种零散的分布式技术&#…

福利 | 全网疯传免费领,一整套算法课程,拿走不谢!

算法对于程序员而言,到底有多重要,这已经是一个老生常谈的话题了。我看过很多有潜力且非常努力的程序员,在进阶高级工程师或架构师的路上,栽在了“算法”上,说实话,我并不意外。如果说得功利和实际一些&…

软件构造学习笔记-第十二周

本周介绍了异常以及异常的处理。Java的异常机制将处理异常的代码整合到一个代码块中,而不是通过if-else进行处理,提高了代码整体的简洁性。同时,异常机制可以更加详细地说明错误类型、引起错误的位置、错误信息,对程序健壮性十分有…

C#中LINQ与数据管道

假如有一个集合,里面有数字1-10,现在想实现从这10个数字中取出偶数数字,然后将得到的偶数乘以10,最后输出前三个。代码如下:代码非常的简单,最后会得到20、40、60这三个数字,但结果并不是我们今…

软件构造学习笔记-实验4

磕磕绊绊也算是完成了最后一个实验。记录一下实验中遇到的问题。 IDEA中SpotBugs的安装和使用 从网上找教程,都说IDEA没有使用版权。结果我直接在插件中就找到了。点击安装并重启即可。 使用时,选择需要操作的项目/包/类点击右键,就能看到S…

使用ML.NET模型生成器来完成图片性别识别

什么是ML.NET?ML.NET 使你能够在联机或脱机场景中将机器学习添加到 .NET 应用程序中。借助此功能,可以使用应用程序的可用数据进行自动预测。机器学习应用程序利用数据中的模式来进行预测,而不需要进行显式编程。ML.NET 的核心是机器学习模型…

软件构造学习笔记-第十四周、十五周

课程进入了尾声。本周内容主要是线程安全相关。线程错误比一般的错误更加难以发现和修改,甚至加入一条print语句就能改变时间分片,从而导致错误消失。重点介绍了“锁”的机制,在使用时避免对整个方法进行lock,而是对可能发生线程不…

打爆你的 CPU

通过一段代码打爆你的 CPUIntro这是这个煞笔代码系列的最后一篇——Full CPU,相对来说也比前面三个简单一些,没有那么多的知识点。今天来尝试写一段代码,把 CPU 打满,让所有处理器的 CPU 使用率达到 100%,Lets do it.如…