学校的白色咖啡屋(一):继承的根基与扩展的自由 Inheritance Implement Any

为了加强记忆,诗忆总会整理前一晚的笔记。

「可是,要怎麽确保每个类别都有toString()函式呢?」窗上映着女孩百思不解的脸。「之前学姐写的自定义类别也没看到这个函式呀。」

笔电在诗忆的操作下跑了一个简单的程序。

fun main() {
    println(Empty())
}
class Empty

「嗯⋯⋯就连空的class都有toString(),虽然出来的是诡异的结果Empty@5b2133b1,我记得学姐说小老鼠符号後是物件存放的记忆体位置。那我用昨天学的函式搜寻法,看看空的class有哪些函式。」

结果浮出了三个方法,equals()hashCode()toString()
其中hashCode()印出的值是1528902577

「我的第六感和我说toString()的值和hashCode()的值有关系。啊,5b2133b1的十六进位转换成十进位不就是1528902577吗!」

她找到了答案,非常开心。等不及到晚上的授课时间就联络了唯心,相约在学校的白色咖啡屋见面。

一见到唯心之後,诗忆就迫不急待的分享她的发现。

「对唷,所有的类别都继承了Any类别,这三个方法就是Any类别提供的,反过来说,Any类别就是所有类别的先祖superclass。」唯心看着女孩因自己肯定的话语露出更加开心的笑容,嘴角也浮出浅浅的笑意。「这些继承来的函式是可以覆写的,如果已经被覆写还想呼叫先祖的函式内容,就用super.开头,和superclass这个名字呼应着,很好记唷。」

「所有函式都可以覆写吗?」诗忆问。

「可继承的类别只有两种,open classabstract class,前者和一般的类别没有差别,只需要在开放覆写的函式也加上open,後者的函式则是加上abstract。还有一个不是类别但可以覆写的存在——介面interface,里面的函式什麽都不用加就可以开放覆写。」唯心想了想又诚实的加上一句。「他们三者的用途差异很多人都难以分清呢。」

「⋯⋯」诗忆觉得自己就是其中一员。

看着女孩呆呆傻傻的样子,唯心噗哧一笑,忍不住捏了捏她的脸。「你还有我呢。」

interface最常被使用的原因是,相对於一个类别一次只能选择一个可继承类别作为根基继承,interface却可以同时扩展好几个,自由度高。而open classabstract class的分别主要在於後者不能实体化,只负责让其他类别继承。而拿实际的东西来举例的话——」就在她烦恼哪个例子比较好说明时,一只优雅的猫咪跳进她的怀里。

「学姐我想摸摸猫咪。」诗忆说着就小心地挪动步子靠过去。

猫咪趴在唯心的膝盖上,懒洋洋地看了一眼诗忆,没有避开她的手。

等诗忆满足的回到她的座位後,唯心才继续刚刚的话题。「以手机为例,abstract class是主机板,要等外壳和其他零件装上後才能出售;open class是已经可以出售的手机,但提供客制化容量的选择;interface是各种配件,如耳机一般能搭配手机也能搭配电脑,但单独存在时没有办法使用。」


<<:  2.1 Design System - 制作的工具

>>:  Day 22 - 谈谈我对Android的兴趣

Day29-介接 API(四)Laravel 实作 Dialogflow ES 之 API interactions

大家好~ 今天来实作下图架构的简单版吧! 申请服务帐户 选择一个 Dialogflow 的 Agen...

Day27-好用的网页服务器-nginx(三)

前言 昨天的文章讲完前端 Nginx 的写法後,今天就要来进入後端的写法啦!在昨天的小结提到後端的写...

Day-15 RAID

RAID tags: IT铁人 这个硬碟有多棒 在评断一个硬碟有多高的Availability时,我...

自动化测试,让你上班拥有一杯咖啡的时间 | Day 29 - cypress 最佳实践

此系列文章会同步发文到个人部落格,有兴趣的读者可以前往观看喔。 选取元素 ⚠️ 避免使用会常常变的s...

EP23 - [TDD] OrderPayQuery 查询付款结果 (1/2)

Youtube 频道:https://www.youtube.com/c/kaochenlong ...