Programming In Scala笔记-第十一章、Scala中的类继承关系
本章主要从整体层面了解Scala中的类层级关系。
一、Scala的类层级
在Java中Object
类是所有类的最终父类,其他所有类都直接或间接的继承了Object
类。在Scala中所有类的最终父类为Any
类,所以Any
类中的所有方法都可以在Scala中任意类中使用。但是这并不是说Scala中的Any
类就类似于Java中的Object
类,Scala中真正地位类似于Java中Object
类的是AnyRef
类。
在Scala中还提供了两个类Null
和Nothing
,这两个类在整个Scala类层级的最底层,其中Nothing
类是所有类的最终子类,Nothing
类直接或间接继承其他任何类。
1、整体类层级图
下图展示了Scala中的整体类层级图,其中Any
位于最顶端,Nothing
位于最底端。
2、Any类结构
这一节中我们看一下Any
类中定义了哪些方法。
从Scala API文档中可以看到,Any
类中提供==, !=, equals, ##, hashCode, toString, isInstanceOf[TO], asInstanceOf[TO]
共八个方法。其中==, !=, ##, asInstanceOf[TO], isInstanceOf[TO]
是final
类型的,不能在子类中使用override
关键字进行重写。在Scala中对于==
方法,如果判断对象为引用类型,调用该方法等同于调用该对象的equals
方法。
Any
类的两个直接子类是AnyVal
和AnyRef
,其中AnyVal
是Scala中的值类型,比如Double, Float
等的直接父类,注意这里Unit
类型也是AnyVal
类型的直接子类。而AnyRef
则是Scala中所有引用类型类的父类,类似于Java中的Object
类。
二、原始类型是如何实现的
对Java熟悉的话,应该会对int
类型和Integer
类型有一定的了解。在Scala中对Int
类型变量的处理也和Java中类似,Int
类型提供加或乘这样的简单操作,但如果需要调用toString
方法或者将Int
值赋给Any
类型变量时,Int
型变量会自动转化成Integer
类型。这个过程和Java中的自动装箱有些类似。
我们首先看一下下面这段Java代码
boolean isEqualInt(int x, int y) {
return x == y;
}
System.out.println(isEqual(421, 421));
boolean isEqualInteger(Integer x, Integer y) {
return x == y;
}
System.out.println(isEqualInteger(421, 421));
代码在IDEA中的运行结果如下
isEqualInt
方法接收到传入的两个整数后直接判断值是否相等,得到的结果为true
。但是isEqualInteger
方法接收到整型参数后,哪怕是值相等的整型参数,也会首先自动装箱成两个Integer
类型对象,并且两个Integer
对象是不同的对象,调用==
方法得到的结果为false
。
再看一段Scala中的代码,仍然定义两个函数、
def isEqualInt(x: Int, y: Int) = x == y
isEqualInt(421, 421)
def isEqualAny(x: Any, y: Any) = x == y
isEqualAny(421, 421)
运行结果如下,
由于在Scala中,引用类型调用==
方法等同于调用equals
方法,所以isEqualAny
方法的返回结果也是true
。
那么,如果在Scala中就是需要判断两个引用类型对象的引用是否相等,应该怎么办?在AnyRef
类中,Scala提供了eq
,ne
方法。
val x = new String("abc")
val y = new String("abc")
x == y
x eq y
x ne y
运行结果如下,
三、底层类型
这里主要讨论上面的类继承关系图中最底层的两个类scala.Null
和scala.Nothing
。Scala中可以使用者两个类统一的处理一些面向对象编程的边界情况。
1、Null类
比如说在Java中,null
值是没有对应的类型的,如果将某个变量赋值null
然后调用getClass
方法,会报一个NullPointerException
,如下图所示。
但是在Scala中null
值的类型为Null
。Null
类型所有引用类型类的子类,而不是值类型的子类。所以,不能将null
赋值给Int
类型变量。
val i: Int = null
执行结果如下,
2、Nothing类
Nothing
类位于Scala类继承关系中的最底层,是Scala中任何类的子类,包括上面的Null
类。
由于Nothing
类是任何类的子类,所以可以以如下形式来使用该类。
def error(message: String): Nothing =
throw new RuntimeException(message)
def divide(x: Int, y: Int): Int =
if (y != 0) x / y
else error("can't divide by zero")
在前面我们知道了,Scala中的执行语句都有一个返回结果类型,对于if
语句来说,返回类型为两个分支的公共父类,而这里if
分支的返回类型为Int
且Int
是else
的返回类型Nothing
的父类,所以divide
方法的最终返回类型仍然是Int
。
Programming In Scala笔记-第十一章、Scala中的类继承关系的更多相关文章
- Programming In Scala笔记-第十七章、Scala中的集合类型
本章主要介绍Scala中的集合类型,主要包括:Array, ListBuffer, Arraybuffer, Set, Map和Tuple. 一.序列 序列类型的对象中包含多个按顺序排列好的元素,可以 ...
- 《Linux内核设计与实现》第五周读书笔记——第十一章
<Linux内核设计与实现>第五周读书笔记——第十一章 20135301张忻 估算学习时间:共2.5小时 读书:2.0 代码:0 作业:0 博客:0.5 实际学习时间:共3.0小时 读书: ...
- Typescript 学习笔记四:回忆ES5 中的类
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Programming In Scala笔记-第七章、Scala中的控制结构
所谓的内建控制结构是指编程语言中可以使用的一些代码控制语法,如Scala中的if, while, for, try, match, 以及函数调用等.需要注意的是,Scala几乎所有的内建控制结构都会返 ...
- 《图解HTTP》阅读笔记--第十一章针对web的攻击技术
第十一章.针对WEB的攻击技术 ----<图解HTTP>阅读笔记攻击目标---Web简单的HTTP协议本身并不存在安全性 问题,协议本身并不会成为被攻击的对象,应用HTTP的服务器和客户端 ...
- [CSAPP笔记][第十一章网络编程]
第十一章 网络编程 我们需要理解基本的客户端-服务端编程模型,以及如何编写使用因特网提供的服务的客户端-服务端程序. 最后,我们将把所有这些概念结合起来,开发一个小的但功能齐全的Web服务器,能够为真 ...
- o'Reill的SVG精髓(第二版)学习笔记——第十一章
第十一章:滤镜 11.1滤镜的工作原理 当SVG阅读器程序处理一个图形对象时,它会将对象呈现在位图输出设备上:在某一时刻,阅读器程序会把对象的描述信息转换为一组对应的像素,然后呈现在输出设备上.例如我 ...
- C++ primer plus读书笔记——第14章 C++中的代码重用
第14章 C++中的代码重用 1. 使用公有继承时,类可以继承接口,可能还有实现(基类的纯虚函数提供接口,但不提供实现).获得接口是is-a关系的组成部分.而使用组合,类可以获得实现,但不能获得接口. ...
- Java程序设计基础笔记 • 【第7章 Java中的类和对象】
全部章节 >>>> 本章目录 7.1 理解类和对象 7.1.1 对象 7.1.2 抽象与类 7.1.3 类与对象的关系: 7.2 Java中的类和对象 7.2.1 类的定义 ...
随机推荐
- Windows使用Gitblit搭建Git服务器
安装之前需确定安装JAVA运行环境. 下载安装 首先到 Gitblit官网 下载安装包.此处使用的版本是1.8.0. 将解压得到的gitblit-1.8.0文件夹放于C:\gitServer目录下. ...
- JAVA循环结构示例
本文章主要是帮助大家学习循环结构.学习循环时,最重要的是理清思路,那些最经典算法实际中我们并不会单拿出来用,而是会用到当时做这个算法时的思想.如果把这个思路想明白了,那么实际中用到他的时候自然而然就想 ...
- javaIO操作之字节输出流--OutputStream
OutputStream /** * <li>输出单个字节:public abstract void write(int b) throws IOException ; * <li& ...
- [LeetCode] Replace Words 替换单词
In English, we have a concept called root, which can be followed by some other words to form another ...
- pyqt5 动画学习(二) 改变控件颜色
上一篇我们通过 self.anim = QPropertyAnimation(self.label, b"geometry")创建了一个动画,改变了空间的大小,这次我们来改变控件 ...
- [HAOI 2009]逆序对数列
Description 对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的 数列,可以很容易求出有多少个逆序对数.那么逆 ...
- [ZJOI2008]泡泡堂
题目描述 第XXXX届NOI期间,为了加强各省选手之间的交流,组委会决定组织一场省际电子竞技大赛,每一个省的代表队由n名选手组成,比赛的项目是老少咸宜的网络游戏泡泡堂.每一场比赛前,对阵双方的教练向组 ...
- [SCOI2009]windy数
题目描述 windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之间,包括A和B,总共有多少个windy数? 输入输出格式 输 ...
- bzoj 4870: [Shoi2017]组合数问题
Description Solution 考虑这个式子的组合意义: 从 \(n*k\) 个球中取若干个球,使得球的数量 \(\%k=r\) 的方案数 可以转化为 \(DP\) 模型,设 \(f[i][ ...
- LOJ #6041. 事情的相似度
Description 人的一生不仅要靠自我奋斗,还要考虑到历史的行程. 历史的行程可以抽象成一个 01 串,作为一个年纪比较大的人,你希望从历史的行程中获得一些姿势. 你发现在历史的不同时刻,不断的 ...